fgetc() は unsigned char キャストを int に返し、EOF を ... EOF に返します。構成ファイルを char 配列に読み込もうとしていて、実装の char が署名されている場合はどうなりますか? C99 の標準では、表現できない値を符号付き変数に代入するように結果が実装定義されているだけでなく、代わりに実装が代わりにシグナルを発生させることを選択できると述べています。
6.3.1.3 符号付きおよび符号なし整数
整数型の値が _Bool 以外の別の整数型に変換される場合、その値が新しい型で表現できる場合、その値は変更されません。
それ以外の場合、新しい型が符号なしの場合は、値が新しい型の範囲内になるまで、新しい型で表現できる最大値よりも 1 多い値を繰り返し加算または減算して、値を変換します 49)。
それ以外の場合、新しい型は署名され、値を表現できません。結果が実装定義であるか、実装定義のシグナルが発生します。
このような構成は非常に一般的です。
int c, i = 0;
char arr[1024];
for (; (c = getc(Descriptor)) != EOF && i < sizeof arr - 1; ++i)
{
arr[i] = (char)c;
}
arr[i] = '\0';
char が符号付きで、c の値が表現できる値よりも大きい場合にキャストを実行することも実装定義です。
何千人ものプログラマーが何年にもわたって見逃してきた問題を、特に上記の構造が遍在していることから、私が発見した可能性は非常に低いと思います。
一部のバイトが signed char に収まらない値を持つ可能性があるため、この方法で読み取られた非テキスト コードが問題を引き起こす可能性があるようです。私は、実際にこの用途に対処する上記の構成の修正版を見たことがありません。
C 標準に関連する欠陥を実際に見つけたことがありますか、それとも他の何千人ものプログラマーがエラー チェックで実装していない、または実装に失敗したことに気づいたことがありますか?