type
status
date
slug
summary
tags
category
icon
password
C-STAT for static analysis(C-STAT用于静态分析)








Introduction to C-STAT and static analysis(C-STAT和静态分析简介)
以下是对这些主题的描述:
● C-STAT和编码规则简介,第37页
● 检查项目及其文档说明,第38页
● C-STAT检查的范围,第40页
● C-STAT的多种使用方法,第40页
BRIEFLY ABOUT C-STAT AND THE CODING RULES(C-STAT与编码规则简介)
C-STAT是一种静态分析工具,通过执行一个或多个针对规则的检查来发现与特定编码规则的偏差。这些检查被分组为不同的包。各种包包括:
● STDCHECKS
包含来自CWE的规则检查,以及C-STAT特有的检查。
● CERT
包含CERT的检查。此外,一些CERT规则和建议可以
通过其他标准规则的检查进行验证,参见CERT规则到C-STAT检查的映射,第1359页。
● SECURITY
包含来自SANS Top25、OWASP和CWE的规则检查。
● MISRA C:2004
包含MISRA C:2004标准的选定规则检查。该标准识别C89标准中的不安全代码结构。这些检查也可用于识别C18或C11代码中的不安全C89结构。
● MISRA C++:2008
包含MISRA C++:2008标准的选定规则检查。该标准识别1998 C++标准中的不安全代码结构。这些检查也可用于识别C++14代码中的不安全1998 C++结构。
● MISRA C:2012
包含MISRA C:2012标准的选定规则检查。该标准识别C99和C89标准中的不安全代码结构。这些检查也可用于识别C18或C11代码中的不安全C89和C99结构。
每个MISRA C规则要么是强制性的、必需的,要么是建议性的。默认情况下,强制性和必需规则的检查是开启的,而建议性规则的检查默认是关闭的。每条规则都指定了一个不安全的代码结构。
注意:某些检查会计算每个文件的摘要信息,这些信息可在分析其他文件时使用。这些信息的使用方式取决于文件分析的顺序。这意味着精确的消息数量可能会有所不同,例如在IDE中运行C-STAT与使用命令行工具相比。
注意:特定文件的分析会在您指定的时间限制后终止。当达到时间限制后,分析将继续处理下一个文件。
THE CHECKS AND THEIR DOCUMENTATION(检查项目及其文档说明)
检查是以编程方式识别规则偏差的方法。每个检查都有:
● Tag,用于引用检查的唯一标识符。例如,
ARR-inv-index-pos。
● Default activation,默认激活状态,可以是Yes或No。
● Synopsis,简介,例如,数组访问可能越界,取决于
执行的路径。
● Severity level,严重程度级别,可以是Low、Medium或High。
此外,每个检查的文档提供了关于它识别的任何漏洞的信息,以及未通过检查的代码可能导致的问题的描述,如内存泄漏、未定义或不可预测的行为,或程序崩溃。通常,还有两个源代码示例:一个说明未通过检查并生成消息的代码,另一个说明通过检查的代码。对于每个检查,还有关于该检查对应于不同编码标准中哪些规则的信息。
网格显示不符合规则的代码(不合规代码)可能导致的问题的严重性,以及消息反映源代码中真实错误的确定性级别。网格分为三个区域——用浅色表示——反映基于严重性和确定性的风险。特定检查的实际风险用深色网格单元表示。

以下是一些示例网格。
示例1——高严重性和高确定性 = 高风险
这个网格显示了一个高严重性和高确定性的检查,这意味着它很可能表明存在真正的bug。虽然所有消息都应该被调查,但那些具有高确定性的消息更有可能识别出源代码中的实际问题。

示例2——中等严重性和高确定性 = 中等风险
这个网格显示了一个中等严重性和高确定性的检查。中等严重性表示,对于未通过检查的代码,存在导致应用程序中严重错误的中等风险。高确定性意味着消息很可能反映真阳性。

示例3——低严重性和中等确定性 = 低风险
这个网格显示了一个低严重性和中等确定性的检查,这表明代码可能是安全使用的。检查失败可能是由于宏中的违规,或程序员编写安全但不寻常的代码。

THE SCOPE OF THE C-STAT CHECKS(C-STAT检查的范围)
C-STAT中的检查可以分为在源代码上执行的检查和在链接时执行的检查。
源代码检查在用户项目的C或C++源代码以及任何包含的用户头文件(使用#include "xxx"包含)中搜索偏离编码规则的情况。系统头文件(使用#include <xxx>包含)和汇编源代码不会被搜索。
链接时检查搜索偏离指定全局和静态对象(变量和函数)使用方式的编码规则的情况。由于检查在C或C++源代码中搜索全局和静态对象,然后C-STAT分析代码以查看是否发生了任何偏差,因此搜索可能不完整。如果用户项目包含汇编源代码或第三方库,搜索可能会产生误报。
还要注意,一些MISRA C 2012检查—MISRAC2012-Rule-5.2、MISRAC2012-Rule-5.3、MISRAC2012-Rule-5.4、MISRAC2012-Rule-5.5和MISRAC2012-Rule-20.4—都有C89和C99两种变体。C89变体仅在源代码以C89模式编译时使用,否则使用C99变体。
注意:使用C-STAT时,每个C/C++源文件的编译器选项必须与用户项目中的相同,否则分析可能会给出不正确的结果。
VARIOUS WAYS TO USE C-STAT(C-STAT的多种使用方法)
C-STAT是IAR Embedded Workbench IDE的一个集成部分:
● 您可以在Select C-STAT Checks对话框中指定要执行的检查包。
● 您可以通过从Project>C-STAT Static Analysis菜单中选择适当的命令来执行静态分析。
您可以在C-STAT Messages窗口中查看执行的分析结果。
● 您可以通过从Project>C-STAT Static Analysis菜单中选择适当的命令来创建HTML格式的报告。
C-STAT也可以从命令行使用,如果您使用make文件构建项目,这很有用:
● ichecks.exe—使用ichecks工具生成仅包含您想要执行的检查的清单文件。
● icstat.exe—使用icstat工具对项目执行C-STAT静态分析,以清单文件作为输入。
● ireport.exe—使用ireport工具生成先前执行的分析的HTML报告。
最后,您可以将C-STAT与IAR Command Line Build Utility (iarbuild.exe)一起用于回归测试。
Using C-STAT(C-STAT应用)
以下是描述的任务:
● Getting started analyzing using C-STAT(C-STAT分析入门),第41页
● Generating an analysis report(生成分析报告),第44页
● Performing regression testing(执行回归测试),第45页
● Performing an analysis from the command line(从命令行执行分析),第46页
GETTING STARTED ANALYZING USING C-STAT(C-STAT分析入门)
1 在执行静态分析之前,确保您的项目构建没有错误。关于
如何构建项目的信息,请参阅IDE项目管理和
构建指南。
2 选择Project>Options并选择Static Analysis类别。在C-STAT
Static Analysis页面上,点击Select C-STAT Checks。
3 在Select C-STAT Checks对话框中,选择您想要
使用的检查包。例如STDCHECKS。

4 对于每个包,选择检查组或单个检查:

要获取特定检查的信息,选择它并按F1打开上下文相关的在线帮助系统。
完成设置后,点击OK,然后再次点击OK。
5 要执行分析,确保项目处于活动状态并执行以下步骤之一:
● 要分析您的项目,在Workspace窗口中选择项目并选择
Project>C-STAT Static Analysis>Analyze Project。
● 要分析一个或多个单独的文件,在Workspace窗口中选择文件,
然后选择Project>C-STAT Static Analysis>Analyze File(s)。
或者,使用Workspace窗口中上下文菜单上的相应命令。
6 执行的分析结果列在C-STAT Messages窗口中。

要获取特定检查的信息,选择它并按F1打开上下文相关的在线帮助系统。
有关参考信息,请参见第49页的C-STAT Messages窗口。
注意:如果分析过程中出现任何问题,Build Log窗口会显示详细信息。
7 双击C-STAT消息以在编辑器窗口中查看相应的源代码:

将鼠标指针悬停在消息上可获取有关导致该消息的检查的工具提示信息。
8 更正错误并点击C-STAT Messages窗口中的下一条消息。
继续处理直到所有消息都已处理完毕。
注意:C-STAT有一个预定义的宏__CSTAT__,您可以使用它来明确地包含或排除特定部分源代码进行分析,请参阅第57页的__CSTAT__。还有特定的C-STAT pragma指令可以抑制
选定源代码行的一个或多个检查,请参阅第54页的C-STAT编译器扩展说明。
GENERATING AN ANALYSIS REPORT(生成分析报告)
1 执行您的分析,参见第41页的C-STAT分析入门。
2 生成报告:
● 在IDE中,选择Project>C-STAT Static Analysis,然后根据您想要生成的报告类型选择Generate
HTML Summary或Generate Full HTML Report。
报告将基于最近执行的分析。如果您在最近一次分析后修改了源代码文件,您可能需要在生成报告前更新分析。
● 在命令行中,指定您的ireport选项,例如:
ireport --db cstat.db --project project1 --output
tutor_report.html
这将从数据库cstat.db生成一个名为tutor_report.html的摘要报告,其中project1作为项目的标识名称。该报告可以在网页浏览器或IAR Embedded Workbench IDE中查看。
3 以下是摘要报告的示例:

PERFORMING REGRESSION TESTING(执行回归测试)
回归测试是一种在修改源代码后测试全部或部分源代码的方法,以验证修改过程中没有引入新错误。
1 在使用C-STAT分析项目并可能纠正了一些错误后,使用位于common\bin目录中的IAR Command Line Build Utility (iarbuild.exe)执行回归测试会很有用。
要清除数据库中的旧错误,使用如下命令行:
iarbuild.exe MyProject.ewp -cstat_clean Debug
要分析项目中的所有文件,使用如下命令行:
iarbuild.exe MyProject.ewp -cstat_analyze Debug
2 C-STAT会生成输出信息,例如:
Analyzing configuration: MyProject - Debug Updating build tree...
Starting C-STAT analysis Analysis completed. 164 message(s)
3 将报告的消息数量与先前构建中产生的消息数量进行比较。如果数量增加,说明在之前的开发过程中引入了新的错误。
4 在IDE中,打开您的项目,执行分析,并找出新消息的原因。
或者,您可以从命令行创建HTML报告,例如:
ireport.exe --db cstat.db --project MyProject.ewp --full --output MyProject.html
这将在MyProject.html中创建一份报告,另请参见第44页的"生成分析报告"。
5 通常,您可能希望在夜间构建期间重复此过程,以持续控制现有代码不受新代码的影响。
有关IAR Command Line Build Utility的更多信息,请参阅IDE项目管理和构建指南。
PERFORMING AN ANALYSIS FROM THE COMMAND LINE(从命令行执行分析)
要从命令行使用C-STAT执行分析,您需要:
● ichecks.exe——使用ichecks工具生成一个只包含您想要执行的检查的清单文件。
● icstat.exe——使用icstat工具对项目执行C-STAT静态分析,以清单文件作为输入。有关检查的信息,请参见第71页的C-STAT checks。icstat的输入包括:
● 应用程序的源文件,带有编译器命令行。
● 应用程序的链接器命令行。
● 一个列出将要执行的已启用检查的文件(或更具体地说,是检查的标签)。您可以使用ichecks工具创建此文件。
● 一个文件,用于将执行检查的偏差存储在数据库中。
关于如何使用C-STAT执行静态分析的示例,请按照以下步骤,基于两个示例源代码文件cstat1.c和ctat2.c。您可以在目录target\src中找到这些文件。
要使用C-STAT执行静态分析:
1 通过使用ichecks创建清单文件来选择您想要执行的检查,例如像这样:
ichecks --default stdchecks --output checks.ch
checks.ch文件列出了您选择的所有检查,在本例中,是为stdchecks包默认启用的所有检查(--default)。该文件将如下所示:
ARR-inv-index-pos ARR-inv-index-ptr-pos ...
要在检查级别修改文件,您可以手动从文件中添加或删除检查。
2 确保您的项目构建时没有错误。
3 要分析您的应用程序,请指定您的icstat命令。例如像这样:
icstat --db a.db --checks checks.ch analyze -- iccxxxxx compiler_opts cstat1.c icstat --db a.db --checks checks.ch analyze -- iccxxxxx compiler_opts cstat2.c icstat --db a.db --checks checks.ch link_analyze -- ilinkxxxxx linker_opts cstat1.o cstat2.o
注意:iccxxxxx是编译器的调用,ilinkxxxxx是ILINK Linker的调用。xxxxx应替换为您的IAR Embedded Workbench产品包特有的标识符。请参考随产品提供的编译器文档,了解如何替换xxxxx。
如果您的产品包配有IAR XLINK Linker而不是IAR ILINK Linker,ilinkxxxxx应为xlink,对象文件的文件扩展名o应为rxx,其中xx是标识您的产品包的数字部分。请参考IDE Project Management and Building Guide了解如何替换xx。
在这些示例命令行中,--db指定存储结果数据库的文件,--checks选项指定checks.ch清单文件。这些命令将按顺序执行。
或者,如果您有许多要分析的源文件并想加速分析,您可以使用commands命令,这意味着您将所有命令收集在特定文件中,并结合--parallel使用。在这种情况下,icstat将改为并行执行分析。命令行将如下所示:
icstat --db a.db --checks checks.ch commands commands.txt
- -parallel 4
commands.txt包含:
analyze -- iccxxxxx compiler_opts cstat1.c
analyze -- iccxxxxx compiler_opts cstat2.c
link_analyze -- ilinkxxxxx linker_opts cstat1.o cstat2.o 请参见上面关于ilinkxxxxx和文件扩展名的注释。
4 在对cstat1.c文件运行icstat后,以下消息会列在控制台上并存储在数据库中(假设执行所有默认检查):
"cstat1.c",12 Severity-High[PTR-null-assign]:Pointer `p' is assigned NULL, then dereferenced.
"cstat1.c",13: ^ - if (input) is true "cstat1.c",15: ! - Pointer assigned NULL: p = foo() "cstat1.c",17: ! - Dereference of pointer `p'
"cstat1.c",17 Severity-High[SPC-uninit-var-some]:Variable `p' may be uninitialized.
"cstat1.c",13: ^ - if (input) is false "cstat1.c",17: ! - Read of `*p'
注意,消息后面跟着跟踪信息,描述了触发规则偏差所需的执行路径,包括对条件语句所做假设的信息。
5 cstat2.c文件列出了以下消息:
"cstat2.c",7 Severity-High[ARR-inv-index]:Array `arr' 1st subscript 20 is out of bounds [0,9].
6 编辑源文件以解决问题,然后重复分析。
注意:C-STAT有一个内置的预处理器符号__CSTAT__,您可以使用它明确地包含或排除特定部分源代码进行分析。还有特定的C-STAT pragma指令可以抑制选定源代码行的一个或多个检查,请参见第54页的C-STAT编译器扩展说明。
Reference information on the graphical environment(图形环境参考信息)
C-STAT MESSAGES WINDOW(C-STAT消息窗口)
C-STAT STATIC ANALYSIS OPTIONS(C-STAT静态分析选项)
EXTRA OPTIONS(额外选项)
SELECT C-STAT CHECKS DIALOG BOX(选择C-STAT检查对话框)
Descriptions of compiler extensions for C-STAT(C-STAT的编译器扩展说明)
C-STAT DIRECTIVES IN COMMENTS(C-STAT注释中的指令)
CSTAT_DISABLE
CSTAT_ENABLE
CSTAT_RESTORE
CSTAT_SUPPRESS
__CSTAT__
Descriptions of C-STAT options(C-STAT选项说明)
RULES FOR SPECIFYING A FILENAME OR DIRECTORY AS PARAMETERS(指定文件名或目录作为参数的规则)
--ALL
--CHECK
--CHECKS
--DB
--DEFAULT
--DETERMINISTIC
--EXCLUDE
--FPE
--FULL
--GROUP
--LANGUAGE_SPECIFIC_CHECKS
--OUTPUT
--PACKAGE
--PARALLEL
--PROJECT
--TIMEOUT
--TIMEOUT_CHECK
Description of the C-STAT command line tools(C-STAT命令行工具说明)
THE ICSTAT TOOL(ICSTAT工具)
THE ICHECKS TOOL(ICHECKS工具)
THE IREPORT TOOL(IREPORT工具)
有文字内容详情不解或业务合作的可以通过以下方式联系本人:微信号:kmkadagarm(请注明称呼与来意)
- 作者:Knight
- 链接:https://www.ale-tech.cn//article/IAR-C-STAT
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。









