strcmp 对NULL 的动作为何这么奇怪

331 views
Skip to first unread message

vivian huang

unread,
Jul 12, 2010, 2:26:40 AM7/12/10
to SHLUG
这段代码seg fault:

int main()
{

     int i = strcmp( "a", NULL );  
     return;
}


这样又没事:
int main()
{

     strcmp( "a", NULL );
     return;
}

该函数没处理NULL就让我觉得很笨,又发觉这不仅笨,还很奇怪了。这样的设计难道是为了效率?
看了glibc 的代码,string/strcmp.c 这个版本对两种情况都会段错,没“赋值就错误” 的现象。

Chaos Eternal

unread,
Jul 12, 2010, 2:33:06 AM7/12/10
to sh...@googlegroups.com
优化掉了

第一个你编译的时候如果 -O 就不会seg fault了

但是如果你return i;
如果你怎么-O都会seg fault

2010/7/12 vivian huang <vivia...@gmail.com>:

vivian huang

unread,
Jul 12, 2010, 2:43:48 AM7/12/10
to sh...@googlegroups.com
这种情况下不能读strcmp 返回的位置

2010/7/12 Chaos Eternal <chaose...@shlug.org>

机械唯物主义 : linjunhalida

unread,
Jul 12, 2010, 2:48:24 AM7/12/10
to sh...@googlegroups.com
不要去管那些没有定义的功能。
写程序要走在“大路”上面,走多了小路会撞鬼的。

2010/7/12 vivian huang <vivia...@gmail.com>

york zhuo

unread,
Jul 12, 2010, 2:56:00 AM7/12/10
to sh...@googlegroups.com
是路就要走走看,你要是不把鬼赶了,消费者走上去怎么办

2010/7/12 机械唯物主义 : linjunhalida <linjun...@gmail.com>



--
===========
-york.zhuo

Chaos Eternal

unread,
Jul 12, 2010, 2:57:33 AM7/12/10
to sh...@googlegroups.com
因为strcmp根本就被优化掉了,就是说根本就没有执行。

2010/7/12 vivian huang <vivia...@gmail.com>:

vivian huang

unread,
Jul 12, 2010, 2:59:20 AM7/12/10
to sh...@googlegroups.com
明了。。

2010/7/12 Chaos Eternal <chaose...@shlug.org>

机械唯物主义 : linjunhalida

unread,
Jul 12, 2010, 3:02:49 AM7/12/10
to sh...@googlegroups.com
没有把路堵死,让消费者走了,是程序员的责任。
其实一般的方法是限制只能走那些测试OK的路。

2010/7/12 york zhuo <york...@gmail.com>

vivian huang

unread,
Jul 12, 2010, 3:07:03 AM7/12/10
to sh...@googlegroups.com
偶尔走走小路,看看小鬼,小日子更有情趣

2010/7/12 机械唯物主义 : linjunhalida <linjun...@gmail.com>

stone zhang

unread,
Jul 12, 2010, 3:09:46 AM7/12/10
to sh...@googlegroups.com
strXXX 系列的函数在使用前都要判读参数是否为空。 gnome的 glib 库中g_strXXX 不需要判断参数是否为空。

其实,作为一个优秀的程序员,在编写代码时,要假定别人错了,你的code会怎么样。 大部份程序员想的都是正确的会怎么样。

上面这是我个人的看法,见笑了。
--
我是stone

机械唯物主义 : linjunhalida

unread,
Jul 12, 2010, 3:17:36 AM7/12/10
to sh...@googlegroups.com
记得上次也有关于参数检查的讨论。不知道是在toplanguage还是在这里。。

个人猜测也是被优化掉了(这样的代码编译器一定会warning的),现在不在linux下,等回去反编译看看。

2010/7/12 stone zhang <kelx...@gmail.com>

stone zhang

unread,
Jul 12, 2010, 3:31:09 AM7/12/10
to sh...@googlegroups.com

程序是由函数组成的,所以说,要想写好一个程序,大部份而言,就是如何写好一个函数。

在看了无数的开源代码后,总结出如何写好一个函数的方式如下:

写好一个函数一般分为四个步骤, 套路如下:

(1) 定义/声明 函数内要用到的变量

(2) 检查传递过来的参数的合法性

(3) 实现 功能

(4) 释放资源/ 返回。


其中(2) 解决的是crash问题,
      (4) 解决的是内存泄漏的问题。

我所说的只是总体而言, 记得要活学活用, 万不可死搬硬套。
--
我是stone

york zhuo

unread,
Jul 12, 2010, 3:40:23 AM7/12/10
to sh...@googlegroups.com
基本同意,大笔一挥“批准”

2010/7/12 stone zhang <kelx...@gmail.com>



--
===========
-york.zhuo

vivian huang

unread,
Jul 12, 2010, 3:50:16 AM7/12/10
to sh...@googlegroups.com
关于包装,(二)(四)比较深刻。 “永远不要对函数外的世界做任何友好假设,那是幻想!它们最邪恶就对了”
而strcmp 的实现为何不检查呢?传统?效率?

2010/7/12 stone zhang <kelx...@gmail.com>

机械唯物主义 : linjunhalida

unread,
Jul 12, 2010, 3:58:41 AM7/12/10
to sh...@googlegroups.com
不检查更优雅一些。因为调用者始终都是要检查的。

2010/7/12 vivian huang <vivia...@gmail.com>

Zhang JieJing

unread,
Jul 12, 2010, 3:59:22 AM7/12/10
to sh...@googlegroups.com
个人觉得, 风格问题。
有一些问题明显是程序员的错误, 有一些库是包装的很好, 出了什么错就返回错误之类的,
还有一些库,是相信程序员的, 比如kernel里面的代码, 你有些函数调用的时候传NULL进去就是让你直接死掉。

---
Best regards,
Zhang Jiejing

Yongwei Wu

unread,
Jul 12, 2010, 4:18:15 AM7/12/10
to sh...@googlegroups.com
基本不同意(2)。

特别在C这样的语言里,没有异常,要对所有错误返回错误码,基本上不现实。
你返回了,调用者还不一定用呢。我主张使用Design by Contract的概念,用
assert声明对于传入参数的要求。

无论是assert还是检查,都存在局限性。设想以下例子:

struct Test {
size_t len;
char buffer[1];
};

...

Test* ptr = NULL;

...

strcmp("ABC", ptr->buffer);

现在你传的不是NULL了,而是0x00000004(32位机)!

所以,对指针的有效性进行检查基本无解。

2010/7/12 stone zhang <kelx...@gmail.com>:

--
Wu Yongwei
URL: http://wyw.dcweb.cn/

stone zhang

unread,
Jul 12, 2010, 4:28:27 AM7/12/10
to sh...@googlegroups.com
2) 检查传递过来的参数的合法性

这里指的是函数的参数。

如果你写的函数,对传递过来的参数都没有办法进行合法性检查,那么你的程序基本没有稳定性可言。

还有,就是没有什么是绝对的(我之前已有声明)。

欢迎拍砖。
--
我是stone

Zhang JieJing

unread,
Jul 12, 2010, 4:36:57 AM7/12/10
to sh...@googlegroups.com
我觉得是要分情况:

1. C库函数和系统调用, 如果你调用这些函数的时候没有检查返回值和参数, 那是你的问题。(同样适用于已经有明确约定的库, 比如gtk等)

2. 自己写的库, 自己写的库因为文档和普及的原因, 调用者不能做到了解每个参数的作用和规则, 所以可以在函数实现内部作assert检查。

3. 再好的库碰到很烂的程序员也是没有办法的。


---
Best regards,
Zhang Jiejing

stone zhang

unread,
Jul 12, 2010, 4:44:48 AM7/12/10
to sh...@googlegroups.com
Zhang Jiejing 兄说的不错。

我所写的四的步骤只是一般的情况, 能够检查的尽可能检查。 多写一点代码没有什么太多的坏事。 如何你现在负责的Project代码行在10万以上,你就会很容易体会到我所说的方法的好处。
--
我是stone

Yongwei Wu

unread,
Jul 12, 2010, 4:51:47 AM7/12/10
to sh...@googlegroups.com
空对空,谁对谁错的讨论意义不大。我再总结一下我的观点:

1)函数参数的正确性、错误码返回应当事先约定。有些错误可以由返回值表示,有些则必须由调用方保证。
2)指针的有效性检查基本上属于理论上不可行,从而基本没有意义。
3)调用其它人的函数时请检查接口文档,及其约定的错误处理行为。如果没有对空指针有特殊约定的话(比如,许多Windows的API用空指针作为参数取得需要的缓冲区大小),调用者必须保证行为的正确性。

回到最初的例子,不认为strcmp这样的函数有比目前行为更合理的接口。调用方应当检查参数的有效性。

2010/7/12 stone zhang <kelx...@gmail.com>:

--

vivian huang

unread,
Jul 12, 2010, 5:02:06 AM7/12/10
to sh...@googlegroups.com
1. 被2雷到了
2. 空对空是个羽毛球牌子,耐打性能超好

2010/7/12 Yongwei Wu <wuyo...@gmail.com>

stone zhang

unread,
Jul 12, 2010, 5:02:28 AM7/12/10
to sh...@googlegroups.com
Yongwei Wu 和这个mail title 说的是函数调用的问题。

我讲的是如何自己写好一个函数。



PS : shlug ,

  建议把这个问题再讨论的全面点,深入点。
--
我是stone

vivian huang

unread,
Jul 12, 2010, 5:06:15 AM7/12/10
to sh...@googlegroups.com


2010/7/12 Yongwei Wu <wuyo...@gmail.com>

空对空,谁对谁错的讨论意义不大。我再总结一下我的观点:

1)函数参数的正确性、错误码返回应当事先约定。有些错误可以由返回值表示,有些则必须由调用方保证。
2)指针的有效性检查基本上属于理论上不可行,从而基本没有意义。
3)调用其它人的函数时请检查接口文档,及其约定的错误处理行为。如果没有对空指针有特殊约定的话(比如,许多Windows的API用空指针作为参数取得需要的缓冲区大小),调用者必须保证行为的正确性。

回到最初的例子,不认为strcmp这样的函数有比目前行为更合理的接口。调用方应当检查参数的有效性。


就是说约定责任在caller 了。如果caller 和callee 都作检查我感觉是个浪费。
我自己的代码约定责任在callee。
 

Chaos Eternal

unread,
Jul 12, 2010, 5:01:23 AM7/12/10
to sh...@googlegroups.com
窃以为,对函数输入参数的检查这个事情跟函数要实现的功能在理论上复杂度是一样的。
所以附议一下 Wu yongwei的观点:
适可而止。


2010/7/12 Yongwei Wu <wuyo...@gmail.com>:

Yongwei Wu

unread,
Jul 12, 2010, 8:28:55 AM7/12/10
to sh...@googlegroups.com
有些地方还是有冲突的:-)。比如,我的一个观点是"有些"错误检查不值得
做,也不该做。特别是,你原先提到:

>> >> > 其中(2) 解决的是crash问题,

这儿我们的观点显然相左。至少空指针引发的Crash问题我不认为应由被调函数
来检查解决。

2010/7/12 stone zhang <kelx...@gmail.com>:

Yongwei Wu

unread,
Jul 12, 2010, 8:33:36 AM7/12/10
to sh...@googlegroups.com
你可能没意识到,在目前的主流平台上,空指针错误是最容易调试的错误之一。
让程序早点崩,是有利于程序员早点发现错误的。

2010/7/12 vivian huang <vivia...@gmail.com>:

Shell Xu

unread,
Jul 12, 2010, 10:38:18 AM7/12/10
to sh...@googlegroups.com
C设计上有个不知道是好还是坏的概念,叫做最小惊讶。如果一个函数告诉你,这里传递一个指向字符串的指针,他就不会考虑如果你传个空指针怎么办——那是调用者该考虑的事情。
至于最初设计的时候为什么压根不考虑帮调用者一个忙,那是因为C语言形成的年代,大多数用户都是专家。然后库设计好了,是好还是坏都要接受了。


在 2010年7月12日 下午2:26,vivian huang <vivia...@gmail.com>写道:
这段代码seg fault:

int main()
{

     int i = strcmp( "a", NULL );  
     return;
}


这样又没事:
int main()
{

     strcmp( "a", NULL );
     return;
}

该函数没处理NULL就让我觉得很笨,又发觉这不仅笨,还很奇怪了。这样的设计难道是为了效率?
看了glibc 的代码,string/strcmp.c 这个版本对两种情况都会段错,没“赋值就错误” 的现象。




--
无能者无所求,饱食而遨游,泛若不系之舟

sunday sun

unread,
Jul 12, 2010, 8:39:41 PM7/12/10
to sh...@googlegroups.com
我想不检查符合C的设计初衷:程序员做的永远都是对的。类似情况在ANSI中不少见。本人愚见,请老鸟指正。

york zhuo

unread,
Jul 12, 2010, 8:42:34 PM7/12/10
to sh...@googlegroups.com
在内核层编程,如果是传过来的参数为NULL(非法),我一般习惯用BUG_ON(!NULL)直接让系统崩溃,同意yongwei wu 的“让程序早点崩溃”

2010/7/12 Shell Xu <shell...@gmail.com>



--
===========
-york.zhuo

stone zhang

unread,
Jul 12, 2010, 9:46:22 PM7/12/10
to sh...@googlegroups.com
写好一个函数一般分为四个步骤, 套路如下:

(1) 定义/声明 函数内要用到的变量

(2) 检查传递过来的参数的合法性

(3) 实现 功能

(4) 释放资源/ 返回。



对于第二步, 检查传递过来的参数的合法性。 其实, 当传递过来的参数不合法, 你可以采用不同的处理方式阿 。

(1) assert ,  就如 yongwei wu 说的“让程序早点崩溃”

(2) 可以选择继续,只是不处理。


(1) 可以用于大程序的前期开发,便于发现问题。(2) 用于release版本,对end-user 来讲,是不允许crash 的。
--
我是stone

shell

unread,
Jul 12, 2010, 10:07:57 PM7/12/10
to sh...@googlegroups.com
0x00000001�Ϸ�ô��
char *p = NULL;
...
if (strcmp(str1, p+2) == 0)��ô�죿

�� 2010��07��13�� 09:46, stone zhang �:
д��һ������һ���Ϊ�ĸ����裬 ��·���£�

��1�� ����/���� ������Ҫ�õ��ı���

��2�� ��鴫�ݹ����IJ���ĺϷ���

��3�� ʵ�� ����

��4�� �ͷ���Դ/ ���ء�



���ڵڶ����� ��鴫�ݹ����IJ���ĺϷ��ԡ� ��ʵ�� �����ݹ����IJ���Ϸ��� ����Բ��ò�ͬ�Ĵ��?ʽ�� ��

��1�� assert ,  ���� yongwei wu ˵�ġ��ó�����������

��2�� ����ѡ�����ֻ�Dz����?


��1�� �������ڴ�����ǰ�ڿ��������ڷ������⡣��2�� ����release�汾����end-user �������Dz�����crash �ġ�




�� 2010��7��12�� ����8:42��york zhuo <york...@gmail.com>д ����
�� �ں˲��̣�����Ǵ������IJ���ΪNULL���Ƿ�������һ��ϰ����BUG_ON(!NULL)ֱ����ϵͳ������ͬ��yongwei wu �ġ��ó�����������

2010/7/12 Shell Xu <shell...@gmail.com>

C ������и���֪���Ǻû��ǻ��ĸ��������С���ȡ����һ����������㣬���ﴫ��һ��ָ���ַ��ָ�룬��Ͳ��ῼ������㴫����ָ����ô�졪�����ǵ��� �߸ÿ��ǵ����顣
���������Ƶ�ʱ��Ϊʲôѹ���ǰ������һ��æ��������ΪC�����γɵ���������û�����ר�ҡ�Ȼ�����ƺ��ˣ��Ǻû��ǻ���Ҫ�����ˡ�

�� 2010��7��12�� ����2:26��vivian huang <vivia...@gmail.com>д ����

�� ���seg fault:


int main()
{

     int i = strcmp( "a", NULL );  
     return;
}


������û�£�

int main()
{

     strcmp( "a", NULL );
     return;
}

�ú���û����NULL�����Ҿ��úܱ����ַ����ⲻ��������������ˡ����������ѵ���Ϊ��Ч�ʣ�
����glibc �Ĵ��룬string/strcmp.c ����汾�������������δ?û����ֵ�ʹ��� ������




--
�����������󣬱�ʳ�����Σ�������ϵ֮��



--
����������������������
-york.zhuo



--
����stone

stone zhang

unread,
Jul 12, 2010, 10:15:41 PM7/12/10
to sh...@googlegroups.com
不要钻牛角阿, 说的是一般方法,

我还说了,没有绝对的东西, 要活学活用。



在 2010年7月12日 下午10:07,shell <shell...@gmail.com>写道:
0x00000001合法么?

char *p = NULL;
...
if (strcmp(str1, p+2) == 0)怎么办?


于 2010年07月13日 09:46, stone zhang 写道:
写好一个函数一般分为四个步骤, 套路如下:

(1) 定义/声明 函数内要用到的变量

(2) 检查传递过来的参数的合法性

(3) 实现 功能

(4) 释放资源/ 返回。



对于第二步, 检查传递过来的参数的合法性。 其实, 当传递过来的参数不合法, 你可以采用不同的处理方式阿 。

(1) assert ,  就如 yongwei wu 说的“让程序早点崩溃”

(2) 可以选择继续,只是不处理。


(1) 可以用于大程序的前期开发,便于发现问题。(2) 用于release版本,对end-user 来讲,是不允许crash 的。




在 2010年7月12日 下午8:42,york zhuo <york...@gmail.com>写 道:
在 内核层编程,如果是传过来的参数为NULL(非法),我一般习惯用BUG_ON(!NULL)直接让系统崩溃,同意yongwei wu 的“让程序早点崩溃”

2010/7/12 Shell Xu <shell...@gmail.com>

C 设计上有个不知道是好还是坏的概念,叫做最小惊讶。如果一个函数告诉你,这里传递一个指向字符串的指针,他就不会考虑如果你传个空指针怎么办——那是调用 者该考虑的事情。

至于最初设计的时候为什么压根不考虑帮调用者一个忙,那是因为C语言形成的年代,大多数用户都是专家。然后库设计好了,是好还是坏都要接受了。

在 2010年7月12日 下午2:26,vivian huang <vivia...@gmail.com>写 道:

这 段代码seg fault:


int main()
{

     int i = strcmp( "a", NULL );  
     return;
}


这样又没事:

int main()
{

     strcmp( "a", NULL );
     return;
}

该函数没处理NULL就让我觉得很笨,又发觉这不仅笨,还很奇怪了。这样的设计难道是为了效率?
看了glibc 的代码,string/strcmp.c 这个版本对两种情况都会段错,没“赋值就错误” 的现象。




--
无能者无所求,饱食而遨游,泛若不系之舟



--
===========
-york.zhuo



--
我是stone




--
我是stone

机械唯物主义 : linjunhalida

unread,
Jul 12, 2010, 10:26:51 PM7/12/10
to sh...@googlegroups.com
指针这东西,不去实际用一下,是无法知道是不是可用的。

2010/7/13 stone zhang <kelx...@gmail.com>

Shell Xu

unread,
Jul 12, 2010, 10:30:28 PM7/12/10
to sh...@googlegroups.com
其实问题在于参数合法性这个问题上。
1.什么是非法的?
2.怎么处理?
关于1,我向来不赞成检验NULL为非法,除非这个参数显式的定义NULL具有某种特殊的意义。例如某些函数利用NULL表示略过这个参数。
因为如果要检验NULL为非法,同类我们就要检验NULL族。在windows中有定义用户地址空间0x00000000-0x00001000(具体我记的不是很清楚,应该是一个很小的地址空间)为NULL空间,并禁止映射。因此该空间中任何一个地址都是非法地址,一旦传递给库(尤其是系统库),就肯定报错。这是windows自身防错机制的一部分。
而我不知道Linux是否定义了一个NULL空间,并定义空间内的地址为非法。如果没有定义,我们仅处理p == NULL没有任何意义。刚刚的例子就说明这点是如何的不可靠了。而如果检测空间,又容易造成合法地址被拒绝。
关于2,通常我们处理传递一个非法指针的时候是非常纠结的。两种处理方法,返回一个异常,并要求用户处理,或者直接使程序崩溃。
返回异常要求用户处理当然是比较优美的,但是我们必须精确表述出异常的原因,否则用户无法和库自身执行中的问题区分。然而吊诡的是,如果用户去处理了“指针为NULL”这种特定类型错误,有理由相信他也可以在传递前检查指针,没必要大费周折去做异常处理。而如果用户没处理这种错误,如此返回就会造成程序的执行逻辑出错。
程序设计通常是编译错误优于程序崩溃优于逻辑出错,因此通常程序面对在“不可能”和“不应当”传递入NULL的地方传递入了NULL,考虑的做法往往是直接崩溃。
--
无能者无所求,饱食而遨游,泛若不系之舟

Zhang JieJing

unread,
Jul 12, 2010, 10:38:39 PM7/12/10
to sh...@googlegroups.com
p+2 也是会segment fault的。

在linux上好像是 2个page, 也就是小于 8096 的指针都是会segment fault的。

其实很好的方法就是在你的程序中当segment fault 的时候把stack dump出来再退出。 不过我觉得你说的这种情况(0 +
1) 的指针, 调用者应该作好检查。

---
Best regards,
Zhang Jiejing

在 2010年7月13日 上午10:07,shell <shell...@gmail.com> 写道:
> 0x00000001合法么?

> char *p = NULL;
> ...

> if (strcmp(str1, p+2) == 0)怎么办?
>
> 于 2010年07月13日 09:46, stone zhang 写道:
>

> 写好一个函数一般分为四个步骤, 套路如下:
>
> (1) 定义/声明 函数内要用到的变量
>
> (2) 检查传递过来的参数的合法性
>
> (3) 实现 功能
>
> (4) 释放资源/ 返回。
>
>
>
> 对于第二步, 检查传递过来的参数的合法性。 其实, 当传递过来的参数不合法, 你可以采用不同的处理方式阿 。
>
> (1) assert , 就如 yongwei wu 说的"让程序早点崩溃"
>
> (2) 可以选择继续,只是不处理。
>
>
> (1) 可以用于大程序的前期开发,便于发现问题。(2) 用于release版本,对end-user 来讲,是不允许crash 的。
>
>
>
>
> 在 2010年7月12日 下午8:42,york zhuo <york...@gmail.com>写 道:
>>

>> 在 内核层编程,如果是传过来的参数为NULL(非法),我一般习惯用BUG_ON(!NULL)直接让系统崩溃,同意yongwei wu
>> 的"让程序早点崩溃"
>>


>> 2010/7/12 Shell Xu <shell...@gmail.com>
>>>
>>> C

>>> 设计上有个不知道是好还是坏的概念,叫做最小惊讶。如果一个函数告诉你,这里传递一个指向字符串的指针,他就不会考虑如果你传个空指针怎么办----那是调用


>>> 者该考虑的事情。
>>> 至于最初设计的时候为什么压根不考虑帮调用者一个忙,那是因为C语言形成的年代,大多数用户都是专家。然后库设计好了,是好还是坏都要接受了。
>>>
>>> 在 2010年7月12日 下午2:26,vivian huang <vivia...@gmail.com>写 道:
>>>>

>>>> 这 段代码seg fault:


>>>>
>>>> int main()
>>>> {
>>>>
>>>> int i = strcmp( "a", NULL );
>>>> return;
>>>> }
>>>>
>>>>

>>>> 这样又没事:


>>>> int main()
>>>> {
>>>>
>>>> strcmp( "a", NULL );
>>>> return;
>>>> }
>>>>

Shell Xu

unread,
Jul 12, 2010, 11:10:30 PM7/12/10
to sh...@googlegroups.com
恩,所以通常我建议在指针返回/初始化的时候就做好检测。或者干脆不检测,等程序崩溃再说。
--
无能者无所求,饱食而遨游,泛若不系之舟

stone zhang

unread,
Jul 12, 2010, 11:22:58 PM7/12/10
to sh...@googlegroups.com
(1)函数参数的合法性, 不仅仅只是检查指针, 也可以检查参数是否在你所定义的某个范围内等等。

(2)另外,在Linux下,好象没有NULL族的概念。

(3)综合前面所有的讨论,现在主要的问题集中在如何判断指针的合法性,或者有没有什么方式尽可能保证指针是合法的。

对于这一问题,确实认识不足, 大家有什么好想法,一起分享一下。谢谢。
--
我是stone

Yongwei Wu

unread,
Jul 12, 2010, 11:52:15 PM7/12/10
to sh...@googlegroups.com
* 做好约定(查看、写好文档)
* 处理异常情况(如内存不足)
* 充分测试(考虑代码覆盖率工具)
* 让程序在有问题时尽早崩

检查指针没有意义。知道非法又如何?有比崩更好的逻辑吗?我的经验是没有。

所以不需要检查指针。

2010/7/13 stone zhang <kelx...@gmail.com>:

>>>>>> 设计上有个不知道是好还是坏的概念,叫做最小惊讶。如果一个函数告诉你,这里传递一个指向字符串的指针,他就不会考虑如果你传个空指针怎么办----那是调用

--

vivian huang

unread,
Jul 13, 2010, 2:09:10 AM7/13/10
to sh...@googlegroups.com
我看到的是:
1, 函数入口多多用断言
2, 函数返回多多用断言
3, 区分错误和非法。错误 --> 处理,非法 --> crash

Yongwei Wu

unread,
Jul 13, 2010, 2:30:11 AM7/13/10
to sh...@googlegroups.com
基本同意。就是2比较麻烦(语言不支持design by contract),我不太做。

(理论上讲,postconditiona应当在函数的所有出口检查,包括所有的return、throw和调用其他代码时的没被catch的throw。C++里做不到。)

2010/7/13 vivian huang <vivia...@gmail.com>:

--

Reply all
Reply to author
Forward
0 new messages