EN JP CN

PORTING.CMPSPEC.TYPE.BOOL

PORTING.CMPSPEC.TYPE.BOOL

bool 型への割り当てが 1 バイトより大きくなっています

PORTING チェッカーは、異なるコンパイラ内で特定の実装詳細に依存する可能性があるコードを識別します。PORTING.CMPSPEC.TYPE.BOOL チェッカーは、ブールデータ型への割り当てが 1 バイトより大きい状況を検出します。

脆弱性とリスク

ブールデータ型 (bool) は、値 1 (True) または 0 (False) を保持するデータ型ですが、ANSI 型付けルールを強制的に適用できます。これにより、ブールデータ型が非常に柔軟になり、整数型として扱うこともできるようになります。ただし、これにより、柔軟度が異なるコンパイラ間で移植する場合に問題が発生するため、このチェッカーは、任意のブールデータ型に 1 バイトの割り当て上限を適用します。

軽減と防止

ブールデータ型と他の整数型データを入れ替えないでください。C++ 規格は、それぞれ整数値 1 と0 を表す、ブール値キーワード "true" および "false" を定義します。また、多くのコンパイラでは、TRUE および FALSE マクロや適切なプレースホルダーが定義されていますが、独自の値を定義することもできます。

脆弱コード例


1   void foo()
2   {
3     bool b;

4       b = 0x100;
5   }

コンパイラによっては、ブール変数に True 値が割り当てられ、単純に '1' が格納されているものとして扱われたり (整数型がブール型に切り捨てられたことが警告されます)、単純な ANSI 型付けルールに従い、指定された 0x100 値が格納されたりします。このような互換性の欠落は、データ転送または永続ストレージ中に移植問題の原因になります。

修正コード例


1   #define MY_TRUE  0x01
2   #define MY_FALSE 0x00

3   void foo()
4   {
5     bool b;

6       b = MY_TRUE;
7       b = 1;
8       b = true;
9   }

修正例のコードでは、ブール値 True または False について独自の値を定義できるので、コードを問題なく移植できます。