你在C中犯的最危险的编程错误是什么?

Man*_*bts 8 c

我是一名中级C程序员.如果您之后发现任何编码错误,那么它对整个应用程序来说是最危险/最有害的,请分享该代码或说明.我想知道这一点,因为将来我可能会遇到这样的情况,我希望得到你的建议,以避免这样的错误.

Dan*_*der 24

if (c = 1) // insert code here
Run Code Online (Sandbox Code Playgroud)

  • 我经常听到这是一个常见的错误,但几乎从来没有找到实际成功的人(除了在线).对于其中之一,我发现(1 == c)在可读性等级上是可怕的,并避免像瘟疫那样使用它. (4认同)
  • +1 - 你可能会看到一个成语(1 == c)人们用来避免这个错误.这是经典之一. (2认同)
  • @DocMax我也不喜欢它,特别是考虑到编译器会警告它(至少我使用的编译器). (2认同)

Fer*_*lez 20

if(a == true);
{
  //Do sth when it is true. But it is allways executed.
}
Run Code Online (Sandbox Code Playgroud)

编辑:同一错误的另一种变体.

for(i=0; i<max_iterations;i++);
{
  //Do sth but unexpectedly only once
}
Run Code Online (Sandbox Code Playgroud)

  • ohhohhooo ...我花了2分钟在那里找到那个分号.真的.这是最有趣的错误,也是危险的.这就是我沉迷于stackoverflow的原因.我得到了很好的例子再次感谢你 (6认同)

qrd*_*rdl 12

几年前,我接到了我的前同事的电话,告诉我他必须修复我的代码的问题,这是一个信用卡交易的路由器.

卡号前缀由6位BIN(银行识别码)和银行自行决定使用的额外几位数组成,例如银行有Visa经典卡456789的BIN,并保留2个额外数字以表示子产品,如01为学生用卡,02与当地百货商店的联名卡等.在这种情况下,卡前缀(基本上是产品标识符)变为8位数.当我对这部分进行编码时,我认为9位数"对每个人来说都应该足够了".我运行2年,直到有一天银行制作一个10位长前缀的新卡产品(不知道他们为什么需要它).不难想象发生了什么 - 路由器segfaulted,整个系统停止,因为没有事务路由器它不能运行,

我不能先在这里发布代码,因为我没有它,其次它是公司的版权所有,但不难想象strcpy()没有检查目标缓冲区的大小.

就像man strcpy说:

如果strcpy()的目标字符串不够大(也就是说,如果程序员是愚蠢或懒惰的,并且在复制之前未能检查大小),则可能发生任何事情.溢出的固定长度字符串是最喜欢的饼干技术.

我很尴尬.这是一个犯seppuku的好时机:)

但我很好地吸取了教训,并且不要忘记(通常是:))来检查目标缓冲区的大小.我不建议你以艰难的方式学习它 - 只是养成了在之前strcpy()和之前检查目标缓冲区的习惯strcat().

编辑:来自Healthcarel的好建议 - 使用strncpy()而不是strcpy().它不会添加尾随0,但我通常使用以下宏来解决它:

#define STRNCPY(A,B,C) do {strncpy(A,B,C); A[C] = 0; } while (0)

  • @Healthcarel:首先,`strncpy`不是'strcpy`的替代品(它甚至不是同一系列的函数).`strlcpy`是正确的功能.其次,截断字符串(使用任何函数)不是原始问题的解决方案.恰恰相反,截断字符串会导致比这张海报描述的更大的灾难.事实上,他们很幸运,系统*崩溃*而不是继续在无效状态下运行. (2认同)

Too*_*the 12

这已经很久了,但有些事情你永远不会忘记;-).

  • \0了字符串的末尾.
  • 为包含n个字符的字符串分配n个字符.
  • 忘记switch语句中的break.
  • '创意'宏观使用.


小智 6

for(int i = 0; i<10; ++i)
  //code here
  //code added later
Run Code Online (Sandbox Code Playgroud)

请注意,后面添加的代码不在for循环中.

  • 所以应该为每个人提供花括号 (3认同)
  • 不,你应该切换到缩进控件流的python :-). (2认同)
  • @Pax我认为缩进作为范围声明可能是python esp最糟糕的特性之一.当你从屏幕上读取它时. (2认同)

Wal*_*ght 5

未初始化的数据.