zoukankan      html  css  js  c++  java
  • 软件工程:代码静态分析工具

    什么是静态代码分析工具呢?

    用一句最直白的话就是:在代码运行前的一个检查代码规范,错误等的分析并提出建议的工具

    这里有这么几个关键词:

    • 代码运行前:很明显,这个工具就是对文本代码进行分析的,不用编译等等
    • 检查:它是一个具有一定的分析智能的工具,可以分析出野指针,未达代码等错误的工具,而不是一个简简单单的类似于在一个IDE里开发,写错东西会提示的工具,它是这个东西的超超级加强版!
    • 静态分析是提出建议的,但并非所有的建议都是可取的,要理性对待(就像在Eclipse里的黄色警告,你都不一定会全部处理是一样的)
    这个工具可能会发现的错误:
    • 变量声明了但未使用
    • 变量类型不匹配
    • 变量在使用前未定义
    • 不可达代码
    • 死循环
    • 数组越界
    • 内存泄漏
    在什么情况下使用静态代码分析工具?
    • 代码审查
    • 代码自查
    • 代码规范
    • 代码编译前
     
    摘图:
    静态分析工具位置
    针对C语言的开源程序静态分析工具——splint

    splint

    掌握了“静态分析”等概念之后,我们再来看splint

    举一个小例子(摘文):

    在Linux命令行下,splint的使用很简单,检测文件*.c,只要这样使用就可以了:

    1. splint splint_msg.c
    splint消息

    我们通过以下例子来认识典型的splint告警信息:

    1. //splint_msg.c
    2. int func_splint_msg1(void)
    3. {
    4. int a;
    5. return0;
    6. }
    7. int func_splint_msg2(void)
    8. {
    9. int* a =(int*)malloc(sizeof(int));
    10. a = NULL;
    11. return0;
    12. }
    运行splint splint_msg.c之后,我们来看输出的告警信息:
    1. splint_msg.c:(in function func_splint_msg1)
    2. splint_msg.c:4:6:Variable a declared but not used
    3. A variable is declared but never used.Use/*@unused@*/ in front of
    4. declaration to suppress message.(Use-varuse to inhibit warning)
    5. splint_msg.c:(in function func_splint_msg2)
    6. splint_msg.c:10:2:Fresh storage a (type int*) not released before assignment:
    7. a = NULL
    8. A memory leak has been detected.Storage allocated locally is not released
    9. before the last reference to it is lost.(Use-mustfreefresh to inhibit
    10. warning)
    11. splint_msg.c:9:37:Fresh storage a created
    12. Finished checking ---2 code warnings

    蓝色字体部分:给出告警所在函数名,在函数的第一个警告消息报告前打印;

    红色字体部分:消息的正文,文件名、行号、列号显示在的警告的正文前;

    黑色字体部分:是有关该可疑错误的详细信息,包含一些怎样去掉这个消息的信息;

    绿色字体部分:给出格外的位置信息,这里消息给出了是在哪里申请了这个可能泄露的内存

    检查控制

    splint提供了三种方式可进行检查的控制,分别是.splintrc配置文件、flags标志和格式化注释。

    flags:splint支持几百个标志用来控制检查和消息报告,使用时标志前加’+‘或’-’,'+'标志开启这个标志,'-'表示关闭此标志,下面例子展示了flags标志的用法:

    splint -showcol a.c   //在检测a.c时,告警消息中列数不被打印
    splint -varuse a.c //在检测a.c时,告警消息中未使用变量告警不被打印

    .splintrc配置文件:在使用源码安装splint之后,.splintrc文件将被安装在主目录下,.splintrc文件中对一些标志作了默认的设定,命令行中指定的flags标志会覆盖.splintrc文件中的标志。

    格式化注释:格式化注释提供一个类型、变量或函数的格外的信息,可以控制标志设置,增加检查效果,所有格式化注释都以/*@开始,@*/结束,比如在函数参数前加/*@null@*/,表示该参数可能是NULL,做检测时,splint会加强对该参数的值的检测

    小结

    现在,几乎是每一种语言都有静态语言分析工具,每一种语言分析的工具的能力有大有小,可以作参考使用,另外,值得注意的是,现在的工具,都可以搭配在GUI的界面上了 ,它也不再是一个丑陋的命令行工具了,这个是为了提高生产效率考虑的,所以当你寻找静态分析工具时,尽量使用界面化的工具(如Eclipse的插件等)

  • 相关阅读:
    jvm 虚拟机参数_新生代内存分配
    jvm 虚拟机参数_堆内存分配
    Xshell 安装 Xftp
    使用 Xshell 连接 linux 系统
    linux 常用命令
    java JSON 和 Object 相互转换
    vsftp实现只能上传不能下载、删除权限配置
    从返回的HTTP Header信息中隐藏Apache的版本号及PHP的X-Powered-By信息
    在SecureCRT中无需输入密码登录Linux主机
    ssh 设置私钥实现两台linux主机无密码访问
  • 原文地址:https://www.cnblogs.com/xujintao/p/7232457.html
Copyright © 2011-2022 走看看