在linux源代码版本3.18(和之前的版本)中,在string.c文件中,在函数strncasecmp中,首先是:
/* Yes, Virginia, it had better be unsigned */
unsigned char c1, c2;
从这里可以看出:http://lxr.free-electrons.com/source/lib/string.c
这是什么意思?
答案 0 :(得分:4)
string.c:strncasecmp()来自include/linux/ctype.h的__tolower
来电unsinged char
。
编辑添加:通常,您总是希望将unsigned char
传递给ctype.h函数because of C Standard §7.4, which says the behavior is undefined if the argument to ctype.h functions is not representable as unsigned char
or EOF
.这样可能会解释"Yes, Virginia"位。
更为神秘的是,include/linux/ctype.h在这方面实际上看起来像白痴一样,因为它在#define __ismask(x) (_ctype[(int)(unsigned char)(x)])
中有自己的safety-minded cast。我不确定"是,弗吉尼亚"相对于此其他行添加了评论,但使用当前版本的include/linux/ctype.h
,即使string.c:strncasecmp()
char
和c1
,c2
也能正常工作。我还没有真正尝试过改变&尽管如此测试......
如果你回到Linux 2.0.40's ctype.h,安全意识的演员阵容((int)(unsigned char)
)就不再存在了。没有"弗吉尼亚"在2.0.40's string.c中发表评论,但其中甚至没有strncasecmp
。看起来这两个变化都是在Linux 2.0和2.2之间的某个地方进行的,但是现在我不能告诉你更多的事情,等等。