BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

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

| 作者 Abel Avram 关注 7 他的粉丝 ,译者 臧秀涛 关注 2 他的粉丝 发布于 2012年12月20日. 估计阅读时间: 3 分钟 | Google、Facebook、Pinterest、阿里、腾讯 等顶尖技术团队的上百个可供参考的架构实例!

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_SALT_LENGTH向程序员表明,他们正在使用的是一个包含LINK_SALT_LENGTH个元素的数组。但传递给函数的并不是数组——只是个指针。因此,表达式sizeof(salt)返回的值是4或8(32位或者64位系统上指针的大小)。

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

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

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT