浅谈C语言中存在的陷阱和缺陷

发表于:2011-9-07 10:05

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:未知    来源:51Testing软件测试网采编

分享:

  5、库函数signal

  从理论上说,一个信号可能在C程序执行期间的任何时刻上发生,甚至可能出现在某些复杂的库函数(如malloc)的执行过程中。

  因此从安全的角度讲,信号的处理函数不应该调用上述类型的库函数。基于同样的原因,从signal处理函数中使用longjump退出,通常情况下也是不安全的:因为信号可能发生在malloc 或者其它库函数开始更新某个数据结构,却又没有最后完成的过程中。因此signal处理函数能够做的安全的事情,似乎就只有设置一个标志然后返回,期待以后主程序能够检查到这个标志,发现一个信号已经发生。

  然而,就算这样做也并不总是安全的。当一个算术运算错误引发一个信号时,某些机器在signal处理函数返回后还将重新执行失败的操作。因此对于算术运算错误,signal处理函数的惟一安全、可移植的操作就是打印一条出错消息,然后使用longjump或exit立即退出程序。

  当一个程序异常终止时,程序输出的最后几行常常会丢失,原因是缓冲。

  预处理器:

  1、不要忽视宏中的括号。

  2、宏不是函数。将宏中的参数都加上括号,将整个结果表达式也括起来。防止副作用。

  3、宏不是语句:#define assert(e) ((void)((e)||_assert_error(_FILE_,_LINE_)))

  4、宏不是类型定义;不要用#define定义类型,而是用typedef定义新类型。

  可移植性:

  1、因为字符串常量可以用来表示一个字符数组,所以在数组名出现的地方都可以用字符串常量末端替换。 如: "0123456789"[n%10]

  2、注意C标准的变化,新特性的使用。

  3、c标准所能保证的只是,c实现必须能够区别出前6个字符不同的外部名称,且并没有要求区分大小写。避免诸如:print_char(),print_int()等

  4、整数长度的相对长度规定:short类型的值肯定能被int型容纳,int型肯定能被long型整数容纳;一个普通(int类型)整数足够大以容纳任何数组下标;字符长度由硬件特性决定。

  5、随机数最大值:RAND_MAX

  希望通过以上内容的介绍,能给你带来一定的帮助,帮助你认清一些小知识的真相。

33/3<123
重磅发布,2022软件测试行业现状调查报告~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2023
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号