1 项目简介

  1. 工具定位

    Cooddy 是华为开源的 C/C++ 源代码静态分析工具,基于 Clang 生成的抽象语法树(AST)、控制流(Control Flow)和调用图(Call Graphs),结合数据流分析(Data-Flow Analysis)和静态符号执行(Static Symbolic Execution)技术,用于检测代码中的安全漏洞和质量问题。

  2. 官方地址

    https://github.com/program-analysis-team/cooddy

  3. 核心能力

    可检测内存泄漏、缓冲区溢出、空指针解引用、未定义行为等低级白盒安全问题,适用于嵌入式、物联网等对代码安全性要求高的场景。

2 环境编译

笔者实测 Ubuntu 20.04.6 版本,Ubuntu 22.04.5版本可行。

如果使用其他版本,需要保证下列环境可以正常安装,版本之间可能存在兼容问题。

2.1 依赖安装

基础依赖(Ubuntu 20.04.6):

cd /opt
sudo apt-get update && apt-get install python3 python3-distutils make git gcc-8 g++-8 libz-dev wget unzip libtinfo-dev libssl-dev -y
# 配置默认GCC版本
ln -sf /usr/bin/gcc-8 /usr/bin/gcc && ln -sf /usr/bin/g++-8 /usr/bin/g++
ln -sf /usr/bin/gcc-8 /usr/bin/cc && ln -sf /usr/bin/g++-8 /usr/bin/c++

基础依赖(Ubuntu 22.04.5):

sudo apt-get update && sudo apt-get install python3 python3-distutils make git libz-dev wget unzip libtinfo-dev libssl-dev -y

安装 cmake(3.25.0 版本):

# 网络不通的话,需要手动导入zip包
cd /opt
wget https://github.com/Kitware/CMake/archive/refs/tags/v3.25.0.zip
unzip v3.25.0.zip && cd CMake-3.25.0
mkdir build && cd build
../configure
sudo make -j 1 && sudo make install

2.2 编译三方依赖

Cooddy 使用 clang 和 z3 的独立库,因此需要手动构建指定版本。现在 Cooddy 基于 LLVM 14.0 和 z3 4.8.9。至于 LLVM 项目的向后兼容性不能保证。

z3(4.8.9 版本):

# 网络不通的话,需要手动导入zip包
cd /opt
wget https://github.com/Z3Prover/z3/releases/download/z3-4.8.9/z3-4.8.9-x64-ubuntu-16.04.zip

unzip z3-4.8.9-x64-ubuntu-16.04.zip && mv z3-4.8.9-x64-ubuntu-16.04 z3

# export Z3_HOME=<path_to_z3_installation>
export Z3_HOME=/opt/z3/

LLVM(14.0.0 版本):

# 网络不通的话,需要手动导入zip包
cd /opt
wget https://github.com/llvm/llvm-project/archive/refs/tags/llvmorg-14.0.0.zip

unzip llvmorg-14.0.0.zip && cd llvm-project-llvmorg-14.0.0

mkdir build && cd build

# cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang" -DLLVM_ENABLE_TERMINFO=OFF -DCMAKE_CXX_STANDARD=17 -DCMAKE_INSTALL_PREFIX=<path_to_clang_installation> -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF ../llvm

# 注意参数 -DCMAKE_INSTALL_PREFIX 的值是安装目录
cmake -DCMAKE_BUILD_TYPE=Release -DLLVM_ENABLE_PROJECTS="clang" -DLLVM_ENABLE_TERMINFO=OFF -DCMAKE_CXX_STANDARD=17 -DCMAKE_INSTALL_PREFIX=/opt/llvm-project-llvmorg-14.0.0/ -DLLVM_INCLUDE_TESTS=OFF -DLLVM_INCLUDE_EXAMPLES=OFF ../llvm

# 这一步执行时间很长
make -j 1 && make install

# export LLVM_CMAKE=<path_to_clang_installation>lib/cmake
export LLVM_CMAKE=/opt/llvm-project-llvmorg-14.0.0/lib/cmake

2.2 编译安装 Cooddy

确保设置环境变量 Z3_HOME 和 LLVM_CMAKE:

echo $Z3_HOME
echo $LLVM_CMAKE

编译cooddy:

# 网络不通可以从gitee同步
cd /opt
git clone https://github.com/program-analysis-team/cooddy.git && cd cooddy
# 私有gitee项目
git clone https://gitee.com/yjysss/cooddy.git && cd cooddy

mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -G 'CodeBlocks - Unix Makefiles' ../
make -j 1

完成编译后,在下面路径生成可使用的二进制:/cooddy/build/release
在这里插入图片描述

3 报错解决

3.1 z3 库使用时编译错误

/opt/cooddy/solver/ExecutionContext.cpp: In member function ‘z3::expr ExecutionContext::Execute(const BasicBlock&, ExecutionContext::SymbolsContextPtr, HCXX::ExecutionCallbackRef)’:
/opt/cooddy/solver/ExecutionContext.cpp:113:60: error: ‘class z3::exception’ has no member named ‘what’
         Log(LogLevel::ERROR) << "Z3 execute error: " << ex.what() << std::endl;
                                                            ^~~~
make[2]: *** [solver/CMakeFiles/Solver.dir/build.make:118: solver/CMakeFiles/Solver.dir/ExecutionContext.cpp.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:754: solver/CMakeFiles/Solver.dir/all] Error 2
make: *** [Makefile:136: all] Error 2

原因:z3 环境编译设置错误成export Z3_HOME=/opt/z3/bin,在 cmake 配置中,CMAKE_INSTALL_PREFIX 指向的是 Z3 的安装根目录,需要重新配置Z3_HOME环境变量:

unset Z3_HOME
# 示例路径
export Z3_HOME=/opt/z3/

再重新进行编译:

# 进入项目根目录
cd cooddy
# 清理旧的构建目录(可选)
rm -rf build

# 根据官方文档重新编译cooddy
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release -G 'CodeBlocks - Unix Makefiles' ../
make -j 1

3.2 磁盘空间不足

fatal error: error writing to /tmp/ccAhluWy.s: No space left on device

扩展逻辑卷:使用命令df -h,根据结果扩展占有率高的磁盘;

sudo lvextend -L +5G /dev/mapper/ubuntu--vg-ubuntu--lv
sudo resize2fs /dev/mapper/ubuntu--vg-ubuntu--lv

3.3 cmake 执行文件找不到

报错:/usr/bin/cmake: No such file or directory

手动编译当前安装在:/usr/local/bin/cmake,系统路径未包含。

创建软链接:

# 假设CMake实际在/usr/local/bin
sudo ln -s /usr/local/bin/cmake /usr/bin/cmake
sudo ln -s /usr/local/bin/ctest /usr/bin/ctest
sudo ln -s /usr/local/bin/cpack /usr/bin/cpack

验证结果:

which cmake
cmake --version

4 总结

  • Cooddy 的环境搭建核心在于依赖版本匹配环境变量正确配置,尤其是 z3 和 LLVM 的特定版本要求。编译过程中可能遇到的依赖路径、磁盘空间等问题,可通过上述解决方案快速排查。
  • 搭建完成后,可利用 Cooddy 对 C/C++ 项目进行静态分析,有效检测内存安全漏洞和代码质量问题,适用于安全审计和持续集成流程。
Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐