assert 函数 man 手册翻译

 
 
ASSERT(3)                        Linux Programmer's Manual                        ASSERT(3)

NAME
       assert - abort the program if assertion is false		//如果断言是错误的,则中止程序

SYNOPSIS
       #include <assert.h>

       void assert(scalar expression);		//标量表达式
	   i.e	assert((strDest != NULL)&&(strSrc != NULL));

DESCRIPTION
       If the macro NDEBUG was defined at the moment <assert.h> was last included, the macro assert() generates no code, and hence does nothing at all. Otherwise, the macro assert() prints an error message to standard error and terminates the program by calling abort(3) if expression is false (i.e., compares equal to zero).
	   /*如果在最后包含 <assert.h> 时定义了宏 NDEBUG,则宏 assert() 不会生成任何代码,也不会执行任何操作。否则宏 assert() 会向标准错误输出错误消息,如果表达式为 false,则通过调用 abort(3) 来终止程序。*/

       The purpose of this macro is to help programmers find bugs in their programs. The message "assertion failed in file foo.c, function do_bar(), line 1287" is of no help at all to a user.
	   /*该宏的目的是帮助程序员在程序中发现错误。消息 "assertion in file foo.c,function do_bar(),line 1287"对用户根本没有任何帮助。*/

RETURN VALUE
       No value is returned.

ATTRIBUTES
       For an explanation of the terms used in this section, see attributes(7).
	   /*有关本节中使用的术语的解释见 attributes(7)*/

       ┌──────────┬───────────────┬─────────┐
       │Interface │ Attribute     │ Value   │
       ├──────────┼───────────────┼─────────┤
       │assert()  │ Thread safety │ MT-Safe │
       └──────────┴───────────────┴─────────┘

CONFORMING TO
       POSIX.1-2001, POSIX.1-2008, C89, C99.  In C89, expression is required to be of  type int  and  undefined behavior results if it is not, but in C99 it may have any scalar type.

BUGS
       assert() is implemented as a macro; if the expression tested has side-effects, program behavior  will  be different depending on whether NDEBUG is defined. This may create Heisenbugs which go away when debugging is turned on.
	   /*assert() 就是一个宏; 如果测试的表达式有副作用,程序行为将根据是否定义 NDEBUG 而有所不同。使用 assert() 时可能会产生 Heisenbugs,该 bugs 在 debug 模式下调试时又会消失。*/
	   
	   /*★★★★★★★★★★Bohrbug、Heisenbug、Mandelbug、Schroedinbug★★★★★★★★★★
	   Bohrbug(玻尔 bug):
		大多数我们遇到的bug都是可以重现的,这些bug被统称为玻尔 bug(Bohrbug)。
		他是用丹麦著名物理学家、诺贝尔获得者尼尔斯·波尔的名字命名的。波尔首先在 1913 年提出了一个简单、易于理解的原子模型概念。在波尔的模型中,原子中的电子的路径和动量是可预知的。		同样的道理,Bohrbug 也是可预知的。如果让软件在相同的条件下运行,你可以让 bug 再次显现。例如,如果程序遇到空指针异常会崩溃,那么,设定相同的输入条件,你可以轻易的让它们重新。
		
	   Heisenbug(海森堡 bug):
		所有有阅历的程序员都遇到过这种情况:有个 bug 让程序崩溃了,但当程序重启后,这个 bug 消失了。不论你用多少的时间和精力来试图让 bug 重现,bug 就是人间蒸发了。这样的 bug 被称为 Heisenbug.
		他是用德国物理学家、量子力学的创始人、"哥本哈根学派"代表性人物维尔纳·海森堡(Werner Heisenber)  的名字命名,隐射其著名的“测不准原理”(又称“海森堡不确定性原理”)。根据他的这个理论,在某一个给定的时间点,一个电子所处的位置是无法确定的,也无法跟踪它的轨迹。
		当你去 debug 探测、隔离一个 bug 时,你的这些动作会导致 bug 改变它们的行为表现,这些 bug 就叫做 Heisenbugs。这种事情是有可能的,比如,如果你使用未初始化的变量,这会导致一个 bug 出现。然而,当你试图 debug 这个程序时,程序却没有任何异常,因为很多的 debug 工具会自动初始化变量为 0,所以这些 bug 将不会再现。
		
	   Mandelbug(曼德博 bug)
		当 bug 产生的原因过于复杂而难以理解时,bug 的出现也变得没有规律,这些叫做 Mandelbug。它是用分形几何学之父本华·曼德博的名字命名。例如,操作系统中基于任务调度产生的 bug 就属于 Mandelbug。
		
	   Schroedinbug(薛定谔 bug)
		有时候,一个可以运行的程序,当你去看它的代码时,发现里面有一个 bug 或有某些问题,程序完全不可能在这样的 bug 下运行。但你再次运行这个程序时,bug 突然就起作用了,程序崩溃的了!虽然这听起来很诡异,但这样的 bug 确实存在,而且被叫做 Schroedinbug。
		他是用奥地利理论物理学家、量子力学的奠基人埃尔温·薛定谔的名字命名。隐射薛定谔著名的薛定谔猫思想实验。在量子力学中,像原子这样的粒子可以存在于两种或两种以上的量子状态中,但薛定谔认为,在更典型的物体,例如一只猫——由很多原子构成——存在于两种状态下的可能性是没有的。他提出了一种思想实验:把一只猫、一个装有氰化氢气体的玻璃烧瓶和一个放射性原子核放进封闭的盒子里。当盒子内的监控器侦测到衰变粒子时,就会打破烧瓶,杀死这只猫。根据量子力学的哥本哈根诠释,在实验进行一段时间后,猫会处于又活又死的叠加态。可是,假若实验者观察盒子内部,他会观察到一只活猫或一只死猫,而不是同时处于活状态与死状态的猫。而在量子物理中,这被称作叠加态:猫同时处于生和死的状态。	
	    */

SEE ALSO
       abort(3), assert_perror(3), exit(3)

COLOPHON
       This page is part of release 4.04 of the Linux man-pages project.  A description  of the  project, information about reporting bugs, and the latest version of this page, can be found at http://www.kernel.org/doc/man-pages/.

GNU                                      2015-08-08                               ASSERT(3)


猜你喜欢

转载自blog.csdn.net/wenfei11471/article/details/80699591