Невозможно найти ошибку - PullRequest
       5

Невозможно найти ошибку

4 голосов
/ 12 февраля 2010

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

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?

Ответы [ 3 ]

3 голосов
/ 12 февраля 2010

Не думаю, что проблема была в инициализации стека. Он должен был искать трудно обнаруживаемую утечку памяти, но решил вместо этого внести изменения в инициализацию для тысяч файлов C.

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

0 голосов
/ 12 февраля 2010

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

Другая проблема это

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";

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

0 голосов
/ 12 февраля 2010

я думаю, что новый код лучше. Если бы я не пошел

  char data_string[] = "data data data";
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...