Hexagon LLVM编译架构介绍(15)

240 篇文章 11 订阅

3.7 安全编程支持

为了支持安全编程,LLVM 编译器提供了以下工具:

  • 静态分析器
  • 后处理器
  • 扫描构建

静态分析器是一种源代码分析工具,可以发现 C 和 C++ 程序中的潜在错误。 它可用于分析单个文件或整个程序。

后处理器创建通过在编译程序时执行静态分析生成的报告摘要。

Scan-build 是用于编译和静态分析程序的附加工具。 它可以与基于 Make 的构建系统一起使用。

3.7.1 静态分析器

静态分析器是集成到 LLVM 编译器中的源代码分析工具。 它分析程序中各种类型的潜在错误,包括安全威胁、内存损坏和垃圾值。

静态分析器具有以下特点:

  • 它支持超过 100 个不同的检查器,这些检查器分为 alpha、core、cplusplus、debug 和 security 类别。
  • 检查器可以从命令行有选择地启用或禁用(通过选项-analyzer-checker-help 提供完整的检查器列表)。
  • 禁用检查器类别将禁用该类别中的所有检查器。

分析源文件
要对特定程序源文件使用静态分析器,请使用选项 --analyze、-analyzer-output 和 -o(第 3.4.21 节)对文件调用 LLVM 编译器。

静态分析器将诊断报告输出到 HTML 文件中,该文件存储在 -o 指定的目录中。 如果指定的目录不存在,编译器会自动创建它。 报告文件名为 report*.html。

诊断报告条目示例:

// @file: test.cpp
int main() {
  int* p = new int();
  return* p;

}
warning: Potential leak of memory pointed to by ‘p’

报告中标记的每个潜在错误都包括在程序中定位错误所需的路径(即控制和数据)。

分析程序
要在整个程序上使用静态分析器,请使用选项 --compile-and-analyze(第 3.4.21 节)对文件调用 LLVM 编译器。

静态分析器将诊断报告输出到 HTML 文件中,该文件存储在 -compile-and-analyze 指定的目录中。 如果指定的目录不存在,编译器会自动创建它。 报告文件名为 report*.html。

使用构建系统时,在整个构建过程中指定相同的目录名称将在指定目录中生成所有 HTML 报告文件。

注意 为静态分析报告生成的文件名使用散列函数,因此报告文件不会被覆盖。

建议一次静态分析整个程序(而不是选定的源文件),原因如下:

  • 生成的分析报告文件全部存储在一个位置。
  • 命令选项可以从构建系统传递,这有助于在每次构建程序时进行静态分析和编译。
  • 由于构建系统擅长跟踪已更改的文件,并且仅编译所需文件的最少集合,因此静态分析的整体周转时间相对较短,因此可以合理地在每次构建时运行静态分析器。

管理检查器
静态分析器可能会报告误报。 有几个因素会导致误报的产生。 例如,如果用于分析死代码的检查器已启用,则静态分析器将标记出于调试目的而有条件启用的代码。

出于这个原因,静态分析器默认启用一组检查器,这些检查器已经过测试以识别非常高比例的实际程序错误。 如有必要,可以使用编译器选项 -analyzer-checker(第 3.4.21 节)单独启用其他检查器。

注意 -analyzer-checker-help 列出所有支持的检查器。

导致误报的另一个因素是非返回函数,例如断言函数。 虽然静态分析器知道标准库的非返回函数,但如果程序有自己的断言实现(例如),它有助于用以下函数属性标记它们:

__attribute__((__noreturn__))

使用此属性极大地改进了静态分析诊断并减少了误报的数量。 例如:

void my_assert(bool b) __attribute__((__noreturn__)) {
   assert(b && “condition not true”);
}

3.7.2 后处理器

后处理器是作为独立脚本实现的报告生成器。 它创建了使用选项 -compile-and-analyze 生成的报告摘要(第 3.7.1 节)
使用以下命令调用后处理器:

post-process --report-dir dir --html-title MyReport

后处理器从选项 --report-dir 指定的目录中读取所有文件,并在同一目录中写入名为 index.html 的摘要报告文件。

报告标题(在本例中为 MyReport)使用选项 --html-title 指定。
有关更多信息,请调用 post-process --help。
后处理器脚本存储在目录 INSTALL_PREFIX/qc/utils/static-analyzer 中。

注意 
    在某些情况下,静态分析器可能会为同一个错误生成多个报告文件。  后处理器在多个报告文件后进行清理。  出于这个原因,它应该定期运行以保持报告目录干净。

3.7.3 扫描构建

Scan-build 是一个用于编译和静态分析程序的独立工具。 它可以与基于 Make 的构建系统一起使用(尽管建议尽可能使用 LLVM 静态分析器 - 请参阅第 3.7.1 节)。

Scan-build 使用户能够将静态分析器作为常规构建过程的一部分运行。
以下是调用 scan-build 的两个示例:

scan-build clang++ -c test.cpp
scan-build -v -k -o out-dir -disable-checker deadcode \
  -use-c++=clang++ --use-c=clang make -j8

Scan-build 适用于基于 Make 的构建系统。
有关更多信息,请调用 scan-build --help。

Scan-build 脚本存储在目录 INSTALL_PREFIX/qc/utils/static-analyzer中。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值