写点什么

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

  • 2012-12-19
  • 本文字数:761 字

    阅读完需:约 2 分钟

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

2012-12-19 08:282952
用户头像
臧秀涛 略懂技术的运营同学。

发布了 300 篇内容, 共 151.2 次阅读, 收获喜欢 35 次。

关注

评论

发布
暂无评论
发现更多内容

IT培训机构那些不得不说的事儿

C语言技术网-码农有道

IT培训机构

LeetCode 565: Array Nesting

隔壁小王

算法

Centos的初步配置

玉龙BB

Docker Linux Docker-compose Centos 7

Linux初学-01

Flychen

DataGrip常用快捷键

fliter

生活不奖赏心血来潮

池建强

个人成长 写作

聊聊我对开源的理解

zygfengyuwuzu

开源

早起实操手册

超超不会飞

效率 生活 自律

NIO 看破也说破(二)—— Java 中的两种BIO

小眼睛聊技术

Java 学习 程序员 架构 编程语言

死磕Java并发编程(8):CurrentHashMap如何实现高效地线程安全?在Java8中有哪些设计实现的演进?

Seven七哥

Java Java并发 ConcurrentHashMap

Python 中怎样合并数据

张利东

Python

部署Hexo博客到VPS

ini

SpringIOC源码篇-Bean实例化-Spring如何选择类构造器(1)

申屠鹏会

Java Spring Boot

Netty 源码解析(六): Channel 的 register 操作

猿灯塔

1分钟理解M2M和IoT概念

老任物联网杂谈

物联网 M2M IoT

断章取义,不一样的C/C++语言的学习策略

C语言技术网-码农有道

C/C++

企业招聘的需求决定了C/C++程序员的学习方向

C语言技术网-码农有道

C/C++

我们迫切需要块状时间

Neco.W

效率 时间分配 时间管理 工作效率 提升效率

LeetCode 153. Find Minimum in Rotated Sorted Array

隔壁小王

算法

原创 | 使用JUnit、AssertJ和Mockito编写单元测试和实践TDD (一)什么是单元测试

编程道与术

职场发展的思考

子不语

生涯规划 职业规划

从草根到百万年薪C/C++程序员的二十年风雨之路

C语言技术网-码农有道

c++ 编程语言 C语言

产品周刊 | 第 13 期(20200503)

八味阁

产品 设计 产品经理 产品设计

原创 | 类应该是匀称和均匀的

编程道与术

零基础、非计算机相关专业的如何转型程序员

C语言技术网-码农有道

程序员 转型

面试考试可用,十大排序算法

我不自豪谁志豪

学习 面试 算法

终端Terminal:程序员是如何查询天气预报的?

lmymirror

GitHub 工具 命令行 terminal 终端工具

从2009到2020,世界编程语言排行榜分析

C语言技术网-码农有道

编程语言

中年危机,我们如何面对?

石云升

如何消除写作过程中的痛苦,让写作变成一种享受

董一凡

写作

新人怎么寻求解决问题的方法

波波

编程 职场 新人

一份编程错误列表强调静态代码分析有其必要性_语言 & 开发_Abel Avram_InfoQ精选文章