Chinaunix首页 | 论坛 | 博客
  • 博客访问: 982512
  • 博文数量: 158
  • 博客积分: 4380
  • 博客等级: 上校
  • 技术积分: 2367
  • 用 户 组: 普通用户
  • 注册时间: 2006-09-21 10:45
文章分类

全部博文(158)

文章存档

2012年(158)

我的朋友

分类: C/C++

2012-11-26 09:40:01

1。在对字符串赋值前,必先用memset进行全部赋零操作
有人说这么安全。不知道证据从哪儿来的?
有人说多这一句也不多。不知道多哪一句才算多?

2。对于不再使用的指针变量,赋零
有人说这么安全。不知道证据从哪儿来的?
有人说多这一句也不多。不知道多哪一句才算多?

--------- 以下是俺觉得内容太少,而拉过来凑字数的,不是闲得发慌的话,不需要看 ---------

这两个恶习估计唯一的作用就是隐藏Bug,令错误难于被发觉。(这句话转自 chinaunix 上的一位牛人,深表赞同 )

第1个恶习,有个好例子,在论坛上出现过
char str[16];
memset( str, 0, 16 );
str[0] = 'a';
str[1] = 'b';
str[2] = 'c';
printf( "%s", str );
如果没有memset这一句,结果就是错误的,所以他认为数组赋值前先memset一下是个很好的风格。
(正确的做法是str[3] = '\0')

对于 位比较 不在此列,比如将 str[16] 送入加密函数 void foo( void* p, size_t n )
那么 "abc \0 1" 和 "abc \0 2" 就是不等同的,在论坛中也见到过两次,有人问“我用DES3加密一个字符串,每次输入都是abc,但结果却不一样”,呵呵。

第2个恶习,就是重复释放的问题
int* p = new int;
delete p;
p = 0;
delete p;
如果没有p = 0;这一句,结果就是错误的,所以他认为这也是个很好的风格。
(正确的做法是删除重复的delete p。我们的目的是去除错误,而不是让错误不产生危害

对于p = 0 某些人(只是某些人而已)会用来在Debug版本中做释放检查,算是一种debug的手段,但不应该出现在正式的代码中。
而其实,一般的编译器都会在debug版本中做类似的行为,但绝不是 p = 0 这种傻叉叉的做法,而是 *(int*)p = 特值。
例如
p = new char[100];
p1 = p;
delete[] p; *(int*)p = 0xFEEEFEEE;
如果 *(int*)p1 == 0xFEEEFEEE 说明 p1 指向的内存已经被释放
阅读(5277) | 评论(28) | 转发(0) |
给主人留下些什么吧!~~

网友评论2012-11-26 09:42:19

Diviner
第一种情况我不初始化如果把这个做作为参数传给其他人写的函数里,他会进行str[3]=0这种操作吗?
第二种情况在一些复杂的逻辑里面有可能会造成delete两次。

网友评论2012-11-26 09:42:07

周星星
但你能告诉我,这两种代码防御了什么呀?

网友评论2012-11-26 09:41:57

Diviner
1.3 什么是防御性编程?

顾名思义,防御性编程是一种细致、谨慎的编程方法。为了开发可靠的软件,我们要设计系统中的每个组件,以使其尽可能地“保护”自己。我们通过明确地在代码中对设想进行检查,击碎了未记录下来的设想。这是一种努力,防止(或至少是观察)我们的代码以将会展现错误行为的方式被调用。

防御性编程使我们可以尽早发现较小的问题,而不是等到它们发展成大的灾难的时候才发现。你常常可以看到“职业”的开发人员不假思索飞快地编写着代码。他们开发软件的过程可能是这样的:



他们不断地受到那些从未有时间验证的错误的打击。这很难说是现代软件工程的进步,但它却不断地发生着。防御性编程帮助我们从一开始就编写正确的软件,而不再需要经历“编写-尝试-编写-尝试……”的循环过程。在采用了防御性编程之后,开发软件的过程将变成:



当然,防御性编程并不能排除所有的程序错误。但是问题所带来的麻烦将会

网友评论2012-11-26 09:41:43

周星星
做任何事都需要理由,你能给我一个理由吗?

比如第1条,如果后面的代码错误(比如溢出),你memset还是错误,你不memset也是错误;如果后面的代码正确(比如不溢出),你memset还是正确,你不memset也是正确。 你告诉我memset的理由何在?

比如第2条,[小兵]说“因为你下次如果再 p[1]就报错了”
请问报错了之后怎么办?报错了,当然就会删除掉p[1],此后,既然不会有错误了,那留着p=0干什么?说到底,最多这只能算是一种debug手段,而不应该出现在正式代码中。
况且,在debug阶段,很多调试器或代码检查器都会在你使用p[1]时报错,不需要加上p=0

网友评论2012-11-26 09:41:35

快乐小胖鸟
是的,支持diviner,这没有什么恶习,*仔走火入魔了