EN JP CN

PORTING.UNSIGNEDCHAR.OVERFLOW.TRUE

PORTING.UNSIGNEDCHAR.OVERFLOW.TRUE

関係式が常に true になる場合があります

PORTING チェッカーは、異なるコンパイラ内で特定の実装詳細に依存する可能性があるコードを識別します。PORTING.UNSIGNEDCHAR.OVERFLOW.TRUE チェッカーは、'char' 型の符号によって、関係式が常に true になる可能性のある状況を検出します。

脆弱性とリスク

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

軽減と防止

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

脆弱コード例

/* print a string replacing any non-ASCII characters with ? */
1   void safe_print(char *s) {
2     for (; *s; s++) {
3       if (*s < 128) {    /* PORTING.UNSIGNEDCHAR.OVERFLOW.TRUE */
4         putchar(*s);
5       } else {
6         putchar('?');
7       }
8     }
9   }

10  int main() {
11    safe_print("na\xEFve\n"); /* "naïve" in Latin-1 character set */
12    return 0;
13  }

safe_print() は、unsigned char の場合にのみ正常に機能します。

修正コード例

/* print a string replacing any non-ASCII characters with ? */
1   void safe_print(unsigned char *s) {
2     for (; *s; s++) {
3       if (*s < 128) {    
4         putchar(*s);
5       } else {
6         putchar('?');
7       }
8     }
9   }

10  int main() {
11    safe_print("na\xEFve\n"); /* "naïve" in Latin-1 character set */
12    return 0;
13  }

修正例では、関数パラメーターの宣言で charunsigned char に変更しています。