Какая самая глупая ошибка, которую вы не могли найти в течение длительного времени?

Я работал над проектом, который сделал с ошибкой, по каким-то причинам исключение не было выбрано, даже если оно должно было быть. В глубине я нашел такую ​​обработку ошибок:

try {
 m.invoke(parentObject, paramObj);
} catch (IllegalArgumentException e) {
 new CaseLibException(e);
} catch (IllegalAccessException e) {
 new CaseLibException(e);
} catch (InvocationTargetException e) {
 new CaseLibException(e);
}

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

Какова ваша самая глупая ошибка, которую вы не могли найти?

23 ответа

Я исправил ошибку, когда приложение разбилось каждый день в 6:12 вечера.

Оказалось, что кто-то сохранил количество секунд с начала дня в 16-битном int.


В C/С++ (который я узнал недавно)

if (x = 0) {
...
}


Как только я написал функцию для синтаксического анализа строки даты в другой формат. В нем у меня был оператор switch/case, который анализирует значения месяца, он выглядел так:

case month of:
 01: return "Jan"; break;
 02: return "Feb"; break;
 ... etc ...
 09: return "Sep"; break;
 11: return "Nov"; break;
 12: return "Dec"; break;
end;

По какой-то причине я ушел из октября...


for i = 0 to ( list.Length - 1 ) do
 begin
 DoSomething( 1 );
 end;

Попробуйте найти это на громоздком мониторе с крошечным шрифтом в 3 часа!;)


I=1

Эта единственная строка Fortran просто не работала.

После нескольких часов бесплодной отладки я проглотил свою гордость и попросил приятеля пройти через код со мной.

Придя к этой строке, я сказал: "Теперь мы увеличиваем индекс".

"А?" говорит он.

Что, когда я понял, что читаю свои намерения:

I=I+1

вместо того, что я написал.

Помните, что в следующий раз вы застряли и не можете понять, что неправильно.

Не позволяйте вашей гордости удерживать вас от вербовки второй пары глаз.


На самом деле не инициализация некоторой переменной стека рядом с началом main. Вещь автоматически обнуляется, ну почти всегда.


Когда я был гораздо менее опытным с фигурным языком, я как-то писал что-то вроде:

if (expr);
 stmt;

Это было во встроенной системе, поэтому мой отладчик и printf были бессильны. Звук просто звучал плохо. Я поставил его на низкую производительность и провел день или около того, оптимизируя его. Задняя часть расчета конверта показала бы, что производительность не является проблемой.

С этого дня я всегда вставляю свои фигурные скобки. Это заставляет меня писать на Python, если это не для остальных языков.


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

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

Оказалось, что переход на летнее время начался, и мой код не справился с этим.


Давным-давно в моей средней школе CS дней я реализовал двоичное дерево в (я думаю) Turbo Pascal. Одна из операций не совсем правильно обрабатывала указатели и заканчивала переписывание частей сегмента кода (ах, радости программирования DOS). Во всяком случае, это всегда приводило к перезаписи всего кода отладки, который я вводил, делая заявления IF кажущимися ложными, печатные заявления не случались и т.п., Но все чудесным образом без сбоев и делали это практически невозможным, чтобы сказать, что происходит.

В конце концов я провел его через отладчик на уровне сборки и поймал проблему, когда инструкции начали меняться в середине функции...


Большинство моих глупых ошибок не были настоящими ошибками. У них были плохие данные и мои предположения относительно этих данных.

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


Не мой худший, но недавний пример трального оператора зла:

Некоторое время я был в тупике, почему columnCSV всегда был пуст:

foreach(Column column in Table.Columns)
{
 columnsCSV += string.IsNullOrEmpty(columnsCSV) ? "" : "," + column.Name;
}

Должно быть

foreach(Column column in Table.Columns)
{
 columnsCSV += (string.IsNullOrEmpty(columnsCSV) ? "" : ",") + column.Name;
}

P.S. Пожалуйста, игнорируйте "недостаток StringBuilder".


Как это для ошибки, которая заставит вас сходить с ума, пытаясь выяснить, что происходит:

#if CONFIG_SETTING == 1
#define SOME_MACRO( x) doSomething( x);
#else
#define SOME_MAcRO( x) // don't do it in retail
#endif
void foo( int a, int b) 
{
 if (a < b) SOME_MACRO( a);
 alwaysCallThisFcn();
 // ...
}

Итак, если CONFIG_SETTING равно 1, foo() скомпилируется как:

void foo( int a, int b) 
{
 if (a < b) doSomething( a);; // note: the second 
 // semi-colon has no effect
 alwaysCallThisFcn();
 // ...
}

В противном случае он скомпилирован как:

void foo( int a, int b) 
{
 if (a < b)
 alwaysCallThisFcn(); // now alwaysCallThisFcn() is 
 // called conditionally
 // ...
}


Это не моя ошибка, но я присутствовал для нее. Мы с женой вместе взяли класс джава, когда мы учились в колледже. Она в антропологии, и я в финансах, но почему-то мы оказались в джаве. Мне понравилось.

Она провела целый вечер, пытаясь сделать "проклятую программу", нарисовать глупый $% ^ & * (дом на экране) и просто не могла. Упрямая, она сопротивлялась любой моей помощи до ее последнего момента отчаяние (2, 3 am?). Я быстро взглянул и заметил, что она использовала "O" (буква o) вместо "0" (ноль) повсюду.

Она вышла из класса на следующий день.

Лично у меня есть несколько глупых ошибок, которые могут быть общими. Мои фавориты:

знак доллара + имя_функции используя тот же самый итератор ($ i) вместо уже цикла цикла я ierate цикла случайное "", которое произошло SOMEWHERE, потому что моя рука поскользнулась


Однажды, когда я занимался математикой, связанной с домашними заданиями, мне потребовалось пару часов, чтобы понять, что у меня есть + где-то, где мне нужно *.


Также, как мы можем забыть ошибки, введенные злом COPY AND PASTE!!


Я писал парсер, используя flex/bison. Особенностью была постоянная оптимизация сгиба, т.е. Замена 20 + 2 на 22, однако мой парсер заменил его на 4.

В качестве части лексера у меня была таблица символов. Я использовал линейный поиск с помощью strncpy для поиска существующих записей. Однако для параметра длины в strncpy я использовал strlen в строке в таблице символов. Не умная идея, потому что, если запись в таблице символов меньше, то добавленная она будет неправильно совпадать. Например, добавление "20" будет соответствовать "2", потому что сравнивается только первый символ. Поэтому, когда мой парсер поднял символ "20", он получил "2". Я взял часы, чтобы понять, почему мои 20 лет меняются на 2 с.


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


В старые времена, когда у нас был код на карточках, я работал три дня, пытаясь понять, почему мои партийные задания не работают. Я, наконец, дошел до сообщений PRINT о каждых трех строках, и я не видел ЛЮБОГО из них.

Затем я понял, что произошла ошибка JCL, которая заставляла мою программу загружаться в соответствующий набор данных (думаю, "не попадал в путь" ), поэтому я снова и снова запускал одно и то же старое изображение, вместо недавно скомпилированного.


Самая глупая ошибка:

if(a=!0)

вместо:

if(a!=0)

Мне потребовалось 4 часа, чтобы определить проблему, поскольку компилятор просто сходил с ума! Я чуть не умер, когда я это выяснил!


Почему, я никогда не производил ошибку в своей жизни!


Я не могу сказать вам конкретную ошибку, с которой я столкнулся, но могу сказать, что вы задействовали хотя бы одно из следующего:

  • Предполагается, что что-то работает
  • Предположение о правильности данных
  • Опечатка
  • A = вместо ==
  • Что-то, что мне нужно было бы реорганизовать

Собственно, список причин всех моих ошибок;)


} и иногда)


Это одна из моих ранних глупых ошибок.

У нас есть существующий проект для работы, где есть WebMethod, написанный на С#

switch (option) {
case "one" :
 //ToDos
 break;
case "two" :
 //ToDos
 break;
case "three" :
 //ToDos
 break;
}

В то время как из clientCode (через ajax) мы получили следующее как option

One
Two
Three

Я не мог понять, где проблема, через 30-40 минут.

Я исправил его как

switch (option.ToLower()) {

licensed under cc by-sa 3.0 with attribution.