2015-01-21 7 views
3

В исходном линукс код версии 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

Что это означает?

ответ

4

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, но я не могу сказать вам больше прямо сейчас, что на первом месте и т. Д.

+1

Если вы ищете «virginia» в дереве linux, «да, Вирджиния, что-то». Вероятно, это ссылка на какую-то старую тупость (_nerdy_ никак не в плохом смысле). – Shahbaz

+0

Статья Википедии о 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

+0

О, я пропустил это, хорошая находка! – Shahbaz

 Смежные вопросы

  • Нет связанных вопросов^_^