seahorn

seahorn

基于LLVM的开源软件验证与分析框架

SeaHorn是一个基于LLVM的开源软件验证和分析框架。它集成了抽象解释、指针分析、约束求解等多种技术,可用于检测程序错误、生成反例和推导不变式。SeaHorn采用模块化设计,提供可组合的分析组件,适用于各类自动化验证研究。该框架支持多种编码方式和分析精度,能够灵活应对不同的验证需求。

SeaHorn软件验证LLVM静态分析模型检查Github开源项目

seahorn

os os 每日构建 codecov gitter

关于

SeaHorn是一个基于LLVM的语言的自动化分析框架。此版本针对LLVM 14进行编译。

支持的一些特性包括

  • 基于抽象解释的静态分析
  • 基于统一的上下文敏感指针分析
  • 基于SMT的有界模型检查(即符号执行)
  • 基于CHC的软件模型检查(即不变量推理)
  • 可执行的反例(即没有报告,只有bug!)

SeaHorn主要作为进行自动化验证研究的框架而开发。该框架提供了许多可以以多种方式组合在一起的组件。然而,它不是一个"开箱即用"的静态分析工具。

该框架提供了许多分析工具和示例。我们一直在寻找新的应用并为新用户提供支持。有关正在发生的事情的更多信息,请查看我们(不经常更新的)博客

许可证

SeaHorn在修改的BSD许可证下分发。详情请参阅license.txt

介绍

演示

SeaHorn提供了一个名为sea的Python脚本与用户交互。给定一个带有断言注释的C程序,用户只需输入:sea pf file.c

sea-pf的结果是unsat,如果所有断言都成立;如果任何断言被违反,则为sat

选项pf告诉SeaHorn将file.c转换为LLVM位代码,生成一组验证条件(VC),最后求解它们。主要的后端求解器是spacer

命令pf提供了以下选项(其中包括):

  • --show-invars:如果答案是unsat,显示计算出的不变量。

  • --cex=FILE:如果答案是sat,将反例存储在FILE中。

  • -g:使用调试信息进行编译,以获得更可追踪的反例。

  • --step=large:大步编码。每个转换关系对应一个无循环的片段。

  • --step=small:小步编码。每个转换关系对应一个基本块。

  • --track=reg:仅模拟(整数)寄存器。

  • --track=ptr:模拟寄存器和指针(但不包括内存内容)

  • --track=mem:同时模拟标量、指针和内存内容

  • --inline:在验证之前内联程序

  • --crab:将Crab抽象解释工具生成的不变量注入spacer中。在这里阅读有关所有Crab选项(前缀为--crab)的详细信息。您可以通过键入选项--log=crab来查看Crab推断的不变量。

  • --bmc:使用BMC引擎。

sea pf是一个运行多个命令的管道。管道的各个部分也可以单独运行:

  1. sea fe file.c -o file.bc:SeaHorn前端将C程序转换为优化的LLVM位代码,包括混合语义转换。

  2. sea horn file.bc -o file.smt2:SeaHorn从file.bc生成验证条件,并以SMT-LIB v2格式输出它们。用户可以通过添加以下内容在不同的编码风格之间进行选择,具有多个精度级别:

    • --step={small,large,fsmall,flarge},其中small是小步编码,large是块大编码,fsmall是生成平面Horn子句的小步编码(即它生成只有一个谓词的转换系统),flarge是生成平面Horn子句的块大编码。

    • --track={reg,ptr,mem},其中reg只模拟整数标量,ptr模拟reg和指针地址,mem模拟ptr和内存内容。

  3. sea smt file.c -o file.smt2:以SMT-LIB2格式生成CHC。是sea fe后跟sea horn的别名。命令sea pfsea smt --prove的别名。

  4. sea clp file.c -o file.clp:以CLP格式生成CHC。

  5. sea lfe file.c -o file.ll:运行传统前端

要查看所有命令,请键入sea --help。要查看每个单独命令CMD(例如horn)的选项,请键入sea CMD --help(例如sea horn --help)。

使用抽象解释进行静态分析

使用Crab推断归纳不变量

SeaHorn默认不使用Crab。要启用Crab,请在sea命令中添加选项--crab

抽象解释器默认是过程内的,并使用Zones域作为数值抽象域。这些默认选项对于普通用户来说应该足够了。对于开发人员,如果您想使用其他抽象域,您需要:

  1. 使用cmake选项-DCRAB_USE_LDD=ON -DCRAB_USE_ELINA=ON进行编译
  2. 使用选项--crab-dom=DOM运行sea,其中DOM可以是:
    • int表示区间
    • term-int表示具有未解释函数的区间
    • boxes:表示不相交区间
    • oct表示八面体
    • pk表示多面体

要使用crab过程间分析,您需要使用选项--crab-inter运行sea

默认情况下,抽象解释器仅推理标量变量(即LLVM寄存器)。使用选项--crab-track=mem --crab-singleton-aliases=true运行sea可以推理内存内容。

如何在Spacer中使用Crab生成的不变量

Crab主要是路径不敏感的,而我们的Horn子句求解器Spacer是路径敏感的。虽然路径不敏感分析更高效,但通常需要路径敏感性来证明所关注的属性。这促使我们决定首先运行Crab(如果选项为--crab),然后将生成的不变量传递给Spacer。目前Spacer有两种方式使用Crab生成的不变量。sea选项--horn-use-invs=VAL告诉spacer如何使用这些不变量:

  • 如果VAL等于bg,则不变量仅用于帮助spacer证明引理是归纳的。
  • 如果VAL等于always,则行为类似于bg,但此外不变量还用于帮助spacer阻止反例。

默认值为bg。当然,如果Crab可以证明程序是安全的,那么Spacer就不会产生任何额外的开销。

属性规范

假定属性是断言。SeaHorn提供了一个静态断言命令sassert,如下例所示

/* 验证命令: sea pf --horn-stats test.c */ #include "seahorn/seahorn.h" extern int nd(); int main(void) { int k = 1; int i = 1; int j = 0; int n = nd(); while (i < n) { j = 0; while (j < i) { k += (i - j); j++; } i++; } sassert(k >= n); }

在内部,SeaHorn遵循SV-COMP的约定,通过调用指定的错误函数__VERIFIER_error()来编码错误位置。当__VERIFIER_error()不可达时,SeaHorn返回unsat,并且程序被认为是安全的。当__VERIFIER_error()可达时,SeaHorn返回sat,并且程序是不安全的。sassert()方法在seahorn/seahorn.h中定义。

检查代码

除了证明属性或生成反例外,有时检查正在分析的代码以了解其复杂性也很有用。为此,SeaHorn提供了sea inspect命令。例如,给定一个C程序ex.c,输入:

sea inspect ex.c --sea-dsa=cs+t --mem-dot
 

选项--sea-dsa=cs+t启用了在FMCAD19中描述的新的上下文敏感、类型敏感sea-dsa分析。此命令为输入程序中的每个函数FUN生成一个FUN.mem.dot文件。要可视化主函数的图,请使用web graphviz界面,或以下命令:

$ dot -Tpdf main.mem.dot -o main.mem.pdf

有关内存图的更多详细信息,请参见SeaDsa存储库:这里

使用sea inspect --help查看所有选项。目前,可用的选项有:

  • sea inspect --profiler打印函数、基本块、循环等的数量。
  • sea inspect --mem-callgraph-dotdot格式打印SeaDsa构建的调用图。
  • sea inspect --mem-callgraph-stats将SeaDsa完成的调用图构建的一些统计信息打印到标准输出。
  • sea inspect --mem-smc-stats打印SeaDsa可以证明安全的内存访问的数量。

安装

开始使用SeaHorn的最简单方法是通过docker分发。

$ docker pull seahorn/seahorn-llvm10:nightly $ docker run --rm -it seahorn/seahorn-llvm10:nightly

从探索sea命令可以做什么开始:

$ sea --help $ sea pf --help

nightly标签每天自动刷新,包含最新的开发版本。我们不频繁地维护所有其他标签(需要手动更新)。请在DockerHub上检查日期,如果它们太旧,请在GitHub上记录问题。

博客上有其他示例和配置选项。博客很少更新。特别是,选项会发生变化,功能会被淘汰,会添加新的东西。如果您在博客中发现问题,请告诉我们。我们至少会更新博客文章,以表明它不应与最新版本的代码一起使用。

您也可以手动安装:

按照Docker文件中的说明进行操作 Dockerfile: docker/seahorn-builder.Dockerfile

如果这不起作用,请运行:

$ wget https://apt.llvm.org/llvm.sh $ chmod +x llvm.sh $ sudo ./llvm.sh 14 $ apt download libpolly-14-dev && sudo dpkg --force-all -i libpolly-14-dev*

前3个命令将安装LLVM 14,第4个命令将安装libpolly,它被错误地从LLVM 14中省略(但包含在后续版本中)

接下来,按照上面的Docker文件中的说明进行操作

开发者专区

从这一点开始的信息仅供开发人员使用。如果您想为SeaHorn做出贡献,基于它构建自己的工具,或者只是对它的内部工作原理感兴趣,请继续阅读。

编译说明

SeaHorn需要LLVMZ3boost。库的确切版本不断变化,但使用cmake技巧来检查是否有正确的版本可用。

要指定任何依赖项的特定版本,请使用通常的<PackageName>_ROOT和/或<PackageName>_DIR(有关详细信息,请参见 CMAKE_BUILD_TYPE的其他合法选项是DebugCoverage。请注意CMAKE_BUILD_TYPE必须与编译LLVM时使用的兼容。特别是,如果要以Debug模式编译SeaHorn,你需要LLVMDebug版本。如果决定走这条路,请确保你有足够的耐心、硬盘空间和时间。

或者,也可以使用cmake预设来配置项目。只需运行以下命令:

$ cmake --preset <BUILD_TYPE>-<PRESET_NAME>

来配置cmake,其中<BUILD_TYPE>DebugRelWithDebInfoCoverage之一,<PRESET_NAME>是你想使用的预设。目前可用的预设是:jammy。这些预设假设你已将Z3安装在/opt/z3-4.8.9,将Yices安装在/opt/yices-2.6.1

这还允许使用VS Code的CMake Tools扩展在VS Code中配置和编译项目。

如果你想使用不同的编译设置,或者在其他目录中安装了Z3或Yices,你需要创建自己的CMakeUserPresets.json文件,其中包含你自己的预设。

在Mac上编译

不要包含-DSEA_ENABLE_LLD=ON。默认编译器是clang,所以你可能不需要明确设置它。

EXTRA目标

SeaHorn提供了几个通过extra目标自动克隆和安装的组件。这些组件可以在SeaHorn之外的其他项目中使用。

  • sea-dsa: git clone https://github.com/seahorn/sea-dsa.git

    sea-dsa是一个新的基于DSA的堆分析。与llvm-dsa不同,sea-dsa是上下文敏感的,因此在存在函数调用时可以生成更细粒度的堆分区。

  • clam: git clone https://github.com/seahorn/crab-llvm.git

    clam使用抽象解释技术为SeaHorn的其他后端提供归纳不变量。

  • llvm-seahorn: git clone https://github.com/seahorn/llvm-seahorn.git

    llvm-seahorn提供了针对验证定制的InstCombineIndVarSimplify LLVM pass版本,以及将未定义值转换为非确定性调用的LLVM pass等。

SeaHorn没有自带Clang版本,它期望在构建目录(run/bin)或PATH中找到Clang。确保Clang的版本与用于编译SeaHorn的LLVM版本匹配(目前是LLVM14)。提供正确版本Clang的最简单方法是从llvm.org下载,解压到某处,并在run/bin中创建clangclang++的符号链接。

$ cd seahorn/build/run/bin $ ln -s <CLANG_ROOT>/bin/clang clang $ ln -s <CLANG_ROOT>/bin/clang++ clang++

其中<CLANG_ROOT>是解压Clang的位置。

测试

测试基础设施依赖于几个Python包。这些包有自己的依赖项。如果你无法弄清楚它们,请改用docker。

$ pip install lit OutputCheck networkx pygraphviz

覆盖率

我们可以使用gcovlcov为SeaHorn生成测试覆盖率信息。要启用覆盖率构建,我们需要在不同的目录下运行构建,并在cmake配置期间将CMAKE_BUILD_TYPE设置为Coverage

test-opsem目标生成覆盖率报告的示例步骤:

  1. mkdir coverage; cd coverage 创建并进入覆盖率构建目录
  2. cmake -DCMAKE_BUILD_TYPE=Coverage <其他你想要的标志> ../
  3. 像往常一样完成构建
  4. cmake --build . --target test-opsem 运行OpSem测试,现在应该在相应的CMakeFiles目录中创建了.gcda.gcno文件
  5. lcov -c --directory lib/seahorn/CMakeFiles/seahorn.LIB.dir/ -o coverage.info 从所需模块收集覆盖率数据, 如果使用clang作为编译器而不是gcc,创建一个bash脚本llvm-gcov.sh:
#!/bin/bash exec llvm-cov gcov "$@"
$ chmod +x llvm-gcov.sh

然后将--gcov-tool <包装脚本的路径>/llvm-gcov.sh附加到lcov -c ...命令。 6. 从所需目录提取数据并生成html报告:

lcov --extract coverage.info "*/lib/seahorn/*" -o lib.info lcov --extract coverage.info "*/include/seahorn/*" -o header.info cat header.info lib.info > all.info genhtml all.info --output-directory coverage_report

然后在浏览器中打开coverage_report/index.html查看覆盖率报告

另请参阅CI使用的scripts/coverage脚本。每晚构建的覆盖率报告可在codecov上获得

代码索引

使用-DCMAKE_EXPORT_COMPILE_COMMANDS=ON选项为cmake生成seahorn项目及其所有子项目的编译数据库

让代码索引与编译数据库支持一起工作的一个简单方法是将compilation_database.json文件链接到主项目目录,并按照编辑器特定的说明进行操作。

CLion的远程配置

有关CLion远程工作流的详细指南,请查看Clion-configuration

Emacs(和其他编辑器)的远程配置

使用我们的mainframer分支。不要错过示例配置

贡献者

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多