AICon上海|与字节、阿里、腾讯等企业共同探索Agent 时代的落地应用 了解详情
写点什么

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

  • 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:282651
用户头像
臧秀涛 略懂技术的运营同学。

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

关注

评论

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

Vue SSR(server side render)

Jeannette

架构训练营 -- 模块二

LJK

架构训练营

EasyRecovery如何恢复虚拟建模软件的数据文件

淋雨

EasyRecovery

Javascript实现一个Module

Jeannette

Web/Css 预处理语言的 Less 的使用 02

Jeannette

Web/Css 预处理语言的 Less 的使用 03

Jeannette

040022-week6-design

InfoQ_70156470130f

dart系列之:如丝滑般柔顺,操作文件和目录

程序那些事

flutter io dart 程序那些事 12月日更

模块八作业

bob

「架构实战营」

小程序开通cms可视化网页后台

坚果

小程序 28天写作 12月日更

在线JSON转jsdoc工具

入门小站

工具

从0开始设计Twitter系统架构

俞凡

twitter 架构 微服务 大厂实践

架构训练营 - 模块七

Geek_9de3de

架构实战营

聊聊 Kafka:Producer Metadata 读取与更新机制

老周聊架构

云原生 Apache Pulsar 签约计划第二季 2月月更

Web/Css 预处理语言的 Less 的使用 04

Jeannette

【LeetCode】三数之和双指针Java题解

Albert

算法 LeetCode 12月日更

HubSpot company数据在UI上的展示和通过API方式进行获取

汪子熙

Cloud 28天写作 SAP 12月日更

模块6作业

Geek_cb2b43

❤️使用 HTML、CSS 和 JavaScript 的简单模拟时钟❤️

海拥(haiyong.site)

JavaScript 大前端 28天写作 签约计划第二季 12月日更

Trino通过Iceberg创建表的过程分析

漫长的白日梦

数据湖 iceberg trino

Web/Css预处理语言的Less的使用01

Jeannette

架构实战营 - 模块6 - 作业

lucian

架构实战营

电商系统设计

michael

#架构实战营

Dubbo框架学习笔记一

风翱

dubbo 12月日更

测试敏捷化 vs 敏捷测试

BY林子

敏捷测试 测试敏捷化

Linux之pwd命令

入门小站

Linux

模块6作业

忘记喝水的猫

架构训练营

架构实战营总结

michael

#架构实战营

聊聊 Kafka: Producer 的网络模型

老周聊架构

签约计划第二季

初探.net core微服务架构

为自己带盐

Consul dotnet 28天写作 12月日更

Go+ HTTP 服务器教程(5.2)

liuzhen007

28天写作 12月日更

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