精华内容
下载资源
问答
  • 程序静态分析(Program static analysis)是指在不执行代码情况下, 通过词法分析、语法分析、语义分析、控制流、数据流分析等技术对源代码进行扫描。


    1 前言

      对于大型C/C++项目,一般是以团队分模块开发的方式,代码量数十万或者更多。由于代码量的激增以及开发人员众多,代码出现bug的概率也随之增加。——这是一个数学上概率论的问题,而不是程序员的编码技术问题。其中一部分问题是非执行过程引起的静态问题,如内存泄露、内存越界、野指针、逻辑模糊、死锁等等,在发布代码前可以借助一些检测工具进行代码分析,以排除静态bug。除了检查代码静态bug外,还可以判断代码复杂度、代码质量、代码执行效率等等,作为提高代码质量的依据。


    2 什么是静态分析

       程序静态分析(Program static analysis)是指在不执行代码情况下, 通过词法分析、语法分析、语义分析、控制流、数据流分析等技术对源代码进行扫描,验证代码是否满足规范性、安全性、可靠性、可维护性等指标的一种代码分析技术。 通过对代码进行审查分析,检查代码的功能、性能,提升代码质量。静态分析有两种方式,分别是人工审查和软件工具分析。


    • 人工审查,依赖于人,适合于小型项目或者代码量不大的场景;效率低、易遗漏

    • 软件工具分析,理想的方式, 准确率、可靠性、效率都远高于人工审查


    3 静态分析方法

    • 词法分析,依次对代码的字符流进行扫描,通过正则表达式方法将源码转换为等价符号,并生成符号列表。

    • 语法分析,该方法主要分析源代码结构的正确性,将上下文无关联语法的符号整理成语法树。

    • 抽象语法树分析,将源代码组织生成树形结构,关联代码以树的节点表示。

    • 语义分析,主要审查结构上正确的源代码,分析代码上下文相关联的性质。

    • 控制流分析,该方法反映函数的嵌套关系,可以生成函数调用关系图;通过分析源代码,生成有向控制流图,节点表示基本代码块,节点间的有向边表示流控路径,反向边表示可能存在的循环。

    • 数据流分析,对“控制流分析”生成的控制流图进行遍历分析,记录变量初始化点和引用点,并保存为切片相关的数据信息,生成数据流图。

    • 污点分析,对“数据流分析”生成的数据流图反推断出源代码中可能受“攻击”的变量,识别代码中可能存在的缺陷。

    • 无效代码分析,“控制流分析”生成的控制流图中,无边向的孤立节点即为无效代码,通过该方法,可以检测代码逻辑问题。


    4 静态分析内容

      大多数情况下,静态分析的对象都是程序源代码,少数情况会使用编译后的目标代码(可执行文件)。静态分析的内容,根据具体分析的对象,大致可以归为三类:

    【1】致命类(内存相关)

    【2】逻辑类

    【3】编码规范与其他类


    4.1 内存相关

      由于C/C++支持指针,通常有程序员来动态管理内存,这就可能导致内存泄露问题的产生。典型内存相关问题如下:

    • 访问没有申请内存的空指针(空指针)
    • 访问已释放内存的指针(野指针)
    • 内存越界访问
    • 内存泄露,申请了内存没有释放
    • 重复释放内存
    • 文件描述符泄漏(未释放)
    • 格式化字符串不安全(内存越界)

      关于内存问题的检查,也常常使用Valgrind工具检查,可参考文章如何使用Valgrind检测内存泄漏


    4.2 逻辑类

    • 逻辑错误,重复代码分支、缺少分支语句(如switch缺少break)、变量比较类型不一致、常true或false
    • 运算错误,除0运算、无符号数小于0、bool类型自加
    • 可疑检查,死循环、死锁、if语句“=”问题、返回局部变量、变量溢出

    4.3 编程风格与其他

    • 编程风格,命名、规范性、可读性、可移植和复用性
    • 执行问题,函数未使用、变量未使用、代码不可到达(提前return
    • 隐患问题,语法问题、逻辑模糊问题、类型强制转换、编译警告、volatile问题
    • 效率问题,时间复杂度、空间复杂度、逻辑循环、
    • 标准行业规范,如MISRA C

    5 常用静态分析工具


    工具 支持语言 支持平台 权 授 说明
    AdLint C Linux、Windows、Mac OS 开源 代码质量评估可视化,支持多种软体品质测量
    Coverity Prevent C/C++、C#、JAVA Linux、Windows、Mac OS 付费 提供多种辅助工具,专长于最准确的找到最严重和最难检测的缺陷
    Flawfinder C/C++ Linux、Windows 开源 使用用Python编写的c/c++程序安全审查工具;词法扫描和分析,内嵌了一些漏洞数据库,如缓冲区溢出、格式化串漏洞等,扫描快,按照代码中漏洞的风险等级对漏洞进行划分,可以快速找到存在的问题
    Klocwork C/C++、C#、JAVA Linux、Windows 付费 国内使用较广泛的分析工具
    Rats C/C++、Python、Perl、 PHP Linux、Windows 开源 扫描规则比较粗糙
    PC-Lint C/C++ Windows 付费 一个由Gimpel Software公司提供的支持C/C++的商用静态分析器
    Cppcheck C/C++ Linux、Windows 开源 支持图形界面和命令行
    Splint C Linux 开源 静态检测针对C语言的安全工具和漏洞检测;Splint支持多种常规检查
    cqual C/C++ Linux 开源 轻量级的静态分析器,可在类Linux系统下运行
    BLAST C Linux 开源 采用反例驱动的自动抽象精细化方法,构建了一个抽象模型,并对模型的安全性能进行了验证的C语言分析器
    Frama-C C Linux、Windows、Mac OS 开源 针对C语言的静态分析器
    ITS4 C/C++ Linux、Windows 开源 Cigital公司开发的自动化源码审查工具;但它不能理解程序上下文意思,存在很大的误报
    CoBot C/C++ Linux、Windows 开源 北京大学开发,中国首家通过CWE认证的软件安全检测工具
    TscanCode C/C++、C#、Lua Linux、Windows、Mac OS 开源 腾讯开发的静态分析工具

    推荐使用:

    CoBot、TscanCode、Cppcheck、Flawfinder

      个人使用首选开源工具;付费的功能很强大,但费用都比较昂贵,适合于公司使用。


      实质上,不论是人工审查还软件分析,都可能存在一定的误报率,甚至漏报。因此,提高代码质量的根本途径在于编码过程,形成良好编码习惯,是保证代码质量的最可靠方式。


    6 参考文章

    【1】【代码质量】C++代码质量扫描主流工具深度比较
    【2】国内外主流静态分析类工具汇总

    展开全文
  • 推荐几个代码静态分析工具

    千次阅读 2021-04-26 00:24:44
    关注+星标公众号,不错过精彩内容作者 | strongerHuang微信公众号|嵌入式专栏大家平时写代码,有用代码静态分析工具进行分析吗?可能很多人都没有对代码进行过静态分析,今天就来...

    关注+星标公众,不错过精彩内容

    作者 | strongerHuang

    微信公众号 | 嵌入式专栏

    大家平时写代码,有用代码静态分析工具进行分析吗?

    可能很多人都没有对代码进行过静态分析,今天就来给大家推荐几个代码静态分析工具。

    嵌入式专栏

    0

    关于代码静态分析工具

    代码静态分析工具,顾名思义就是对代码进行静待分析,以提前预判(分析)代码潜在的一些问题的工具。

    换句话说,就是通过工具找出你代码的bug(错误、警告)。

    代码静态分析工具需要你的代码遵循一定规范,比如遵循C99MISRA C:2012等,不然工具不支持对你代码的静态分析。

    代码静态分析工具有独立存在的(就是一款软件工具),也有集成在IDE中的。比如比如:IAR EWARM就自带静待分析工具。

    同时,有些工具支持通过“安装插件”的形式集成在IDE中,比如:在keil MDK中添加PC-lint代码静态分析工具

    下面给大家介绍几个款代码静待分析工具:

    嵌入式专栏

    1

    LDRA

    1.网址

    https://www.ldra.com/

    2.介绍

    LDRA是拥有40多年经验的领先公司,LDRA主要针对代码安全和业务关键市场的代码分析和软件测试自动化的软件市场,以实现代码的早期错误识别并消除bug。

    同时,LDRA完全符合行业标准,通过静态和动态分析跟踪要求,以对各种硬件和软件平台进行单元测试和验证。LDRA的业务遍及全球,在英国,美国,德国和印度设有总部,并拥有广泛的分销商网络。

    LDRA符合 ISO 9001:2008。LDRA工具套件已通过TÜVSÜD 和SGS-TÜVSAAR 认证。这些工具符合IEC 61508,IEC 62304,IEC 60880,EN 50128和ISO 26262的规定,可用于与安全相关的软件开发。

    应用领域:

    3.特点

    • 自动化单元测试和系统级测试

    • 自动生成软件认证和批准证据

    • 规划和执行基于需求的测试

    • 对直至目标级别的所有代码执行和报告覆盖率分析

    • 几乎可以在任何主机或目标平台上进行单元测试和系统级测试

    • 符合编码标准(行业和用户定义)

    4.试用

    LDRA工具套件支持30天免费试用。

    嵌入式专栏

    2

    Parasoft C / C ++ test

    1.网址

    https://www.parasoftchina.com/products/ctest/

    2.介绍

    Parasoft® C/C++test® 是专业针对C和C++语言的开发测试方案,经广泛证明能提高软件开发效率和代码质量的自动化最佳实践解决方案。

    Parasoft 公司成立于1987年,总部位于加利福尼亚州的洛杉矶。有着30多年的丰富的专业技术积累和行业应用经验,产品横跨单元测试、静态分析、动态分析、功能测试、压力测试、信息安全测试、通信协议仿真、应用环境虚拟化等。

    3.特点

    • 提升C/C++开发软件质量

    • 自动化测试平台

    • 遵从性认证标准

    • 嵌入式和跨平台开发

    • 提升开发效率,加速软件交付

    • 低成本学习,高度可定制化

    4.支持广泛平台

    支持主机平台:

    • Windows

    • Visual Studio

    • Solaris UltraSPARC

    支持IDE:

    • Eclipse IDE for Developers

    • Microsoft Visual Studio

    • Wind River Workbench

    • ARM Workbench IDE for RVDS

    • ARM Development Studio

    • QNX Momentics IDE (QNX Software Development Platform)

    • Texas Instruments Code Composer Studio

    • ARM ADS

    • Green Hills MULTI

    • IAR Embedded Workbench

    • Keil µVision IDE

    • Keil RealView

    • Microsoft eMbedded Visual C++

    • Microsoft Visual Studio

    • Texas Instruments Code Composer

    • Wind River Tornado

    还有更多:

    4.试用

    Parasoft C/C++test工具套件同样支持免费试用,可进入官网申请免费试用。

    嵌入式专栏

    3

    PVS-Studio

    1.网址

    https://pvs-studio.com/en/pvs-studio/

    2.介绍

    PVS-Studio是用于检测用C,C ++,C#和Java编写的程序源代码中的错误和安全漏洞的工具。它可以在Windows,Linux和macOS环境中的64位系统下运行,并且可以分析用于32位,64位和嵌入式ARM平台的源代码。

    PVS-Studio执行静态代码分析并生成报告,以帮助程序员查找和修复错误。PVS-Studio执行各种代码检查,对于发现打印错误和复制粘贴错误也很有用。比如:V501,V517,V522,V523,V3001等类似错误信息。

    3.特点

    备注:截图内容为自动翻译,可能存在一些翻译错误。

    4.支持广泛平台

    操作系统:

    • Windows

    • Linux

    • macOS

    使用C/C++编译器对应教程的地址:

    https://pvs-studio.com/en/m/0033/

    5.试用

    PVS-Studio工具套件同样为商业付费软件,但支持免费试用

    嵌入式专栏

    4

    VectorCAST

    1.网址

    https://www.vector.com/de/en/products/products-a-z/software/vectorcast/

    2.介绍

    VectorCAST嵌入式软件测试平台是一系列产品,可在整个软件开发生命周期内自动执行分析和测试。

    VectorCAST工具系列支持测试用例的创建和管理,以验证底层软件。此外,VectorCAST工具支持在DO-178C和ED-12C规定的所有级别(包括A级)上捕获和报告结构代码覆盖率数据。

    应用于:航天航空、汽车、工业、医疗、轨道交通等领域。

    软件关键级别和结构覆盖要求:

    3.特点

    • 支持DO-178C要求的所有级别的代码覆盖范围;ED-12C

    • 自动生成和编译完整的测试存根和驱动程序

    • 自动回归测试

    • 符合标准的测试报告生成

    • 在主机,模拟器和嵌入式目标系统上测试执行

    4.试用

    VectorCAST工具套件同样为商业付费软件,但支持免费试用。

    最后,篇幅有限,先推荐这些,还有更多静态分析工具,后期为大家分享。

    ------------ END ------------

    后台回复『软件工具』『嵌入式软件设计与开发』阅读更多相关文章。

    欢迎关注我的公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。

    欢迎关注我的视频号:

    点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。

    展开全文
  • 引言 最近在项目中使用了静态程序分析工具PC-Lint,体会到它在...由于PC-Lint/FlexeLint是商业的程序分析工具,不便于大家对其进行学习使用,因而下面我将介绍一个针对C语言的开源程序静态分析工具——splint。 静

    引言

    最近在项目中使用了静态程序分析工具PC-Lint,体会到它在项目实施中带给开发人员的方便。PC-Lint是一款针对C/C++语言、windows平台的静态分析工具,FlexeLint是针对其他平台的PC-Lint版本。由于PC-Lint/FlexeLint是商业的程序分析工具,不便于大家对其进行学习和使用,因而下面我将介绍一个针对C语言的开源程序静态分析工具——splint

    静态程序分析

    先来说说什么是“静态程序分析(Static program analysis)”,静态程序分析是指使用自动化工具软件对程序源代码进行检查,以分析程序行为的技术,应用于程序的正确性检查、安全缺陷检测、程序优化等。它的特点就是不执行程序,相反,通过在真实或模拟环境中执行程序进行分析的方法称为“动态程序分析(Dynamic program analysis)”。

    那在什么情况下需要进行静态程序分析呢?静态程序分析往往作为一个多人参与的项目中代码审查过程的一个阶段,因编写完一部分代码之后就可以进行静态分析,分析过程不需要执行整个程序,这有助于在项目早期发现以下问题:变量声明了但未使用、变量类型不匹配、变量在使用前未定义、不可达代码、死循环、数组越界、内存泄漏等。下图说明了静态程序分析在进行项目编码过程中所处的位置:

    静态分析工具位置

    从上图可以知道,静态分析工具在代码通过编译之后再对代码进行分析。我们会问:静态分析工具与编译器相比,所做的工作有什么不同?静态分析工具相比编译器,对代码进行了更加严格的检查,像数组越界访问、内存泄漏、使用不当的类型转换等问题,都可以通过静态分析工具检查出来,我们甚至可以在分析工具的分析标准里定义代码的编写规范,在检测到不符合编写规范的代码时抛出告警,这些功能都是编译器没有的。

    既然静态分析工具发挥了不小的作用,何不在编译器里兼备静态分析的功能?对于这个问题,S. C. Johnson(他是最古老的静态分析工具Lint的作者)在其1978年发表的论文《Lint, a C Program Checker》中给出了他的答案:“Lint与C编译器在功能上的分离既有历史原因,也有现实的意义。编译器负责把C源程序快速、高效地转变为可执行文件,不对代码做类型检查(特别是对分别编译的程序),有益于做到快速与高效。而Lint没有“高效”的要求,可以花更多时间对代码进行更深入、仔细的检查。”

    针对空指针提取、未定义变量使用、类型转换、内存管理、函数接口定义等,我们可以在静态分析工具里制定不同的检测标准,以下曲线图说明了在使用splint进行分析时,检测标准与splint运行的开销所对应的关系,从另一个角度看,也说明了静态分析工具与编译器的关系:

    splint effort-benefit curve

    splint

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

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

    splint *.c

    1.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之后,我们来看输出的告警信息:

    复制代码
    splint_msg.c: (in function func_splint_msg1)
    splint_msg.c:4:6: Variable a declared but not used
      A variable is declared but never used. Use /*@unused@*/ in front of
      declaration to suppress message. (Use -varuse to inhibit warning)
    
    splint_msg.c: (in function func_splint_msg2)
    splint_msg.c:10:2: Fresh storage a (type int *) not released before assignment:
                          a = NULL
      A memory leak has been detected. Storage allocated locally is not released
      before the last reference to it is lost. (Use -mustfreefresh to inhibit
      warning)
       splint_msg.c:9:37: Fresh storage a created
    
    Finished checking --- 2 code warnings
    
    复制代码

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

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

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

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

    2.检查控制

    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会加强对该参数的值的检测。

    3.检测分析内容

    1.解引用空指针(Null Dereferences)

    在Unix操作系统中,解引用空指针将导致我们在程序运行时产生段错误(Segmentation fault),一个简单的解引用空指针例子如下:

    复制代码
    1 //null_dereferences.c
    2 int func_null_dereferences(void)
    3 {
    4 int* a = NULL;
    5 return*a;
    6 }
    复制代码

    执行splint null_dereference.c命令,将产生以下告警消息:

    复制代码
    null_dereference.c: (in function func_null_dereferences)
    null_dereference.c:5:10: Dereference of null pointer a: *a
      A possibly null pointer is dereferenced.  Value is either the result of a
      function which may return null (in which case, code should check it is not
      null), or a global, parameter or structure field declared with the null
      qualifier. (Use -nullderef to inhibit warning)
       null_dereference.c:4:11: Storage a becomes null
    
    Finished checking --- 1 code warnin
    复制代码

    2.类型(Types)

    我们在编程中经常用到强制类型转换,将有符号值转换为无符号值、大范围类型值赋值给小范围类型,程序运行的结果会出无我们的预料。

    复制代码
    1 //types.c
    2 void splint_types(void)
    3 {
    4 short a =0;
    5 long b =32768;
    6     a = b;
    7 return;
    8 }
    复制代码

    执行splint types.c命令,将产生以下告警消息:

    types.c: (in function splint_types)
    types.c:6:2: Assignment of longint to shortint: a = b
      To ignore type qualifiers in type comparisons use +ignorequals.
    
    Finished checking ---1 code warning

    3.内存管理(Memory Management)

    C语言程序中,将近半数的bug归功于内存管理问题,关乎内存的bug难以发现并且会给程序带来致命的破坏。由内存释放所产生的问题,我们可以将其分为两种:

    • 当尚有其他指针引用的时候,释放一块空间
    复制代码
    1 //memory_management1.c
    2 void memory_management1(void)
    3 {
    4 int* a = (int*)malloc(sizeof(int));
    5 int* b = a;
    6     free(a);
    7 *b =0;
    8 return;
    9 }
    复制代码

    在上面这个例子中,指针a与b指向同一块内存,但在内存释放之后仍对b指向的内容进行赋值操作,我们来看splint 
    memory_management1.c的结果:

    复制代码
    memory_management1.c: (in function memory_management1)
    memory_management1.c:7:3: Variable b used after being released
      Memory is used after it has been released (either by passing as an only param
      or assigning to an only global). (Use -usereleased to inhibit warning)
       memory_management1.c:6:7: Storage b released
    memory_management1.c:7:3: Dereference of possibly null pointer b: *b
      A possibly null pointer is dereferenced.  Value is either the result of a
      function which may returnnull (in which case, code should check it is not
      null), or a global, parameter or structure field declared with the null
      qualifier. (Use -nullderef to inhibit warning)
       memory_management1.c:5:11: Storage b may become null
    
    Finished checking ---2 code warnings
    复制代码

    检查结果中包含了两个告警,第一个指出我们使用了b指针,而它所指向的内存已被释放;第二个是对解引用空指针的告警。

    • 当最后一个指针引用丢失的时候,其指向的空间尚未释放
    复制代码
    1 //memory_management2.c
    2 void memory_management2(void)
    3 {
    4 int* a = (int*)malloc(sizeof(int));
    5      a = NULL;
    6 return;
    7 }
    复制代码

    这个例子中内存尚未释放,就将指向它的唯一指针赋值为NULL,我们来看splint memory_management2.c的检测结果:

    复制代码
    memory_management2.c: (in function memory_management2)
    memory_management2.c:5:2: Fresh storage a (type int*) not released before assignment:
                     a = NULL
      A memory leak has been detected. Storage allocated locally is not released
      before the last reference to it is lost. (Use -mustfreefresh to inhibit
      warning)
       memory_management2.c:4:37: Fresh storage a created
    
    Finished checking ---1 code warning
    复制代码

    splint抛出一个告警:类型为int*的a在进行a = NULL赋值前没有释放新分配的空间。

    4.缓存边界(Buffer Sizes)

    splint会对数组边界、字符串边界作检测,使用时需要加上+bounds的标志,我们来看下面的例子:

    复制代码
    1 //bounds1.c
    2 void bounds1(void)
    3 {
    4 int a[10];
    5     a[10] =0;
    6 return;
    7 }
    复制代码

    使用splint +bounds bounds1.c命令对其进行检测,结果如下:

    复制代码
    bounds1.c: (in function bounds1)
    bounds1.c:5:2: Likely out-of-bounds store: a[10]
        Unable to resolve constraint:
        requires 9>=10
         needed to satisfy precondition:
        requires maxSet(a @ bounds1.c:5:2) >=10
      A memory write may write to an address beyond the allocated buffer. (Use
      -likelyboundswrite to inhibit warning)
    
    Finished checking ---1 code warning
    复制代码

    告警消息提示数组越界,访问超出我们申请的buffer大小范围。再看一个例子:

    复制代码
     1 //bounds2.c
     2 void bounds2(char* str)
     3 {
     4 char* tmp = getenv("HOME");
     5 if(tmp != NULL)
     6     {
     7         strcpy(str, tmp);
     8     }
     9 return;
    10 }
    复制代码

    不对这个例子进行详细检查,可能我们不能发现其中隐含的问题,执行splint +bounds bounds2.c之后,会抛出如下告警:

    复制代码
    bounds2.c: (in function bounds2)
    bounds2.c:7:3: Possible out-of-bounds store: strcpy(str, tmp)
        Unable to resolve constraint:
        requires maxSet(str @ bounds2.c:7:10) >= maxRead(getenv("HOME") @
        bounds2.c:4:14)
         needed to satisfy precondition:
        requires maxSet(str @ bounds2.c:7:10) >= maxRead(tmp @ bounds2.c:7:15)
         derived from strcpy precondition: requires maxSet(<parameter 1>) >=
        maxRead(<parameter 2>)
      A memory write may write to an address beyond the allocated buffer. (Use
      -boundswrite to inhibit warning)
    
    Finished checking ---1 code warning
    复制代码

    告警消息提示我们:在使用strcpy(str, tmp)进行字符串复制时,可能出现越界错误,因为str的大小可能不足以容纳环境变量“HOME”对应的字符串。绿色字体的内容指示了如何消除告警消息。

    小结

    这里仅给出了splint检查的4种检测:解引用空指针、类型、内存管理、缓存边界,除此之外,splint还对宏(Macros)、函数接口(Function Interfaces)、控制流(Control Flow)等内容作检测,很多检测标志和格式化注释都未在本文中提到,更详细的内容请查看splint使用手册

    不管pc-lint、splint等静态程序分析工具的功能多么强大,它们对程序的检查也有疏漏的地方,工具的使用并不能提高我们的编程能力,我们更应该通过它们学习各种编码错误和代码隐患,凭积累的编码知识把程序隐患扼杀在摇篮里。

    你在项目实施中是否遇到过隐藏的bug,导致返工呢?在你的项目中是否使用了静态程序分析工具,它起到多大的作用?说出来与大家一块分享吧~

    Reference:《Splint Manual》

                    《Lint, a C Program Checker》

    (原文链接:http://www.cnblogs.com/bangerlee/archive/2011/09/07/2166593.html

    展开全文
  • C/C++代码静态扫描和动态测试工具

    千次阅读 2017-06-04 22:40:13
  • Android APK 静态分析动态分析

    千次阅读 2016-10-25 09:52:52
     本文主要介绍一款Android恶意软件行为自动分析平台——MalDroidAnalyzer,其主要结合静态分析和动态分析技术来实现恶意软件行为自动化分析。MalDroidAnalyzer是笔者使用Perl语言编写的,用于辅助分析Android软件...
  • 软件测试代码静态分析(splint)

    千次阅读 2013-05-14 00:17:05
    代码静态分析工具——splint的学习与使用 引言 最近在项目中使用了静态程序分析工具PC-Lint,体会到它在项目实施中带给开发人员的方便。PC-Lint是一款针对C/C++语言、windows平台的静态分析工具,FlexeLint是针对...
  • 引言 最近在项目中使用了静态程序分析工具PC-Lint,体会到...由于PC-Lint/FlexeLint是商业的程序分析工具,不便于大家对其进行学习使用,因而下面我将介绍一个针对C语言的开源程序静态分析工具——splint。 静
  • 静态和动态库的分析

    千次阅读 2016-01-05 18:23:43
    在Linux操作系统中,普遍使用ELF格式作为可执行程序或者程序生成过程中的中间格式。...可执行文件包含了代码和数据,是可以直接运行的程序。 2、可重定向文件(*.o) 可重定向文件又称为目标文件,
  • 1.基础分析 2.详细介绍 2.1 指纹探测 恶意代码指纹探测技术有很多种,常见的有hash值探测、流量统计...(2)流量统计指纹:提取恶意代码流量中的包层特征流层特征,对高维流层特征采用主成分分析进行降维,利用...
  • Source Insight是个功能强大的源代码编辑、浏览工具,支持多种开发语言(java,c,c++等等),提供快捷方便的定位、... PC-LINT是C/C++软件代码静态分析工具,能够帮你在程序动态测试之前发现编码错误,可以把它看作是一
  •  本文是一个静态代码分析工具的清单,但是为公司产品需要付费使用。共有37个公司,有些公司包含多个工具。其中27个公司有多语言 工具,1个公司为PHP工具、2个公司为.NET工具、1个公司为Ada工具、4个公司为C++...
  • 静态分析与软件测试中的动态分析

    千次阅读 2018-07-25 16:46:29
    什么是静态分析静态分析不涉及被测软件的动态执行,并且可以在...静态分析也可以由审查代码的人执行,以确保使用正确的编码标准约定来构建程序。这通常称为代码审查,由同行开发人员(编写代码的开发人员以外的...
  • 静态代码分析类似于使用练习网投球机练习棒球挥杆。几乎没有什么惊喜。经过几次挥杆后,您确切地知道每次球都在哪里。这有助于基础知识的工作,并确保您具有良好的状态。虽然这有助于改善您的游戏,但它只能使您...
  • IDA Pro使用(静态分析+动态调试)

    千次阅读 2017-11-22 18:16:58
    IDA Pro使用(静态分析+动态调试) 1.静态分析 IDA FLIRT Signature Database —— 用于识别静态编译的可执行文件中的库函数 IDA signsrch —— 寻找二进制文件所使用的加密、压缩算法 IDA scope ...
  • 内存静态,动态分析

    千次阅读 2016-08-28 16:19:47
    内存分析
  • 1、蠕虫或计算机病毒:可以自我复制感染其他计算机的恶意代码 2、后门:指一类能够绕开正常的安全控制机制,从而为攻击者提供访问途径的一类恶意代码。攻击者可以通过使用后门工具对目标主机进行完全控制。 3、...
  • Linux静态和动态库的分析

    千次阅读 2009-07-14 11:11:00
    Linux静态和动态库的分析 1.什么是库 在windows平台linux平台下都大量存在着库。 本质上来说库是一种可执行代码的二进制形式,可以被操作系统载入内存执行。 由于windowslinux的本质不同,因此二者库的二...
  • 本文分为两个章节。第一章讨论持续集成的原理,持续集成如何简化软件开发...主要研究Jenkins持续集成PRQA的静态分析工具(QA•C, QA•C++ QA•Verify),并说明他们是怎样结合在一起使用,以及他们所生成的信息。
  • 静态代码分析工具简介

    千次阅读 2019-09-25 20:02:58
    静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针...
  • 代码静态分析工具PC-LINT安装配置--step by step

    万次阅读 热门讨论 2006-05-20 12:40:00
    代码静态分析工具PC-LINT安装配置--step by step 作者:ehui928 2006-5-20 PC-Lint是C/C++软件代码静态分析工具,你可以把它看作是一种更加严格的编译器。它不仅可以检查出一般的语法错误,还可以检查出那些虽然...
  • 静态代码分析是指无需运行被测代码,仅通过分析或检查源程序的语法、结构、过程、接口等来检查程序的正确性,找出代码隐藏的错误缺陷,如参数不匹配,有歧义的嵌套语句,错误的递归,非法计算,可能出现的空指针...
  • 代码混淆、防止逆向工程。Smali汇编器,bakSmali反编器。反编译。&gt; (反)病毒木马 反病毒木马研究- http://blog.csdn.net/ioio_jy/article/category/2513125 Android手机病毒分析及研究- ...
  • 随后分别介绍了4种现有的主流Java静态代码分析工具 (Checkstyle,FindBugs,PMD,Jtest),最后从功能、特性等方面对它们进行分析和比较,希望能够帮助Java软件开发人员了解静态代码分析工具,并选择合适的工具应用到...
  • 静态测试和动态测试

    千次阅读 2014-06-24 19:19:30
    静态测试是通过对被测程序的静态审查...动态测试时同常意义上的测试,即通过使用运行被测软件,发现潜在错误。 通过源程序运行时所体现出来的特征,来进行执行跟踪、时间分析以及测试覆盖等方面的测试。    ...
  • DMSCA是端玛科技在多年静态分析技术的积累及研发努力的基础上,联合多所国内及国际知名大学、专家共同分析全球静态分析技术的优缺点后、结合当前开发语言的技术现状、源代码缺陷的发展势态市场后,研发出的新一代...
  • 深入浅出静态链接和动态链接

    万次阅读 多人点赞 2018-05-06 09:24:48
    作为一名C/C++程序员,对于编译链接的过程...然后进行编译,这个过程主要是进行词法分析、语法分析和语义分析等,生成*.s的汇编文件;最后进行汇编,这个过程比较简单,就是将对应的汇编指令翻译成机器指令,生成可...
  • 静态代码分析工具大全

    千次阅读 2019-12-21 22:53:14
    本文是一个静态代码分析工具的清单,但是为公司产品,需要付费使用。共有37个公司,有些公司包含多个工具。其中27个公司有多语言工具,2个公司为.NET工具、1个公司为Ada工具、4个公司为C++工具、1个公司为Java工具、...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 261,308
精华内容 104,523
关键字:

代码静态分析和动态分析