【问题标题】:Unable to locate the Bug无法找到错误
【发布时间】:2011-01-15 23:46:15
【问题描述】:

我最近在 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?

【问题讨论】:

  • DailyWTF 在 Alex 从一口大小的代码块中切换出来并觉得每次都需要写一整篇文章时完全跳了起来。
  • 如果您查看 WTF 中的 cmets,您会发现也没有人能看到问题
  • 当你看到 1000 多个文件被更改时,只是为了做到这一点,没有有意义的源代码管理注释,它在我的书中变成了 WTF。
  • 他们在不需要更改代码时更改了代码这一事实是有害的。 “最好的代码就是没有代码”。

标签: c stack


【解决方案1】:

我不认为堆栈初始化是问题所在。他本应寻找难以发现的内存泄漏,但他决定对数千个 C 文件进行初始化更改。

虽然,正如mentioned on wikipedia,“未初始化的变量[是] 错误的常见原因”。如果您在声明时处理好未初始化变量,您就消除了使用未初始化变量的可能性。但是,将这种转换为几千个文件可能并不是查找和解决实际问题的最有效方法。

【讨论】:

  • 实际上我认为这是为了防止空指针的使用,这可能就像(或取决于环境/操作系统)更加阴险。堆栈初始化也有助于编译器优化,使代码可能更快。根据中间代码的复杂性,在第一个示例中分配 x 到 2 可能不会完成,而您几乎可以保证在第二个示例/更改的代码中就是这种情况。
  • 它发生了,有时你只是举起手来解决所有可能的问题。
【解决方案2】:

我认为新代码更好。除非我会去

  char data_string[] = "data data data";

【讨论】:

    【解决方案3】:

    这种情况更糟的唯一方法是,旧代码可能从未初始化(或使用)某些代码路径中的值。

    另一个问题是这个

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

    但这让你想知道是否有必要将字符串复制到堆栈变量中。

    【讨论】:

      猜你喜欢
      • 2015-05-26
      • 2011-02-18
      • 1970-01-01
      • 2022-09-26
      • 1970-01-01
      • 2013-02-13
      相关资源
      最近更新 更多