什么是你很久没找到的最愚蠢的错误?

时间:2008-12-21 22:34:21

标签: debugging language-agnostic

我正在开展一个项目,但是由于某种原因,即使它应该有,也没有抛出异常。在内心深处,我发现了这种错误处理:

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 个答案:

答案 0 :(得分:19)

我在应用程序每天下午6:12崩溃时修复了一个错误。

原来有人在16bit int中存储了自当天开始以来的秒数。

答案 1 :(得分:11)

在C / C ++中(我最近学到的)

if (x = 0) {
...
}

答案 2 :(得分:6)

  I=1

Fortran的这一行根本就没用了。

经过几个小时的徒劳无功的调试后,我吞下了自己的骄傲,并让我的伙伴一步穿过代码。

来到那条线后,我说,“现在我们增加下标。”

“啊?”他说。

那时我意识到我正在读我的意图:

 I=I+1

而不是我写的。

请记住,下次你被卡住了,无法弄清楚出了什么问题。

不要让你的骄傲阻止你招募第二双眼睛。

答案 3 :(得分:5)

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

尝试在凌晨3点使用小字体在crummy显示器上找到那个! ;)

答案 4 :(得分:5)

我写了一个函数来将日期时间字符串解析为另一种格式。在其中我有一个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;

出于某种原因,我在10月份遗漏了......

答案 5 :(得分:4)

实际上并没有在main的开头附近初始化一些堆栈变量。事情会自动归零,几乎总是

答案 6 :(得分:3)

很久以前在我的高中CS时代,我在(我认为)Turbo Pascal中实现了一棵二叉树。其中一个操作没有正确处理它的指针,最终覆盖了部分代码段(啊,DOS编程的乐趣)。无论如何,它总是覆盖我放入的所有调试代码,使得IF语句看似谎言,打印语句没有发生等等,但所有奇迹般地没有崩溃,并且几乎无法分辨出发生了什么。 / p>

最后我通过程序集级调试器运行它,并在函数中间开始更改指令时发现问题...

答案 7 :(得分:3)

当我对大括号语言的经验不足时,我曾写过以下内容:

if (expr);
    stmt;

它是在嵌入式系统中,所以我的调试器和printf无能为力。它只是让音频听起来很糟糕。我把它归结为性能不佳,花了一天时间来优化它。信封计算的后面会显示性能不是问题。

从那天开始,我总是把括号括起来。这让我想用Python编写,如果它不是用于其他语言。

答案 8 :(得分:3)

不确定它是否是最愚蠢的,但是我曾经遇到的最糟糕的一个是我编写了一些部分取决于时间的访问控制例程(所以你可以编写像'这样只能在办公时间内的工作日')。

我完成了代码并运行了所有测试,一切正常。然后我回到家,在下一个工作日来到我的所有测试并且他们失败了。我不能为我的生活弄清楚为什么会发生这种情况,因为代码和所有测试完全没有变化。

原来,夏令时已经开始,我的代码没有处理。

答案 9 :(得分:3)

我的大多数愚蠢错误都不是真正的错误。它们是糟糕的数据和我对这些数据的假设。

我花了好几个小时试图在没有代码的代码中找到错误 - 我正在调试一段旧代码,或者我认为我的测试数据集是某种东西......而事实并非如此。

答案 10 :(得分:1)

这不是我的错,但我在场。我和我的妻子在大学时一起参加了java课程。她在人类学,我在金融,但不知何故,我们最终在java。我喜欢它。

她花了整整一个晚上试图制作一个“该死的节目画出一个愚蠢的$%^& *(屏幕上的房子”,但事实并非如此。顽固的,她抵制了我的任何帮助,直到她的最后一刻绝望(凌晨2点,凌晨3点?)。我快速看了一下,注意到她用了“O”(字母o)而不是“0”(零)。

第二天她退出了课堂。

就个人而言,我有一些可能很常见的愚蠢错误。我最喜欢的是:

美元符号+ function_name 使用相同的迭代($ i)代替已经循环的$ i迭代循环 因为我的手滑了而在某个地方发生的随机“`”

答案 11 :(得分:1)

我正在使用flex / bison编写解析器。一个特征是常量折叠优化,即用22替换20 + 2,但我的解析器用4替换它。

作为词法分析器的一部分,我有一个符号表。我使用strncpy进行线性搜索来搜索现有条目。但是,对于strncpy中的length参数,我在符号表中的字符串上使用了strlen。这不是一个聪明的主意,因为如果符号表中的条目较小,那么添加的条目将不正确匹配。例如,添加“20”将匹配“2”,因为仅比较第一个字符。因此,当我的解析器查找符号“20”时,它得到“2”。我花了几个小时才弄清楚为什么我的20岁才变成了2岁。

答案 12 :(得分:1)

另外,我们怎样才能忘记 COPY AND PASTE 的邪恶所带来的错误!!

答案 13 :(得分:1)

有一次,当我做一些数学编程相关的家庭作业时,我花了几个小时才弄清楚我在某个地方需要一个*。

答案 14 :(得分:1)

我曾经调试过一个多线程的程序,但可以禁用多线程。该程序将随机进行段错误,但只能启用多线程。在尝试隔离每种竞争条件之后,我意识到唯一的问题是我正在写一个数组绑定。在单线程模式下,内存分配器可预测地分配内存,这样在被覆盖时不再需要该数组正上方地址的数据,因此该bug没有任何症状。在多线程模式下,这些地址的数据是其他线程拥有的数据。

答案 15 :(得分:1)

不是我最糟糕的,而是最近三元运营商邪恶的例子:

让我难以理解为什么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'的邪恶。

答案 16 :(得分:1)

这对于一个让你疯狂试图找出正在发生的事情的错误如何:

#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

    // ...
}

答案 17 :(得分:1)

在过去,当我们在卡上有代码时,我工作了三天,试图弄清楚为什么我的批处理作业不起作用。关于每三行,我终于得到PRINT声明了,我没有看到任何一行。

然后我意识到有一个JCL错误导致我的程序被加载到相应的数据集中(认为“没有进入路径”)所以我一直在运行相同的旧图像,一遍又一遍而不是新编译的那个。

答案 18 :(得分:0)

这是我早期的一个愚蠢的错误。

我们有一个现有项目可供使用,其中有 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()) {

答案 19 :(得分:0)

我最愚蠢的错误是:

    if(a=!0) 

而不是:

    if(a!=0)

我花了4个小时来确定问题,因为编译器简直疯了!当我弄清楚时,我几乎死了!

答案 20 :(得分:0)

},有时候)

答案 21 :(得分:0)

我无法告诉你我遇到的具体错误,但我可以告诉你至少涉及以下其中一项:

  • 假设某事正在发挥作用
  • 数据正确的假设
  • 错字
  • A =而不是==
  • 我应该重构的东西

实际上这是我所有错误的原因列表;)

答案 22 :(得分:0)

为什么,我从来没有在我的生活中制造过一个错误!