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;
  }

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