exponenta event banner

Несоответствие Typedef

Несоответствие между typedef заявления

Описание

Эта проверка деактивируется в анализе Polyspace ® по умолчанию в качестве кода. См. раздел Шашки, деактивированные в Polyspace как анализ кода по умолчанию (Polyspace Bug Finder Access).

Этот дефект возникает, когда typedef операторы приводят к конфликтованию базовых типов для одного из следующих типов данных:

  • size_t

  • ssize_t

  • wchar_t

  • ptrdiff_t

Риск

При изменении базового типа size_t, ssize_t, wchar_t, или ptrdiff_t, имеются противоречивые определения одного и того же типа. Модули компиляции с различными путями включения могут потенциально использовать типы разного размера, вызывающие конфликты в программе.

Например, укажите функцию в одном модуле компиляции, которая переопределяет size_t как беззнаковый длинный. Но в другом модуле компиляции, который использует size_t определение из <stddef.h>, вы используете ту же функцию, что и extern объявление. Программа столкнется с несоответствием между объявлением функции и определением функции.

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

Использовать непротиворечивые определения типов. Например:

  • Удалите пользовательские определения типов для этих фундаментальных типов. Используйте только определения системы.

  • Используйте одинаковый размер для всех единиц компиляции. Переместите свой typedef в общий заголовочный файл.

Примеры

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

file1.c:

#include <stddef.h>

void func1()
{
    size_t var = 0;
    /*... more code ... */
}

file2.c:

typedef unsigned char size_t;

void func2()
{
    size_t var = 0;
    /*... more code ... */
}

В этом примере Polyspace помечает определение size_t в file2.c как дефект. Это определение является typedef несоответствие, потому что другой файл в проекте, file1.c, включая stddef.h, которая определяет size_t как беззнаковый длинный.

Исправление - использование определения системы

Одной из возможных корректировок является использование системного определения size_t в stddef.h во избежание конфликтов определений типов.

file1.c:

#include <stddef.h>

void func1()
{
    size_t var = 0;
    /*... more code ... */
}

file2.c:

#include <stddef.h>

void func2()
{
    size_t var = 0;
    /*... more code ... */
}
Исправление - использовать общий файл заголовка

Одним из возможных исправлений является использование файла с общим заголовком для хранения определения типа, которое включается в оба файла.

types.h:

typedef unsigned char size_t;

file1.c:

#include "types.h"

void func1()
{
    size_t var = 0;
    /*... more code ... */
}

file2.c:

#include "types.h"

void func2()
{
    size_t var = 0;
    /*... more code ... */
}

Информация о результатах

Группа: Программирование
Язык: C | C++
По умолчанию: Вкл.
Синтаксис командной строки: TYPEDEF_MISMATCH
Воздействие: Высокое
Представлен в R2016b