编程精粹
最新书摘:
-
豆友666185022013-02-18避免调用返回错误的函数
-
豆友666185022013-02-18上面的代码是经典哑头(dummy header)链表插入算法的变形,这个算法因为不需要任何特殊代码来处理空列表而著名。
-
豆友666185022013-02-18不要接受具有特殊意义的参数按照设计来实现而不能近似地实现努力使每个函数一次就完成任务
-
豆友666185022013-02-18记住一个原则不要在表达式中使用“简单的”字符。由于位域也有同样的问题,因此也有一个类似的原则:任何时候都不要使用“简单的”位域。
-
豆友666185022013-02-18这段代码,由于最后一行的比较操作而失去了可移植性。只要用户使用了“<”操作符或其它要用有符号信息的操作符,就迫使编译程序产生不可移植的代码。修改 strcmp 很容易,只须声明 strLeft 和 strRight 为无符号字符指针,或直接将其填在比较式中:
-
豆友666185022013-02-18要记住,消除限制就是消除捕获相应错误的机会,所以一个良好的准则是,一开始就要为函数的输入选择严格的定义,并最大限度地利用断言。这样,如果过后发现某个限制过于苛刻,可以把它去掉而不至于影响到程序的其它部分。
-
豆友666185022013-02-18之所以该函数在相应应用程序中能够工作,是因为该应用程序使用 memset 来把内存块填写为 0, 而 0 << 24 则仍是 0,所以结果正确
-
豆友666185022013-02-18不要把对交付版本的约束应用到相应的调试版本上;要用大小和速度来换取错误检查的能力
-
Felven2012-07-10realloc改变先前已分配的内存块的大小,该内存块的原有内容从该块的开始位置到新块和老块长度的最小长度之间得到保留。 如果该内存块的新长度小于老长度,realloc释放该块尾部不再想要的内存空间,返回的pv不变。 如果该内存块的新长度大于老长度,扩大后的内存块有可能被分配到新的地址处,该块的原有内容被拷贝到新的位置。返回的指针指向扩大后的内存块,并且该块扩大部分的内容未经初始化。 如果满足不了扩大内存块的请求,realloc返回NULL,当缩小内存块时,realloc总会成功。 如果pv为NULL,那么realloc的作用相当于调用malloc(size),并返回指向新分配内存块的指针,或者在该请求无法满足时返回NULL。 如果pv不是NULL,但新的块长为零,那么realloc的作用相当于调用free(pv)并且总是返回NULL。 如果pv为NULL且当前的内存块长为零,结果无定义
-
Felven2012-07-10对代码进行逐条跟踪的真正作用是它可以使我们观察到数据在函数中的流动。如果在对代码进行逐条跟踪时密切地注视数据流,就会帮助你查出下面这么多的错误: 上溢和下溢错误; 数据转换错误; 差1错误; NULL指针错误; 使用废料内存单元错误(0xA3类错误); 用 = 代替 == 的赋值错误; 运算优先级错误; 逻辑错误。
-
Felven2012-07-05“不要让事情很少发生。”因此我们需要确定子系统中可能发生哪些事情,并且使它们一定发生和经常发生。如果发现子系统中有极罕见的行为,要干方百计地设法使其重现。
-
Felven2012-07-04当编写代码时,要抓住一切机会对程序的结果进行验证(调用所有其它函数的瓶颈函数,是特别适于进行这种检查的好地方)。要尽可能地使用不同的算法,而目要使其不仅仅是同一算法的又一实现。通过使用不同的算法不仅可以发现算法实现中的错误,而且还增加了发现算法本身错误的可能性.
-
Felven2012-07-03在写断言的注解时,不必长篇大论。一般的方法时使用经过认真考虑过的间断文句,它可能比用一整段的文字系统地解释出每个细节地指导性更强。但要注意,不要在注解中建议解决问题的办法,除非你能确信它对其他程序员确有帮助。做注解的人当然不想让注解把别人引入歧途。
-
Felven2012-07-03对于程序员来说,无定义的特性就相当于非法的特征,因此要利用断言对其进行检查
-
Felven2012-07-03如果你发现自己正打算绕过某个步骤。而它恰恰可以很容易地用来查错,那么一定要阻止自己绕过。相反,要利用所能得到的每个工具进行查错。此外,单元测试虽然意味着查错,但如果你根本就不进行单元测试也是枉然。
-
Felven2012-07-03在原型中使用更精确类型的缺陷是常常必须进行参数的显式类型转换,以消除类型不匹配的错误,即使参数的次序正确。
-
凌空2012-02-04暴露错误的关键是消除错误发生的随机性。