`

《Windows核心编程》の防御性编程--断言

 
阅读更多

防御性编程是提高软件质量技术的有益辅助手段,它的主要思想是:子程序应该不因传入错误数据而被破坏,哪怕是由其他子程序产生的错误数据。防御性编程关键在于严格的输入检查、预期的错误处理方法。下面介绍使用断言来进行防御性编程。

断言通常是一个例程(routine)或一个宏(macros),断言通常包含有两个参数:布尔表达式和消息。布尔表达式的反面是一个错误,C标准库提供了一个assert宏,它只带有一个参数,如:

assert(1==0); //注意布尔表达式不用加引号

使用assert宏,需要包含头文件cassertassert.h,执行上述语句的结果是程序结束运行,并弹出对话框显示出错信息。

我们可以自定义assert宏,有两个目的:

1)新增参数。例如新增一个消息参数,使assert宏输出更为丰富的信息;

2)改变assert的行为内容。C标准库中的assert宏将中断程序,可以让程序继续运行而不中断或者进入调试状态等,另外还可以控制消息输出的目标,即控制消息是输出到控制台还是文本文件,甚至是通过网络发出。

下面是一个C++实现的自定义断言:

#ifdef _DEBUG

#define Assert(exp, message) /

{ /

if(!(exp)) /

{ /

std::cout<<"Assertion failed: "<<#exp<<"/n" /

<<"Message: "<<message<<"/n" /

<<"line: "<<__LINE__<<"/n" /

<<"file: "<<__FILE__<<"/n"; /

exit(EXIT_FAILURE); /

} /

}

#else

#define Assert(exp, message)

#endif

使用断言应注意的问题:

1)对非预期错误使用断言。非预期错误包括空指针、输入或输出的参数值不在预期范围内、数组的越界等;

2)不要把需要执行的代码放入断言中。断言用于软件的开发和维护,通常不在发行版本中包含断言。把需要运行的代码放入断言中,在发行版本中这些代码通常不会被执行;

3)对来源于内部系统的可靠数据使用断言,而不要对外部不可靠数据使用断言,对于外部不可靠数据应该使用错误处理代码。


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics