Hexagon LLVM编译架构介绍(15)
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中。