首页 > 其他分享 >代码静态检查

代码静态检查

时间:2023-05-23 20:22:59浏览次数:26  
标签:检查 静态 代码 Lint PC 内存

1、静态检查介绍
       代码检查可以有效的提高代码质量,更进一步的说代码检查不仅仅是为了提高代码质量,已深入到代码程序的逻辑检查、内存使用情况的检查甚至更高层面的检查,很大程度上影响了程序的功能和性能。
       代码检查分为:
       动态检查:程序运行时检查,侧重于内存和资源使用情况检查;
       静态检查:指不运行被测程序本身,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性。
       代码静态检查带来的好处:
      1. 帮助程序开发人员自动执行静态代码分析,快速定位代码隐藏错误和缺陷;
      2. 帮助代码设计人员更专注于分析和解决代码设计缺陷;
      3. 显著减少在代码逐行检查上花费的时间,提高软件可靠性并节省软件开发和测试成本。
      静态检查可以检测的问题有:
      变量未初始化;
      空指针引用(野指针);
      数据类型不匹配;
      返回局部变量;
      数组越界;
      内存泄漏;
      ……;
       如下实例,通过静态检查工具可以检查的错误信息(这些问题在代码编译的时候可能不会出现)。
#include <stdio.h>int main (int argc, char **argv)
{
 char  cBuf[10] = { 0 };
 char *pTemp;
 int   i;    for (i = 0; i <= 10; i++) {
     cBuf[i] = 0;
    }    printf("output %s\n", pTemp);    return  (0);
}        编译后没有出现报错提示,然后运行静态检查,会出现如下图所示报错现象。  图 1  静态检查错误信息 2、常用的静态检查工具
       静态检测工具种类很多,下面介绍几种常见的检测工具。
1、cppcheck
      Cppcheck是一种C/C++代码缺陷静态检查工具,不同于C/C++编译器及其它分析工具,Cppcheck只检查编译器检查不出来的bug,不检查语法错误,作为编译器的一种补充检查,cppcheck对产品的源代码执行严格的逻辑检查。 执行的检查包括:
      1.自动变量检查
      2.数组的边界检查
      3.class类检查
      4.过期的函数,废弃函数调用检查
      5.异常内存使用,释放检查
      6.内存泄漏检查,主要是通过内存引用指针
      7.操作系统资源释放检查,中断,文件描述符等
      8.异常STL 函数使用检查
      9.代码格式错误,以及性能因素检查
2、pc-lint
      PC-Lint是GIMPEL SOFTWARE公司开发的C/C++软件代码静态分析工具,它的全称是PC-Lint/FlexeLint for C/C++,PC-Lint能够在Windows、MS-DOS和OS/2平台上使用,以二进制可执行文件的形式发布,而FlexeLint 运行于其它平台,以源代码的形式发布。PC-lint在全球拥有广泛的客户群,许多大型的软件开发组织都把PC-Lint检查作为代码走查的第一道工序。
      PC-Lint不仅能够对程序进行全局分析,识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针以及冗余的代码,还能够有效地帮你提出许多程序在空间利用、运行效率上的改进点。
      pc-lint提供的检测类型:
      1.强类型检查
      2.变量值跟踪
      3.赋值顺序检查
      4.弱定义检查
      5.格式检查
      7.缩进检查
      8.const变量检查
      9.volatile变量检查
3、splint
      针对C语言的开源程序静态分析工具splint(原来的 LCLint), 是一个GNU免费授权的 Lint程序,是一个动态检查C语言程序安全弱点和编写错误的程序。Splint会进行多种常规检查,包括未使用的变量,类型不一致,使用未定义变量,无法执行的代码,忽略返回值,执行路径未返回,无限循环等错误。
      splint提供的检测类型有:
      1.解引用空指针(Null Dereferences)
         解引用空指针将导致我们在程序运行时产生段错误(Segmentation fault)。
      2.类型(Types)
         我们在编程中经常用到强制类型转换,将有符号值转换为无符号值、大范围类型值赋值给小范围类型,程序运行的结果会出无我们的预料
      3.内存管理(Memory Management)
         C语言程序中,将近半数的bug归功于内存管理问题,关乎内存的bug难以发现并且会给程序带来致命的破坏。
      4.缓存边界(Buffer Sizes)
         splint会对数组边界、字符串边界作检测,使用时需要加上+bounds的标志。
————————————————

标签:检查,静态,代码,Lint,PC,内存
From: https://www.cnblogs.com/ling7/p/17426276.html

相关文章

  • 红包雨的架构设计及源码实现 中奖代码设计 一般有用 看1
    1.项目介绍学习目标系统的功能、背景、场景及需求在架构角度思索系统可能面临的问题以及解决方案运用中间件特性,完成架构设计主业务源码分析微服务的部署与动态扩容1.1项目概述1.1.1概述京东的红包雨大家可能都参与过,在某段时间内随机发放不同的红包,如果公司让你设计类似......
  • 检查相同字母间的距离
    给你一个下标从0开始的字符串s,该字符串仅由小写英文字母组成,s中的每个字母都恰好出现两次。另给你一个下标从0开始、长度为26的的整数数组distance。字母表中的每个字母按从0到25依次编号(即,'a'->0,'b'->1,'c'->2,...,'z'->25)。在一个匀整字符......
  • perl 通过 swig 调用 c++ 代码
    perl通过swig调用c++代码  Swig是一个软件开发工具,可以简化不同语言与C/C++的交互(直接在其它语言的代码中调用C/C++的代码)。  记录一下成功用perl调用c++代码的例子。环境操作系统:centos7.9perl:version5.16.3swig:version2.0.10g++:version9.4.0......
  • 代码混淆及android配置
    1什么是代码混淆百度百科解释:代码混淆(Obfuscatedcode)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码。执行代码混淆的程序被称作代码混淆器。已经存在许多种功能各异的代码......
  • 控件包含代码块(即 <% ... %>),因此无法修改控件集合(用户自定义控件中)
    https://www.cnblogs.com/zlfucku/archive/2011/09/05/2167943.html原因:就是runat中不能有<%%>这样的东西,不然就会报这个错误解决办法: 这两行拖到body里就好了,不要放在有headrunat=server的代码块内,不然就报这个错。......
  • html转义代码,v-html 显示原始html字符串
    methods:  htmlEscape(str){   lets="";   if(str.length==0)return"";   s=str.replace(/&/g,"&amp;");   s=s.replace(/</g,"<");   s=s.replace(/>/g,">");......
  • 《梦断代码》读书笔记03
    我过去是怎么做的:对我来说,科技带来了很多好处,如便利的社交媒体、快速的信息交流和新兴的技术创新等等。因此,我一直认为,科技公司为人类带来了很多的利益和希望,并且可以继续推动社会的进步与创新发展。这样做为什么不好:但在阅读《梦断代码》后,我开始看到了科技行业存在的难题和负......
  • 代码随想录算法训练营第十四天|144. 二叉树的前序遍历、145. 二叉树的后序遍历、94.
    【参考链接】1.满二叉树,完全二叉树,二叉搜索树(有数值,有序树)。2.平衡二叉搜索树:又被称为AVL(Adelson-VelskyandLandis)树,且具有以下性质:它是一棵空树或它的左右两个子树的高度差的绝对值不超过1,并且左右两个子树都是一棵平衡二叉树。3.优先级队列其实是一个堆,堆就是一棵完全二叉......
  • 源代码管理工具GitHub介绍
    GitHub是一个基于Web的Git代码托管平台,该平台提供的服务包括代码托管、代码审查、协作、项目管理等,旨在帮助开发者更加方便地进行软件开发和协作。下面主要从GitHub主要页面功能和如何利用GitHub辅助完成团队项目两个方面进行简单的介绍。1.Git和GitHubGit和GitHub是两个东......
  • 代码设计-工厂化模式
    第一版本每个资源的每个方法都是分开的资源和资源是分开的资源的方法和资源的方法也是不相干的示例中涉及的资源是task和servicepackagemainimport( "github.com/gin-gonic/gin")//task结构体typeTaskstruct{ Namestring Descriptionstring}//定义tas......