我是一名中级C程序员.如果您之后发现任何编码错误,那么它对整个应用程序来说是最危险/最有害的,请分享该代码或说明.我想知道这一点,因为将来我可能会遇到这样的情况,我希望得到你的建议,以避免这样的错误.
Dan*_*der 24
if (c = 1) // insert code here
Run Code Online (Sandbox Code Playgroud)
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)
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)
小智 6
for(int i = 0; i<10; ++i)
//code here
//code added later
Run Code Online (Sandbox Code Playgroud)
请注意,后面添加的代码不在for循环中.