string.c:strncasecmp() звонки __tolower
от include/linux/ctype.h который ожидает unsinged char
.
EDITed для добавления: В общем, вы всегда хотите передать 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 на самом деле выглядит идиот-доказательством в этом отношении, потому что он делает свой собственный safety-minded cast в #define __ismask(x) (_ctype[(int)(unsigned char)(x)])
. Я не уверен, когда комментарий «Да, Вирджиния» был добавлен относительно этой другой строки, но с текущей версией 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, но я не могу сказать вам больше прямо сейчас, что на первом месте и т. Д.
Если вы ищете «virginia» в дереве linux, «да, Вирджиния, что-то». Вероятно, это ссылка на какую-то старую тупость (_nerdy_ никак не в плохом смысле). – Shahbaz
Статья Википедии о http://en.wikipedia.org/wiki/Yes,_Virginia,_there_is_a_Santa_Claus (которую я связал в своем ответе) упоминает этот «занудный» аспект. Одно из ссылок, на которое ссылается, как иллюстрация социального явления (meme), - это http://vrt-blog.snort.org/2010/07/yes-virginia-there-is-cyberwar.html. – Fizz
О, я пропустил это, хорошая находка! – Shahbaz