文字の値が EOF に吸収
データ型変換によって、有効な文字値がファイル終端 (EOF) と同じになる
説明
この欠陥は、有効な文字値と EOF (ファイル終端) を区別できなくするデータ型変換が実行された場合に発生します。Bug Finder は、次のいずれかの状態で欠陥にフラグを立てます。
ファイル終端:
intからcharへの変換など、EOF ではない文字値をEOFに変換するデータ型変換を実行します。次に、結果を EOF と比較します。char ch = (char)getchar()
変換は明示的または暗黙的に行われる可能性があります。if((int)ch == EOF)
ワイド文字のファイル終端: WEOF ではないワイド文字値を WEOF に変換するデータ型変換を実行後、結果を WEOF と比較します。
リスク
char データ型は、ファイル終端を示す値 EOF を保持することができません。getchar などの関数には、EOF に対応するために、戻り値の int 型があります。int から char に変換すると、値 UCHAR_MAX (有効な文字値) と EOF はどちらも値 -1 に変換され、相互に区別できなくなります。この変換結果を EOF と比較すると、EOF の誤検知につながる可能性があります。この原理は、ワイド文字の値と WEOF にも当てはまります。
修正方法
EOF または WEOF との比較を変換前に実行します。
例
結果情報
| グループ: プログラミング |
| 言語: C | C++ |
| 既定値: 手書きコードはオン、生成コードはオフ |
コマンド ライン構文: CHAR_EOF_CONFUSED |
| 影響度: High |
バージョン履歴
R2017a で導入