2010-02-12 2 views
4

Я был недавно на The Daily WTF, когда я наткнулся на этот старый post. В ней автор отмечает, что один из программистов изменил этот код:Не удалось найти ошибку

int main (int argc, char **argv) 
{ 
    int x; 
    char data_string[15]; 
    ... 
    x = 2; 
    strcpy(data_string,"data data data"); 
    ... 
} 

К этому коду:

int main (int argc, char **argv) 
{ 
    int x = 2; 
    char data_string[15] = "data data data"; 
    ... 
} 

Автор продолжает упоминать:

[кодер] изменен каждая отдельная переменная, которая должна быть инициирована в стеке

Для жизни меня я Не вижу, как это изменение может быть вредным, и я беспокоюсь, что это провал в моем знании C. Что такое WTF?

+0

DailyWTF полностью подпрыгнул от акулы, когда Алекс перешел от кусков кода размера укуса и почувствовал необходимость писать целую статью каждый раз. –

+1

, если вы посмотрите комментарии в WTF, вы увидите, что никто не мог увидеть проблему. – pm100

+1

Когда вы видите, что 1000+ файлов были изменены, просто для этого, без значимого комментария к контролю источника, он становится WTF в моей книге. –

ответ

3

Я не думаю, что инициализация стека была проблемой. Предполагалось, что он ищет труднодоступную утечку памяти, но он решил вместо этого изменить инициализацию на тысячах C-файлов.

Хотя, как mentioned on wikipedia, «неинициализированные переменные [являются] частой причиной ошибок». Вы исключаете возможность использования неинициализированных переменных, если позаботиться об этом при объявлении. Но сделать это преобразование в несколько тысяч файлов, вероятно, было не самым эффективным способом поиска и решения реальной проблемы.

+0

На самом деле я думал, что это должно было предотвратить - использование указателя, которое может быть как (или в зависимости от среды/ОС) более коварным.Кроме того, инициализация стека помогает с оптимизацией компилятора, делая код потенциально быстрее. В зависимости от сложности промежуточного кода назначение x-2 может не выполняться при распределении в первом примере, где, как вы почти уверены, что это будет во втором примере/измененном коде. –

+1

Бывает, иногда вы просто поднимаете руки и исправляете все, что _might_ будет проблемой. –

0

Я думаю, что новый код лучше. Только я пошел бы

char data_string[] = "data data data"; 
0

Единственным способом это хуже то, что это возможно, что старый код не инициализируется (или используется) значения в некоторых путях коды.

Другая проблема заключается в

char data_string[99] = "data data data"; 

инициализирует 99 символов, а не только первый 15, что делает этот

char data_strings[99] = ""; 

намного дороже, чем это

char data_strings[99]; 
data_strings[0] = 0; 

Конечно, если буфер действительно должен быть достаточно большим, чтобы хранить «данные данных данных», то это лучше

char data_string[] = "data data data"; 

Но что заставляет вас задаться вопросом, был ли он когда-либо необходимо, чтобы скопировать строку в переменную стека на всех.

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