开源静态代码检测工具Splint

2023-11-11

 如果想用一个有效的工具察看C/C++源代码中的错误,遗漏,不确定的构建过程,以及移植问题等等,你应该来看看Lint。可以把Lint当成一个编译器,除了不产生代码之外,对于错误和警告的报告来说已经非常足够了。


通常,一个C/C++的编译器假设程序是正确的,而Lint恰恰相反,因此它优于编译器执行的一般性检查。Lint还可以贯穿多个文件来执行它的错误检查和代码分析,这是编译器做不到的。

下面是Lint能够检查的部分错误列表。如果你幸运的话,你的编译器也可以检查出其中的一些,但不会使全部。

可能的空指针
在释放内存之后使用了该指针
赋值次序问题
拼写错误
被零除
失败case 语句 (遗漏了break语句)
不可移植的代码
宏定义参数没用使用圆括号
符号的丢失
异常的表达式
变量没有初始化
可疑的判断语句(例如, if (x = 0))
printf/scanf 的格式检查
现有的 Lint 程序
这是两个流行的Lint 程序:

PC-lint是一个由Gimpel Software提供的支持C/C++的商用程序。
Splint (原来的 LCLint) 是一个GNU免费授权的 Lint程序,但是只支持C不支持C++.
Lint 的运行
运行 Lint 跟运行一个正常的编译器一样,只要把直接加入的makefile 中就可以了。在便以前后都可以运行它。

尽管在编译前运行它看起来更有意义,但有时在成功变以后执行更有价值。这意味着,编译器报告了例如键盘输入错误等各种错误,而Lint在已编译的代码上给与更多的检查。

当使用Lint的时候,不要为他报告的错误及告警信息的数目而惊慌失措。通过学习怎样控制Lint的输出你就不会着这样了。

简单的说
lint是检查你的c文件有没有语法错误的

编译器也可以检查
不过lint检查的更多

如下面这些错误 编译器多数不会报错 最多只会出warning 有很多也不会出warning 因为它们符合语法 只是得到的结果与你想得到的结果不一样


可能的空指针
在释放内存之后使用了该指针
赋值次序问题
拼写错误
被零除
失败case 语句 (遗漏了break语句)
不可移植的代码
宏定义参数没用使用圆括号
符号的丢失
异常的表达式
变量没有初始化
可疑的判断语句(例如, if (x = 0)) ========特别是这个 最危险的地方而编译器不会报错
printf/scanf 的格式检查 ======这个也危险

使用lint可以为自己的代码减少这样的错误

输出控制

通过一系列方法可以控制和校准Lint的输出:

配置选项:通过命令行参数或一个配置文件,你能发现有上百个选项可以优化输出。
代码注释:在你的代码中可以为Lint加入特殊的注释。这样可以非常好的控制你希望检查的代码,例如,这里有一个返回NULL指针的函数, Splint可以通过下面的注释 /*@null@*/ 来识别:
/*@null@*/ void *test(void)
{
// a function that returns NULL!
return NULL;
}

这有两个目的: 1)防止Splint 为这个返回Null指针的函数高景,2)保证Splint 检查任何调用该函数的代码中使用该函数的返回指针是有效的。 (虽然Splint和PC-lint 有着不同的代码注释约定,但基本原理是相同的。)

同样对这个问题而言,使用全局的配置选项“-nullret”可以屏蔽掉所有的null指针检查,从而不用增加那些柱石,缺点是由你的代码将被检查的不彻底。然而,这种方法有时候是必需的,尤其是在某些现存的代码上第一次使用Lint。

缓慢启动
你怎样启动Lint呢?最好在一个项目中尽早地开始使用Lint, 尤其是在你已经生成了大量的未检查代码之前。如果没这样做,将会使效率降低。

打开编译器中的严格告警,一旦你的代码没有被编译器发现任何告警,启动Lint。然后逐渐地增加Lint测试的严格性,同时在需要的地方增加代码注释。有效的使用Lint需要时间,但这种努力是值得的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

开源静态代码检测工具Splint 的相关文章

  • VHDL 中的 NULL 语句

    其实际目的是什么nullVHDL 中的声明 考虑以下代码 1 CASE s IS BEGIN WHEN 0 gt y lt 0 WHEN 1 gt NULL END CASE 2 CASE s IS BEGIN WHEN 0 gt y lt
  • 为什么我的 Spring @Autowired 字段为空?

    注意 这旨在成为常见问题的规范答案 我有一个春天 Service class MileageFeeCalculator 有一个 Autowired field rateService 但该字段是null当我尝试使用它时 日志显示 两个Mil
  • 使用 jQuery getJSON 时 JSON Feed 返回 null

    http portlandonline com shared cfm json cfm c 27321 http portlandonline com shared cfm json cfm c 27321 它返回 null 我真的无权接触
  • 比较()中的空字段该怎么办?

    在Java中 我使用一个类 其中一些字段可以null 例如 class Foo String bar 我想为这个类写一个BarComparator private static class BarComparator implements
  • WordPress 数据库 insert() 和 update() - 使用 NULL 值

    WordPress 附带wpdb处理 CRUD 操作的类 我感兴趣的这个类的两个方法是insert CRUD 中的 C 和update CRUD 中的 U 当我想将 NULL 插入 mysql 数据库列时出现问题 wpdb类将 PHP 空变
  • 在 Android Studio 中丢失对静态数据的引用

    当我的应用程序进入后台时 我遇到静态数据实例丢失的问题 从而导致空指针异常错误 静态数据非常依赖于上下文或 状态 并且通常不能在初始化时生成 为了确保我保留这些数据 我是否会被迫将数据写入存储 或者是否有其他方法来确保我的静态数据在应用程序
  • 如何将空日期变量传递到 SQL Server 数据库

    我正在寻找最佳实践 真正的解决方案 以发送Null当日期未知时 到 SQL Server 2008 R2 数据库表 我从表单视图中读取了一些输入 并且日期字段可能未知 数据库允许字段中存在 Null 值 但 VB 在参数化查询更新之前存储
  • 空值并不唯一

    我在 postgres 上有这样的行 name address college john rome john rome max tokyo 我创建一个这样的表 create test name varchar 10 address varc
  • Rails:最后以空值排序

    在我的 Rails 应用程序中 我多次遇到一个问题 我想知道其他人是如何解决的 我有某些记录 其中值是可选的 因此某些记录具有值 而某些记录对该列为空 如果我在某些数据库上按该列排序 则空值首先排序 而在某些数据库上 空值最后排序 例如 我
  • 从空整数到逗号列表中的指针的转换

    我知道在我们的现代世界中 NULL 和 0 并不是指针操作的最佳实践 根据 cppreference 指针转换 空指针常量 参见 NULL 可以是 转换为任意指针类型 结果为空指针 该类型的值 这种转换 称为空指针转换 允许作为单个转换转换
  • C++ 无法将指针对中的指针初始化为 NULL

    我正在使用 g 4 4 7 进行编译 目前不能再更高 并使用 std gnu 0x编译器开关 它应该允许第三行的语法 typedef std vector
  • 字符串终止符'\0'如何与整数常量0具有相同的值?

    我有以下代码 include
  • Moshi/Kotlin - 如何将 NULL JSON 字符串序列化为空字符串?

    我正在尝试编写一个空安全字符串适配器来序列化此 JSON nullString null 进入这个 Model nullString 这样我希望是字符串的任何带有 null 值的 JSON 都将被替换为 假设存在这样的数据类 data cl
  • 我想向我的销售点的用户授予特权,但我不知道如何做,有什么建议吗?

    我有一个问题 我有一个用netBeans制作的销售点系统 2个用户可以在我的系统中注册 管理员 和 供应商 系统中有几个模块 包括 Inventario 模块允许您在数据库中输入 修改 删除和搜索文章 问题是我希望只有管理员有权限进入该模块
  • 如何通过 JOIN 组合(合并)相似的列以删除 NULL

    问题简介 我有一个名为 客户 的超类表和两个从客户继承的名为 个人 和 公司 的子表 因此 客户实体与 人 或 公司 具有一对一的关系 客户只能是 个人 或 公司 但不能同时是两者 如下所示 Customer Person Company
  • 在C语言中,NULL指针和指向0的指针有区别吗?如果是这样,那又怎样?

    在C语言中 NULL指针和指向0的指针有什么区别 ISO IEC 9899 TC2 中规定6 3 2 3 Pointers 3 值为 0 的整型常量表达式 或这样的表达式 强制转换为 void 类型 称为空指针常量 55 如果 null 指
  • 如何检查 GAS 中是否存在文件(通过 id)

    我知道有关如何检查文件是否存在的问答by name using hasnext 不过我需要检查一下按文件 ID 最好没有高级 Drive API 披露 我写了一个基于错误处理的解决方案 function ifFileExists id tr
  • 如何在 jQuery 中检查 null 对象

    我正在使用 jQuery 我想检查页面中是否存在某个元素 我写了以下代码 但它不起作用 if btext i null alert btext i text btext i text Branch i 如何检查元素是否存在 检查jQuery
  • PySpark 用数组替换 Null

    通过 ID 连接后 我的数据框如下所示 ID Features Vector 1 50 Array 1 1 2 3 2 50 Null 我最终得到 向量 列中某些 ID 的空值 我想用 300 维的零数组替换这些 Null 值 与非空向量条
  • 原则 2 OneToMany 级联 SET NULL

    错误 无法删除或更新父行 外键约束失败 课程 class Teacher ORM OneToMany targetEntity publication mappedBy teacher protected publications clas

随机推荐

  • 终于刷进去了联想官方固件

    联想官方社区 第四步 设置检验所有校验和 解决 tool dl image fail 若解决线刷时出现BROM ERROR S COM PORT OPEN FAIL 1013 教程 找不到端口 多试试吧 重启电脑 重换插口 重装驱动 注意
  • 基于netty游戏服后台搭建

    项目要转游戏开发了 所以搭个游戏服 游戏一般是长连接 自定义协议 不用http协议 BIO NIO AIO这些我就不说了 自己查资料 我现在用spring netty搭起简单的游戏服 思路 1自定义协议和协议包 2spring netty整
  • python元组列表里追加元素_Python元祖 tuple 内部列表添加元素相关

    面试python遇到的一道数据类型基础题 我们都知道python中不可变类型有tuple 但是如果tuple里面的列表增加元素会怎么样呢 先看代码 a 1 2 3 4 5 print a 3 4 5 a 3 append 6 print a
  • 学习笔记(5):MySQL数据库从入门到实战应用-数据完整性

    立即学习 https edu csdn net course play 27328 362521 utm source blogtoedu 实体完整性 要求每张表都有唯一标识符 每张表主键字段不为空且不能重复 唯一性约束 主键约束 标识列
  • MVC框架增删改查

    mvc对表单内容的增删改查 1 首先把所需的包导入项目内 2 连接数据库的帮助类DBAccess package com Liuyujian Dao import java io InputStream import java sql Co
  • 邮件服务器-postfix服务器

    Postfix 是一种电子邮件服务器 它是由任职于IBM华生研究中心 T J Watson Research Center 的荷兰籍研究员Wietse Venema为了改良sendmail邮件服务器而产生的 最早在1990年代晚期出现 是一
  • Java设计模式之策略模式+工厂模式(反射和注解)

    现在我们有一个需求 我们通常的实现方式是这样的 假设有3种会员 分别为会员 超级会员以及金牌会员和普通顾客 针对不同类别的会员 有不同的打折方式 并且一个顾客每消费10000就增加一个级别 以上四种级别分别采用原价 普通顾客 九折 会员 八
  • [Android] Toast问题深度剖析(二)

    欢迎大家前往云 社区 获取更多腾讯海量技术实践干货哦 作者 QQ音乐技术团队 题记 Toast 作为 Android 系统中最常用的类之一 由于其方便的api设计和简洁的交互体验 被我们所广泛采用 但是 伴随着我们开发的深入 Toast 的
  • ORA-00936: missing expression

    关注微信公共号 小程在线 关注CSDN博客 程志伟的博客 造成这个错误的原因是 选取的最后一个字段与from之间有逗号 解决方法 将字段与from之间的逗号去掉
  • Spring MVC使用JSON的过程与步骤

    活动地址 CSDN21天学习挑战赛 目录 JSON数据交互 RESTful支持 JSON数据交互 1 用eclipse创建一个动态web项目 将项目依赖的jar包放到lib目录下 2 在WEB INF目录下创建web xml 对Spring
  • 关于JPEG的那点事儿:JPEG原理篇

    前言 本文其实于差不多正好1年前写成 是关于JPEG的那点事儿的补充 但是由于实战篇一直烂尾 拖到现在 前几天看到Google发了个JPEG新算法 说是可以将JPEG的体积同质量情况下再压缩35 突然想起了这文了 为了说清楚Google为什
  • python题目55:单词接龙

    单词接龙的规则是 可用于接龙的单词首字母必须要与前一个单词的尾字母相同 当存在多个首字母相同的单词时 取长度最长的单词 如果长度也相等则取词典序最小的单词 已经参与接龙的单词不能重复使用 现给定一组全部由小写字母组成的单词数组 并指定其中的
  • 勿以专家自居

    对于权威 我心存芥蒂 我在 StrongOpinions Weakly Held 观点鲜明 但不固执己见 一文中曾经说过 当我了解到别人把我视为专家或者权威 而不是像伙伴一样的志趣相投者时 我就会觉得非常困扰 如果非要说我在迄今为止的职业生
  • PCL学习之点云可视化:坐标字段、随机、单一颜色、法向量

    pcl中几种常见的点云渲染方式 1 颜色区别深度 此方法在PointCloudColorHandlerGenericField类中实现 该将不同的深度值显示为不同的颜色 实现以颜色区分深度的目的 PointCloudColorHandler
  • TCP/IP校验和计算算法

    ICMP IP UDP TCP报头部分都有checksum 检验和 字段 ICMP和IP报头校验和的计算都很简单 过程如下 1 把校验和字段置为0 2 对IP头部中的每16bit进行二进制求和 3 如果和的高16bit不为0 则将和的高16
  • ubuntu16.04\18.04安装Azure Kinect SDK+配置ros版 超全详细踩坑记录

    一些参考 1 官网教程Azure Kinect Sensor SDK 官网教程Azure Kinect ROS Driver 2 Azure Kinect SDK Ubuntu 16 04 18 04安装配置方法 3 ubuntu16 04
  • 无监督学习分类

    把输入数据看成一个行 m 为特征 列 N 为样本的矩阵 则从数据角度 可以将无监督学习分为三类 将数据按列划分 即将相似的样本聚到同类 即对数据进行聚类 代表算法k means 层次聚类 将数据按行划分 把高维空间的向量转化到低维空间的向量
  • 《吃透 MQ 系列》之Kafka精妙的高性能设计(下篇)

    在 上一篇文章 中 指出了高性能设计的两个关键维度 计算和 IO 可以将它们理解成 道 同时给出了 Kafka 高性能设计的全景图 可以理解成 术 图 1 Kafka 高性能设计的全景图 这篇文章将继续对存储消息和消费消息的 8 条高性能设
  • 基于C语言的栈

    基于王道数据结构 include
  • 开源静态代码检测工具Splint

    如果想用一个有效的工具察看C C 源代码中的错误 遗漏 不确定的构建过程 以及移植问题等等 你应该来看看Lint 可以把Lint当成一个编译器 除了不产生代码之外 对于错误和警告的报告来说已经非常足够了 通常 一个C C 的编译器假设程序是