我是一名中级C程序员.如果您之后发现任何编码错误,那么它对整个应用程序来说是最危险/最有害的,请分享该代码或说明.我想知道这一点,因为将来我可能会遇到这样的情况,我希望得到你的建议,以避免这样的错误.
if (c = 1) // insert code here
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..:未初始化的数据.