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 ? */
void safe_print(char *s) {
for (; *s; s++) {
if (*s < 128) { /* PORTING.UNSIGNEDCHAR.OVERFLOW.TRUE */
putchar(*s);
} else {
putchar('?');
}
}
}
int main() {
safe_print("na\xEFve\n"); /* "naïve" in Latin-1 character set */
return 0;
}
safe_print() は、unsigned char の場合にのみ正常に機能します。
修正コード例
コピー
/* print a string replacing any non-ASCII characters with ? */
void safe_print(unsigned char *s) {
for (; *s; s++) {
if (*s < 128) {
putchar(*s);
} else {
putchar('?');
}
}
}
int main() {
safe_print("na\xEFve\n"); /* "naïve" in Latin-1 character set */
return 0;
}
修正例では、関数パラメーターの宣言で char を unsigned char に変更しています。