cppcheck-opensource/cppcheck
GitHub: cppcheck-opensource/cppcheck
一款开源的 C/C++ 静态代码分析工具,无需编译即可检测代码中的 bug、安全漏洞和编码规范问题。
Stars: 6602 | Forks: 1564
# **Cppcheck**
|release-windows|OSS-Fuzz|Coverity Scan Build Status|include-what-you-use|许可证|
|:--:|:--:|:--:|:--:|:--:|
|[](https://github.com/danmar/cppcheck/actions/workflows/release-windows.yml)|[](https://bugs.chromium.org/p/oss-fuzz/issues/list?sort=-opened&can=1&q=proj:cppcheck)|[](https://scan.coverity.com/projects/512)|[](https://github.com/danmar/cppcheck/actions/workflows/iwyu.yml)|[](https://opensource.org/licenses/GPL-3.0)|
## 关于名称
该程序的最初名称是“C++check”,但后来改为“Cppcheck”。
尽管名字里有 C++,但 Cppcheck 是为 C 和 C++ 共同设计的。
## 手册
提供有[在线](https://cppcheck.sourceforge.io/manual.pdf)手册。
## 捐赠 CPU
Cppcheck 是一个资源有限的业余项目。你可以通过捐赠 CPU 来帮助我们(默认使用 1 个核心,或者随你喜欢使用任意数量的核心。使用 `-j` 标志来使用更多核心)。这很简单:
1. 下载(并解压)Cppcheck 源代码。
2. 运行(Linux/MacOS 示例):
cd cppcheck/
python3 -m venv .venv
source .venv/bin/activate
pip install -r tools/donate-cpu-requirements.txt
./tools/donate-cpu.py
该脚本将分析 Debian 源代码并将结果上传到 Cppcheck 服务器。我们需要这些结果来改进 Cppcheck 并检测退化问题。
你可以随时使用 Ctrl+C 停止脚本。
## 编译
Cppcheck 需要一个支持(部分)C++11 的 C++ 编译器。最低要求版本为 GCC 5.1 / Clang 3.5 / AppleClang 6.0 / Visual Studio 2015。
要构建 GUI 应用程序,你需要使用 CMake 构建系统。
在构建命令行工具时,[PCRE](http://www.pcre.org/) 是可选的。如果你在构建时使用了规则,则会用到它。
有多种编译选项:
* CMake - 跨平台构建工具
* (Windows) Visual Studio
* (Windows) Qt Creator + MinGW
* GNU 编译器 - 通过 make 或直接使用
最低要求的 Python 版本为 3.7。
### CMake
最低要求的版本是 CMake 3.22。
示例,使用 cmake 编译 Cppcheck:
```
cmake -S . -B build
cmake --build build
```
如果你想编译 GUI,你可以使用该标志。
`-DBUILD_GUI=ON`
要获取规则支持(需要 pcre),请使用该标志。
`-DHAVE_RULES=ON`
对于发布版本,建议你使用:
`-DUSE_MATCHCOMPILER=ON`
要构建测试,请使用该标志。
`-DBUILD_TESTING=ON`
使用 CMake,你可以为 Visual Studio、XCode 等生成项目文件。
#### 构建特定配置
对于单配置生成器(如 "Unix Makefiles"),你可以使用以下命令生成并构建特定配置(例如 "`RelWithDebInfo`"):
```
cmake -S . -B build_RelWithDebInfo -DCMAKE_BUILD_TYPE=RelWithDebInfo ..
cmake --build build_RelWithDebInfo --config RelWithDebInfo
```
对于多配置生成器(如 "Visual Studio 17 2022"),可以通过以下方式实现:
```
cmake -S . -B build
cmake --build build --config RelWithDebInfo
```
### Visual Studio
使用 `cppcheck.sln` 文件。该文件是为 Visual Studio 2019 配置的,但可以轻松地将平台工具集更改为更旧或更新的版本。该解决方案包含 x86 和 x64 的平台目标。
要编译带规则的版本,请选择 "`Release-PCRE`" 或 "`Debug-PCRE`" 配置。此时预期 `pcre.lib`(x64 构建为 `pcre64.lib`)和 `pcre.h` 位于 `/externals` 中。可以使用 [vcpkg](https://github.com/microsoft/vcpkg) 获取适用于 Visual Studio 的最新版 PCRE。
### Visual Studio(通过命令行)
如果你不希望使用 Visual Studio IDE,可以通过以下命令从命令行编译 Cppcheck。
```
msbuild cppcheck.sln
```
### VS Code(在 Windows 上)
安装 MSYS2 以获取包含 g++ 和 gdb 的 GNU 工具链( )。
在 `.vscode` 文件夹中创建一个包含以下内容的 `settings.json` 文件(根据需要调整路径):
```
{
"terminal.integrated.shell.windows": "C:\\msys64\\usr\\bin\\bash.exe",
"terminal.integrated.shellArgs.windows": [
"--login",
],
"terminal.integrated.env.windows": {
"CHERE_INVOKING": "1",
"MSYSTEM": "MINGW64",
}
}
```
在终端中运行 `make` 来构建 Cppcheck。
要进行调试,请在 `.vscode` 文件夹中创建一个包含以下内容的 `launch.json` 文件,其中涵盖了调试 Cppcheck 和 `misra.py` 的配置:
```
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "cppcheck",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/cppcheck.exe",
"args": [
"--dump",
"${workspaceFolder}/addons/test/misra/misra-test.c"
],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": true,
"MIMode": "gdb",
"miDebuggerPath": "C:/msys64/mingw64/bin/gdb.exe",
"setupCommands": [
{
"description": "Enable pretty-printing for gdb",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
]
},
{
"name": "misra.py",
"type": "python",
"request": "launch",
"program": "${workspaceFolder}/addons/misra.py",
"console": "integratedTerminal",
"args": [
"${workspaceFolder}/addons/test/misra/misra-test.c.dump"
]
}
]
}
```
### Qt Creator + MinGW
构建 CLI 需要 PCRE dll。可以从这里下载:
### GNU 编译器
#### GNU make
简单、无优化的构建(无依赖项):
```
make
```
你可以使用 `CXXOPTS`、`CPPOPTS` 和 `LDOPTS` 追加到现有的 `CXXFLAGS`、`CPPFLAGS` 和 `LDFLAGS` 中,而不是覆盖它们。
推荐的发布版本构建命令为:
```
make MATCHCOMPILER=yes FILESDIR=/usr/share/cppcheck HAVE_RULES=yes CXXOPTS="-O2" CPPOPTS="-DNDEBUG"
```
#### g++(面向专家)
如果你只想构建没有依赖项的 Cppcheck,你可以使用此命令:
```
g++ -o cppcheck -std=c++11 -Iexternals -Iexternals/simplecpp -Iexternals/tinyxml2 -Iexternals/picojson -Ilib -Ifrontend frontend/*.cpp cli/*.cpp lib/*.cpp externals/simplecpp/simplecpp.cpp externals/tinyxml2/tinyxml2.cpp
```
#### 标志
* `MATCHCOMPILER=yes`
在编译时将几个 `Token` 匹配模式转换为更高效的 C++ 代码(需要安装 Python)。
* `FILESDIR=/usr/share/cppcheck`
指定 Cppcheck 文件(addons、cfg、platform)的安装目标文件夹。
* `HAVE_RULES=yes`
启用规则(需要安装 PCRE)。
* `CXXOPTS="-O2"`
启用大多数编译器优化。
* `CPPOPTS="-DNDEBUG"`
禁用断言。
* `HAVE_BOOST=yes`
启用来自 Boost 的更高效容器(需要安装 Boost)。
### MinGW
```
mingw32-make
```
如果你在使用 `MATCHCOMPILER=yes` 时遇到以下错误,你需要通过 `PYTHON_INTERPRETER` 指定你的 Python 解释器。
```
process_begin: CreateProcess(NULL, which python3, ...) failed.
makefile:24: pipe: No error
process_begin: CreateProcess(NULL, which python, ...) failed.
makefile:27: pipe: No error
makefile:30: *** Did not find a Python interpreter. Stop.
```
### 其他编译器/IDE
1. 创建一个空的项目文件 / makefile。
2. 将 Cppcheck 的 cli 和 lib 文件夹中的所有 cpp 文件添加到项目文件 / makefile 中。
3. 将 externals 文件夹中的所有 cpp 文件添加到项目文件 / makefile 中。
4. 编译。
### 在 Linux 中交叉编译 Win32 (CLI) 版本的 Cppcheck
```
sudo apt-get install mingw32
make CXX=i586-mingw32msvc-g++ LDFLAGS="-lshlwapi" RDYNAMIC=""
mv cppcheck cppcheck.exe
```
## 软件包
除了在你选择的平台上自行构建外,还有几种方法可以获取预编译包。
### 官方
官方软件包由 Cppcheck 团队维护。
* (Windows) 可通过官方 Cppcheck SourceForge 页面获取官方 Windows 安装程序:。
* (Windows) 可通过 [release-windows](https://github.com/danmar/cppcheck/actions/workflows/release-windows.yml) 工作流获取当前开发版本的官方构建。它们针对 `main` 分支每晚构建一次,针对发布分支则在每次提交时构建。由于这些是开发版本,请避免在生产环境中使用它们!
* 作为一个 `portable` 构件,提供了一个便携包(即无需安装)。这仍是一个正在开发中的工作——详情请参阅 。
* 可通过 `installer` 构件获取安装程序。
* (多平台) 可通过 购买由 Cppcheck 原作者提供的具有附加功能的高级版本。
### 第三方
第三方软件包由各自的打包者维护,***而非*** Cppcheck 团队。
*注意:* 以下列表仅供参考,排名不分先后。
*注意:* 请始终首先尝试从你的操作系统/发行版的主要官方源获取软件包,并确保你获得的是最新发布/打标签的版本(参见 )。不过,某些软件包可能没有包含最新的补丁版本。
*注意:* 某些问题可能与这些软件包中的构建所包含的额外补丁或打包方式本身有关。请在向上游报告之前尝试使用官方版本重现该问题。否则,你可能需要向该软件包的相应维护者报告。
* (Windows / 过时) 可通过 获取便携包。
* (Windows / 过时) 可通过 获取软件包。
* (Windows / 过时) 可通过 获取软件包。
* (Windows) 可通过 获取软件包。
* (Linux/Unix) 许多大的发行版都通过其集成的包管理器(`yum`、`apt`、`pacman` 等)提供 Cppcheck 软件包。有关概述,请参见 或 。
* (Linux/Unix) 除非你使用的是“滚动更新”的发行版,否则它们可能没有包含最新版本。有几个外部(主要是不受支持的)仓库,如 AUR (ArchLinux)、PPA (Ubuntu)、EPEL (CentOS/Fedora) 等,可能会提供最新的软件包。
* (Linux/Unix / 过时) Canonical Snapcraft 软件包( / )已无人维护,并且包含非常旧的(开发)版本。请避免使用它们!更多细节请参见 。
* (MacOS) 可通过 Homebrew (`brew`) 获取软件包。参见 。
* (MacOS) 可通过 获取软件包。
* (多平台) 可通过 获取软件包。
* (多平台) 可通过 获取软件包。
* 还可以从各种下载门户获取软件包(主要是 Windows 安装程序——有时是重新打包的)。
## 网页
标签:Bash脚本, C++, C++11, Clang, Cppcheck, Debian, DNS解析, GCC, GPLv3, GUI, MacOS, odt, OSS-Fuzz, Python 3.9+, SAST, SOC Prime, Visual Studio, 云安全监控, 代码分析, 代码安全, 代码审查, 凭证管理, 安全专业人员, 开发工具, 开源框架, 开源项目, 抽象语法树, 持续集成, 数据擦除, 数据管道, 测试, 漏洞枚举, 盲注攻击, 编译器, 软件工程, 逆向工具, 静态代码检测, 静态分析