一份编程错误列表强调静态代码分析有其必要性

Program Verification Systems公司(针对C和C++的静态代码分析工具 PVS-Studio就是该公司的产品)发布了一份 编程错误列表,有些错误是从Chromium、TortoiseSVN、Apache HTTP Server和MySQL等流行的开源项目中发现的。

这份列表维护的编码错误有150多类,有的是严重的逻辑错误,有的是性能相关的问题,还有一些危害并不是很大。

下面是选自该列表的一些错误类型,示例代码都来自真实项目。

V502——或许‘?:’运算符的工作方式和想象中并不相同。该运算符的优先级比很多运算符都要低。

MongoDB:

string sysInfo() {
  ....
  stringstream ss;
  ....
  ss << (sizeof(char *) == 8) ? " 64bit" : " 32bit";
  ....
}

这是一个很好的例子。这段代码打印的是0或1,而非“32bit”或“64bit”。

V511——在如下表达式中,sizeof运算符返回的是指针的大小,而非数组的大小。

Chromium:

uint8 salt_[LINK_SALT_LENGTH];

VisitedLinkMaster::TableBuilder::TableBuilder(
    VisitedLinkMaster* master,
    const uint8 salt[LINK_SALT_LENGTH])
    : master_(master),
      success_(true) {
  fingerprints_.reserve(4096);
  memcpy(salt_, salt, sizeof(salt));
}

“salt”对象就是一个指针。方括号中的值LINK SALTLENGTH向程序员表明,他们正在使用的是一个包含LINK SALTLENGTH个元素的数组。但传递给函数的并不是数组——只是个指针。因此,表达式sizeof(salt)返回的值是4或8(32位或者64位系统上指针的大小)。

到目前为止,这个列表上列出的、出现于各种开源项目的错误,很多可能已经修复。因为任何程序员都难免出错,所以使用一个或多个静态代码分析工具处理一下源代码是个不错的建议。Wikipedia上有一个 页面,列出了很多针对不同语言的静态代码分析工具。

参考英文原文: An Errors List Underscores the Need for Static Code Analysis

相关厂商内容

黑客马拉松•杭州 12月15-16日-Hacking Different,名额有限,请速报名

《JavaScript语言精粹》作者Douglas Crockford确认参会

QCon北京Node.js专场:异步非阻塞,单线程,事件驱动,如何在企业应用落地发挥成效?

个性化推荐系统仅是大企业专利?如何正确实施,大幅提升企业生产力?尽在QCon推荐系统专题

相关赞助商

GitHub研发团队成员Corey Donoho QCon分享Github架构设计与团队合作, 详情请点击!

您可能也会喜欢

你可能感兴趣的:(编程,列表,错误)