Несоответствие определения типа

Не сочетайтесь между операторами typedef

Описание

Несоответствие определения типа обнаруживает операторы 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

typedef unsigned char size_t;

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

file2.c

#include <stddef.h>

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

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

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

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

file1.c

#include <stddef.h>

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

file2.c

#include <stddef.h>

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

Исправление — использование разделяемый заголовочный файл

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

types.h

typedef unsigned char size_t;

file1.c

#include "types.h"

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

file2.c

#include "types.h"

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

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

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

Введенный в R2017b