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

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

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

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

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

Библиотека для работы с мороженым
Библиотека для работы с мороженым
Лично я попрощался с операторами print() в python. Без шуток.
7
0
1 864
23
Перейти к ответу Данный вопрос помечен как решенный

Ответы 23

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

... и программа вылетела бы, если бы этого не произошло? :)

pyon 22.12.2008 01:41

Нет, просто неправильно рассчитать. Значение никогда не использовалось в качестве индекса.

Joshua 22.12.2008 23:05

У меня была точно такая же проблема ... мог быть поклялся, это, должно быть, ошибка компилятора или космические лучи :) Через несколько часов реальность воцарилась, и я не мог перестать пинать себя ...

reuben 25.12.2008 22:36

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

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

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

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

if (x = 0) {
...
}

простой способ предотвратить это - написать наоборот: if (0 == x). Если вы забыли второй = код не компилируется.

Georg Schölly 22.12.2008 02:08

Или используйте компилятор с приличными предупреждениями.

Tom Hawtin - tackline 22.12.2008 02:12

@gs: Да, я впервые увидел это здесь. Хотя при переключении с C++ на C# иногда болит голова ...

Ed S. 22.12.2008 03:55

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

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

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

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

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

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

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

На следующий день она ушла из класса.

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

знак доллара + имя_функции используя ту же итерацию ($ i) вместо уже зацикленного цикла $ i iterate случайное "" ", которое произошло ГДЕ-ТО, потому что моя рука соскользнула

Ответ принят как подходящий

Однажды я исправил ошибку, когда приложение вылетало каждый день в 18:12.

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

лол, +1. Кстати, вы имели в виду 18:12?

Federico A. Ramponi 22.12.2008 02:52

Да. Я сделал! Ошибка была обнаружена 21 год назад, и код был написан на MS-Pascal, поэтому моя память уже не та, что была раньше.

Fortyrunner 22.12.2008 11:15

16-битное беззнаковый int: P

Fernando Espinosa 24.09.2012 23:11

Действительно. Это было 25 лет назад ...

Fortyrunner 25.09.2012 01:50

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

if (expr);
    stmt;

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

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

Извините, но фигурные скобки здесь не помогут: по крайней мере, в некоторых компиляторах if (expr); {stmt; } 'компилируется.

Joshua 22.12.2008 23:07
); {, очевидно, является ошибкой; ); нет. Если вы дадите скобе отдельную линию, это сделает ее немного менее четкой.
Tom Hawtin - tackline 23.12.2008 17:41

Что у вас никогда не было оправдания для использования произвольной внутренней области видимости?

Joshua 08.07.2010 23:04

Да ведь я ни разу в жизни не создавал ошибок!

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

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

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

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

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

Однажды я написал функцию для преобразования строки даты и времени в другой формат. В нем у меня был оператор 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;

Я почему-то пропустил октябрь ...

и никакого значения по умолчанию ... у вас всегда должно быть значение по умолчанию!

Bobby Cannon 22.12.2008 03:46

Может быть, по умолчанию должен был быть «Октябрь»!

Athena 22.12.2008 04:38

Кроме того, как мы можем забыть ошибки, внесенные злом СКОПИРОВАТЬ И ВСТАВИТЬ !!

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

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

Еще бывает: long something = 2l: это 2л или двадцать один?

Adrian Pronk 04.02.2009 23:19

Сегодня утром я починил одну из них!

dotancohen 23.02.2014 20:32

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

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

На какое-то время я озадачился, почему 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».

} и иногда )

Раньше, когда у нас был код на карточках, я работал три дня, пытаясь понять, почему мои пакетные задания не работали. Я наконец дошел до ПЕЧАТИ утверждений о каждых трех строках, и я не видел НИКАКОЙ из них.

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

JCL - теперь это взрыв из прошлого.

Michael Burr 22.12.2008 06:04
  I=1

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

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

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

"Хм?" говорит он.

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

 I=I+1

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

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

Не позволяйте своей гордости помешать вам привлечь вторую пару глаз.

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

root 02.08.2013 18:57

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

#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

    // ...
}

Да, это было бы. Чтобы избежать этого, оставьте точку с запятой в определении.

Joshua 15.01.2009 05:53

Подождите, не так ли; после SOME_MACRO (a) просто сделать if пустым? Я что-то пропустил?

Michael Myers 16.05.2009 02:05

Моя самая глупая ошибка была:

    if (a=!0) 

вместо:

    if (a!=0)

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

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

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

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()) {

Другие вопросы по теме