【安全工具】华为 C/C++ 静态代码分析工具 Cooddy 环境搭建
Cooddy是华为开源的一款基于Clang AST的源代码静态分析工具,支持数据流分析和静态符号执行技术。
文章目录
1 项目简介
-
工具定位:
Cooddy 是华为开源的 C/C++ 源代码静态分析工具,基于 Clang 生成的抽象语法树(AST)、控制流(Control Flow)和调用图(Call Graphs),结合数据流分析(Data-Flow Analysis)和静态符号执行(Static Symbolic Execution)技术,用于检测代码中的安全漏洞和质量问题。
-
官方地址:
https://github.com/program-analysis-team/cooddy
-
核心能力:
可检测内存泄漏、缓冲区溢出、空指针解引用、未定义行为等低级白盒安全问题,适用于嵌入式、物联网等对代码安全性要求高的场景。
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++ 项目进行静态分析,有效检测内存安全漏洞和代码质量问题,适用于安全审计和持续集成流程。
昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链
更多推荐

所有评论(0)