EN JP CN

PORTING.UNSIGNEDCHAR.RELOP

PORTING.UNSIGNEDCHAR.RELOP

符号付き/符号なし char と符号が指定されていない char 間の関係演算

PORTING チェッカーは、異なるコンパイラ内で特定の実装詳細に依存する可能性があるコードを識別します。PORTING.UNSIGNEDCHAR.RELOP チェッカーは、明示的な signed char または unsigned char と符号の指定のない文字との間で関係式が使用されている状況を検出します。

脆弱性とリスク

'char' データ型は C 標準規格では正確に定義されていないため、インスタンスが符号ありと見なされたり、見なされなかったりする場合があります。コンパイラによっては、コンパイラオプションを使用して 'char' の符号を切り替えることができます。ただし、開発者にとり、コードの移植時に問題が発生しないように常に明確なコードを記述することがベストプラクティスです。

軽減と防止

必ず、'char' 型に符号を付けるかどうかを指定してください。常に厳密に使用される typedef または #define を使用して定義することをお勧めします。

脆弱コード例


1   static unsigned char* reference = "Polisen förstärker i Malmö";

2   int foo(char* str)
3   {
4     unsigned char* rptr;

5       for( rptr = reference; *ptr && *str; str++, rptr++ )
6           if( *str != *rptr )
7               return 0;
8       return 1;
9   }

この例では、入力側の暗黙的に符号が指定された文字列が、参照側の明示的に符号が指定された文字列と比較され、その結果、未定義の動作が発生します。

修正コード例


1   #define BYTE unsigned char

2   static BYTE* reference = "Polisen förstärker i Malmö";

3   int foo(BYTE* str)
4   {
5     BYTE* rptr;

6       for( rptr = reference; *ptr && *str; str++, rptr++ )
7           if( *str != *rptr )
8               return 0;
9   }

修正例では、#define で指定した抽象型を使用すると、比較が正確であることを確認することができます。