| |
2.检验返回值
现在,软件中最常见的错误是忽略了返回值的检验。许多程序员在调用系统函数或用户自定义的函数后,通常会盲目乐观地认为这些函数会成功的执行。当我们打造经淬火处理的软件时,应当检查返回值,并且在返回失败时,还要进行妥善处理。比如:
ret = printf( "Current value is %d\n", value );
if ( ret < 0 ) {
ret = printf( "An error occured emitting value.\n" );
}
3.检查输入/输出数据
当我们开发应用时,无论涉及到用户的输入,或者是通过网络进行输入,一定要严密关切输入数据的情况:比如对于给定的操作数据是否充分,或者收到的数据是否超过了预留的缓冲区空间。
4.为分支语句提供备选方案
对于switch语句来说,常常会遗漏default部分,这会导致无法预料的后果。举例来说:
switch( mode ) {
case OPERATIONAL_MODE:
/* 切换到运行模式进行处理 */
break;
case BUILT_IN_TEST_MODE:
/* 切换到测试模式进行处理*/
break;
}
假设现在我们又添加了一种模式,但是上面的代码段没有及时得到更新,这时如果执行了这段代码,执行结果将无法预料。如果包括default部分,至少也能利用该部分在出现问题时通知调用者,即使在此放一个assert,也能在调试时捕获当时的状况。如下例所示:
switch( mode ) {
case OPERATIONAL_MODE:
/*切换到运行模式进行处理 */
break;
case BUILT_IN_TEST_MODE:
/* 切换到测试模式进行处理 */
break;
default:
assert(0);
break;
}
上述问题除了存在于switch语句外,还存在于if/then/else分支语句中。下面分别举例说明:
float coefficient = 0.0;
if (state == FIRST_STAGE) coefficient = 0.75;
else if (state == SECOND_STAGE) coefficient = 1.25;
作者的意图很明显,它是希望根据变量state的值的不同,也让变量coefficient取不同的值。但是如果变量state的值被破坏(比如遇到上面提到的缓冲区溢出的破坏),或者使它取了一个预期之外的值,那么变量coefficient的值就会一直是0.0。如果这是用来计算付费的话,后果的严重可想而知。因此,else分支语句至少应该包含一个分支用来捕获错误,例如:
float coefficient = 0.0;
if (state == FIRST_STAGE) coefficient = 0.75;
else if (state == SECOND_STAGE) coefficient = 1.25;
else coefficient = SAFE_ COEFFICIENT;
尽管许多情况下尾随的else分支不是必须的,但这样做无疑为我们的代码加了一把保护伞,以免铸成大错。 |
|