我是疯了还是我发现了C的设计问题?

时间:2014-01-14 23:26:00

标签: c undefined signed fgetc

好的,所以fgetc()返回一个unsigned char转换为int,EOF返回... EOF。如果您尝试将配置文件读入char数组,并且您的实现的char已签名,该怎么办? C99的标准表明,不仅结果实现被定义为为已签名变量分配不可表示的值,而且实现可以选择提升信号!

  

6.3.1.3有符号和无符号整数

     

当整数类型的值转换为_Bool以外的另一个整数类型时,如果该值可以用新类型表示,则它将保持不变。

     

否则,如果新类型是无符号的,则通过重复加或减一个可以在新类型中表示的最大值来转换该值,直到该值在新类型的范围内。 / p>      

否则,新类型已签名且值无法在其中表示;结果是实现定义的,或者引发实现定义的信号。

这样的构造很常见:

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中的值高于可以表示的值,那么它也是实现定义来执行强制转换。

我发现我发现数千名程序员多年来错过的问题极不可能,尤其是上面构造无处不在。

似乎通过这种方式读取的非文本代码有可能导致问题,因为某些字节可能具有不适合签名字符的值。 我从未见过上述构造的修改版本,它实际上解决了这个问题。

我是否真的发现了与C标准有关的缺陷,或者注意到成千上万其他程序员没有在错误检查中实现的错误?

0 个答案:

没有答案