|
Какой рейтинг вас больше интересует?
|
о, сколько нам открытий чудных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
Популярные за сутки
|
Загрузка...
взяты из открытых общедоступных источников и являются собственностью их авторов.
