exponenta event banner

CERT C: INT36-C правил

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

Описание

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

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

Внедрение Polyspace

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

Примеры

развернуть все

Проблема

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

Риск

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

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

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

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

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

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

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

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

По возможности избегайте преобразования указателя в целое число или целого числа в указатель. Если требуется преобразовать 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);
}

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

Группа: Правило 04. Целые числа (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 Университет Карнеги-Меллон, со специальным разрешением от его Института программного обеспечения.

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

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