7个不稳定版本

0.4.0 2024年2月27日
0.3.2 2023年5月31日
0.3.1 2021年10月21日
0.3.0 2021年8月27日
0.1.0 2020年9月18日

#200编程语言


用于 llvm-ir-taint

MIT 许可证

64KB
826 代码行

llvm-ir-analysis: LLVM IR的静态分析

crates.io License

此crate提供对LLVM IR的几个简单静态分析。特别是,此crate在llvm-ir ModuleFunction 上计算以下内容:

上述分析由FunctionAnalysisModuleAnalysisCrossModuleAnalysis 对象提供,这些对象按需懒加载每个结构并缓存结果。

入门指南

llvm-ir-analysiscrates.io 上,因此您只需将其作为依赖项添加到您的 Cargo.toml 中,选择与您想要的LLVM版本对应的特性

[dependencies]
llvm-ir-analysis = { version = "0.4.0", features = ["llvm-17"] }

目前,支持的LLVM版本有 llvm-9llvm-10llvm-11llvm-12llvm-13llvm-14llvm-15llvm-16llvm-17。相应的LLVM库必须在您的系统上可用;有关更多详细信息和方法,请参阅llvm-sys README。

您还需要一些LLVM IR进行分析,形式为llvm-ir ModuleFunction。这可以轻松地从LLVM位码文件生成;有关更详细的说明,请参阅llvm-ir的README。(为了方便起见,此crate将llvm-ir的所有接口导出为模块llvm-ir。)

一旦你有了 Module,你可以构建一个 ModuleAnalysis 对象

let module = Module::from_bc_path(...)?;
let analysis = ModuleAnalysis::new(&module);

你可以直接从 ModuleAnalysis 对象中获取模块级别的分析,例如 analysis.call_graph()。你也可以使用 analysis.fn_analysis("my_func") 获取函数级别的分析,例如控制流图;或者你可以直接使用 FunctionAnalysis::new() 构建一个 FunctionAnalysis

最后,你可以通过从 CrossModuleAnalysis 开始而不是仅仅一个 ModuleAnalysis 来获取多模块分析,例如跨模块调用图。此外,CrossModuleAnalysis 还为每个包含的模块提供了一个 ModuleAnalysis,这些分析也是按需懒加载的。

兼容性

llvm-ir-analysis 支持以下 "入门" 中列出的 LLVM 版本。你应该选择与你要链接的 LLVM 库版本相对应的 LLVM 版本(即系统中可用的版本)。有关与较旧 LLVM 的兼容性(以及较旧 LLVM 生成的位代码)的更多信息,请参阅 llvm-ir README。

llvm-ir-analysis 在稳定 Rust 上工作。截至本文撰写时,它需要 Rust 1.71+。

依赖项

~3MB
~44K SLoC