メインコンテンツ

Typedef が一致しません

typedef ステートメント間の不一致

説明

このチェッカーは、既定の Polyspace® as You Code 解析では非アクティブにされますPolyspace as You Code 解析で非アクティブにされるチェッカー (Polyspace Access)を参照してください

この欠陥は、typedef ステートメントが以下のいずれかのデータ型の潜在型と競合する可能性がある場合に発生します。

  • size_t

  • ssize_t

  • wchar_t

  • ptrdiff_t

リスク

size_tssize_twchar_t または ptrdiff_t の潜在型を変更する場合、同じ型の定義との一貫性が損なわれます。インクルード パスが異なるコンパイル ユニットでは、異なるサイズの型を使用する可能性があり、プログラムで競合が発生する原因となる可能性があります。

たとえば、size_t を符号なし long 型として再定義する関数を 1 つのコンパイル ユニットで定義するとします。しかし、<stddef.h>size_t 定義を使用する別のコンパイル ユニットで、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 によって file2.csize_t の定義に欠陥のフラグが付けられます。プロジェクトの別のファイル file1.c に、size_t を符号なし long 型と定義する stddef.h が含まれるため、この定義では、typedef が一致しません。

修正 - システム定義を使用

考えられる 1 つの修正方法として、stddef.hsize_t のシステム定義を使用して型定義の競合を回避します。

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 ... */
}
修正 — 共有ヘッダー ファイルを使用

考えられる 1 つの修正方法として、共有ヘッダー ファイルを使用して、両方のファイルでインクルードする型定義を保存します。

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
影響度: High

バージョン履歴

R2016b で導入