当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《你在C中犯的最危险的编程错误是什么?》经验,为你挑选了6个好方法。

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



1> Daniel Kreis..:
if (c = 1) // insert code here


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

2> Fernando Mig..:
if(a == true);
{
  //Do sth when it is true. But it is allways executed.
}

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

for(i=0; i


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

3> qrdl..:

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

卡号前缀由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`是正确的功能.其次,截断字符串(使用任何函数)不是原始问题的解决方案.恰恰相反,截断字符串会导致比这张海报描述的更大的灾难.事实上,他们很幸运,系统*崩溃*而不是继续在无效状态下运行.

4> Toon Krijthe..:

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

\0了字符串的末尾.

为包含n个字符的字符串分配n个字符.

忘记switch语句中的break.

'创意'宏观使用.



5> 小智..:
for(int i = 0; i<10; ++i)
  //code here
  //code added later

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


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

6> Walter Brigh..:

未初始化的数据.

推荐阅读
跟我搞对象吧
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有