Какой рейтинг вас больше интересует?
|
о, сколько нам открытий чудных2011-07-05 01:33:09 (читать в оригинале)Нашёл нынче совершенно случайно багу в нашем коммерческом продукте. Офигел слегка. Бага заключается в следующем: утилита, если ей задать один параметр и не задать другой (второй к первому обязателен, а я не знал) ругается (что параметра нет) и внезапно молча удаляет конфигурационный файл. После чего все эта утилита работать не хочет, потому что конфигурационного файла нет, а значит, ничего нет. Я как-то не сразу понял, в чём дело, но потом разобрался, как именно это воспроизвести и даже почему это так происходит (для коллег -- PCLIN-29569). Код примерно вот такой: int SomeFunction(int id, int cmd) ... char dumpfile[4096]; ... if (gparam->dumpfile == NULL) { if (cmd == CMD_DUMP) { logger(-1, 0, "Dump file is not specified."); goto child_err; } ... // где-то тут мы заносим имя файла в dumpfile, но до этого места мы не доходим. ... child_err: if (cmd == CMD_CHKPNT || cmd == CMD_DUMP) unlink(gparam->dumpfile ? : dumpfile); Похоже, что dumpfile выделяется на стеке, и в этом же самом месте памяти раньше лежало имя файла, который мы и удаляем. И компилятор, конечно, не может поругаться на неинициализированную переменную -- мало ли куда какой поинтер передают... На закуску любителям языка Си -- угадайте, что напечатает этот код (ну или так -- что он может напечатать, согласно стандарту и на практике):#include <stdio.h> void a(void) { char str[32]; sprintf(str, "My father was a sailor"); } void b(void) { char str[16]; puts(str); } int main(void) { a(); b(); return 0; }Ответ чёрным по чёрному (выделите мышкой, чтобы увидеть): Всё что угодно может напечатать; у меня с gcc-4.5.1 -O0 он печатает слово sailor :)
|
Категория «Мобильная техника»
Взлеты Топ 5
Падения Топ 5
Популярные за сутки
|
Загрузка...
взяты из открытых общедоступных источников и являются собственностью их авторов.