CERT C++: INT36-C

Преобразование указателя в целое число или целого числа в указатель

Описание

Определение правила

Преобразование указателя в целое число или целого числа в указатель.[1]

Реализация Polyspace

Эта проверка проверяет небезопасное преобразование между указателем и целым числом.

Примеры

расширить все

Проблема

Небезопасное преобразование между проверками указателя и целым числом для преобразования указателя в целое число и целого числа в указатели. Если вы преобразуете между указателем мыши, intptr_t, или uintprt_t и целый тип, такой как enum, ptrdiff_t, или pid_tPolyspace повышает дефект, если размер указателей и целых типов различен в вашем окружении. Для образца, в i386 окружение, оба указателя и целые типы имеют размер 32 бита. В этом окружении Polyspace не помечает преобразование между указателем и целым числом того же размера. Но в x86_64 окружение, в которой указатели равны 64 битам, а беззнаковые целые числа равны 32 битам, Polyspace® преобразование флагов между указателями и целыми числами разных размеров.

Риск

Отображение между указателями и целыми числами не всегда согласуется со структурой адресации окружения.

Преобразование из указателей в целые числа может создать:

  • Усеченные или выходящие за пределы области значений целочисленные значения.

  • Недопустимые целые типы.

Преобразование из целых чисел в указатели может создать:

  • Несогласованные указатели или несогласованные объекты.

  • Недопустимые адреса указателей.

Зафиксировать

По возможности избегайте преобразования указателя на целое число или целого числа на указатель. Если вы хотите преобразовать void указатель на целое число, чтобы вы не изменили значение, используйте типы:

  • C99 — intptr_t или uintptr_t

  • C90 — size_t или ssize_t

Пример - Преобразование целого числа в указатель
unsigned int *badintptrcast(void)
{
    unsigned int *ptr0 = (unsigned int *)0xdeadbeef;
    char *ptr1 = (char *)0xdeadbeef;
    return (unsigned int *)(ptr0 - (unsigned int *)ptr1);
}

В этом примере существует три преобразования, два небезопасных преобразования и одно безопасное преобразование. Первое преобразование 0xdeadbeef на unsigned int* вызывает проблемы выравнивания для указателя мыши. Второе преобразование 0xdeadbeef на char * безопасно, потому что нет проблем выравнивания для char. Третье преобразование в возврат приводит ptrdiff_t на указатель. Этот указатель может указывать или не указывать на недопустимый адрес.

Коррекция - Использование intptr_t

Одной из возможных коррекций является использование intptr_t типы для хранения адреса указателя 0xdeadbeef. Также можно изменить второй указатель на целое число смещения чтобы больше не было преобразования из ptrdiff_t на указатель.

#include <stdint.h>

unsigned int *badintptrcast(void)
{
    intptr_t iptr0 = (intptr_t)0xdeadbeef;
    int offset = 0;
    return (unsigned int *)(iptr0 - offset);
}

Проверяйте информацию

Группа: 03. Целые числа (INT)
Введенный в R2019a

[1] Это программное обеспечение было создано MathWorks, включающее фрагменты: «Сайт SEI CERT-C», © 2017 Университет Карнеги Меллон, Веб-сайт SEI CERT-C + + © 2017 Университет Карнеги Меллон, "Стандарт кодирования SEI CERT C - Правила разработки безопасных, Надежные и безопасные системы - 2016 Edition ", © 2016 Университет Карнеги Меллон, и "Стандарт кодирования SEI CERT C++ - Правила разработки безопасных, Надежные и безопасные системы в C++ - 2016 Edition "© 2016 Университет Карнеги Меллон, с специального разрешения от его Института программной инженерии.

ЛЮБОЙ МАТЕРИАЛ УНИВЕРСИТЕТА КАРНЕГИ МЕЛЛОН И/ИЛИ ЕГО ИНЖЕНЕРНОГО ИНСТИТУТА ПРОГРАММНОГО ОБЕСПЕЧЕНИЯ, СОДЕРЖАЩИЙСЯ В НАСТОЯЩЕМ ДОКУМЕНТЕ, ПОСТАВЛЯЕТСЯ НА БАЗИСЕ «КАК ЕСТЬ». УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ, ВЫРАЖЕННЫХ ИЛИ ПОДРАЗУМЕВАЕМЫХ, В ОТНОШЕНИИ ЛЮБОГО ВОПРОСА, ВКЛЮЧАЯ, НО НЕ ОГРАНИЧИВАЯСЬ, ГАРАНТИЮ ПРИГОДНОСТИ ДЛЯ ЦЕЛЕЙ ИЛИ КОММЕРЧЕСКОЙ ВЫГОДЫ, ИСКЛЮЧИТЕЛЬНОСТИ, ИЛИ УНИВЕРСИТЕТ КАРНЕГИ МЕЛЛОН НЕ ДАЕТ НИКАКИХ ГАРАНТИЙ В ОТНОШЕНИИ СВОБОДЫ ОТ ПАТЕНТА, ТОВАРНОГО ЗНАКА ИЛИ НАРУШЕНИЯ АВТОРСКИХ ПРАВ.

Это программное обеспечение и связанная с ним документация не были рассмотрены и не одобрены Университетом Карнеги-Меллон или его Институтом программной инженерии.