danmar/cppcheck
GitHub: danmar/cppcheck
Cppcheck 是一款开源的 C/C++ 静态代码分析工具,无需编译即可检测内存泄漏、缓冲区溢出等安全缺陷和代码质量问题。
Stars: 6523 | Forks: 1555
# Cppcheck
|release-windows|OSS-Fuzz|Coverity Scan Build Status|include-what-you-use|License|
|:--:|:--:|:--:|:--:|:--:|
|[](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”。
尽管名称如此,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 / 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。可在此处下载:
http://software-download.name/pcre-library-windows/
### 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 安装程序:https://cppcheck.sourceforge.io。 - (Windows) 当前开发版本的官方构建可通过 [release-windows](https://github.com/danmar/cppcheck/actions/workflows/release-windows.yml) 工作流获取。它们针对 `main` 分支每夜构建,针对发布分支则每次提交构建。由于这些是开发版本,请勿在生产环境中使用! - 便携版软件包(即不需要安装)作为 `portable` 构件提供。这仍在开发中 - 详情请参阅 https://trac.cppcheck.net/ticket/10771。 - 可通过 `installer` 构件获取安装程序。 - (多平台) 可通过 https://www.cppcheck.com 购买由 Cppcheck 原作者提供的具有额外功能的高级版本。 ### 第三方 第三方软件包***不是***由 Cppcheck 团队维护,而是由其各自的打包者维护。 *注意:* 以下列表仅供参考,排名不分先后。 *注意:* 请始终尝试首先从您操作系统/发行版的主要官方来源获取软件包,并确保您获得的是最新发布/标记版本(参见 https://github.com/danmar/cppcheck/tags)。不过,某些软件包可能不包含最新的补丁版本。 *注意:* 某些问题可能与这些软件包中的构建所携带的额外补丁或打包本身有关。请先尝试使用官方构建验证问题,然后再向上游报告。否则,您可能需要向软件包的相应维护者报告。 - (Windows / 过时) 可通过 https://portableapps.com/apps/development/cppcheck-portable 获取便携版软件包。 - (Windows / 过时) 可通过 https://community.chocolatey.org/packages/cppcheck 获取软件包。 - (Windows / 过时) 可通过 https://winget.run/pkg/Cppcheck/Cppcheck 获取软件包。 - (Windows) 可通过 https://scoop.sh/#/apps?q=cppcheck 获取软件包。 - (Linux/Unix) 许多主要发行版通过其集成包管理器(`yum`、`apt`、`pacman` 等)提供 Cppcheck 软件包。概览请参见 https://pkgs.org/search/?q=cppcheck 或 https://repology.org/project/cppcheck。 - (Linux/Unix) 除非您使用的是“滚动”发行版,否则它们可能不包含最新版本。有一些外部(主要是不受支持的)存储库,如 AUR (ArchLinux)、PPA (ubuntu)、EPEL (CentOS/Fedora) 等,可能会提供最新的软件包。 - (Linux/Unix / 过时) Canonical Snapcraft 软件包(https://snapcraft.io/cppcheck / https://snapcraft.io/cppcheckgui)无人维护且包含非常旧的(开发)版本。请避免使用它们!更多详情请参见 https://trac.cppcheck.net/ticket/11641。 - (MacOS) 可通过 Homebrew (`brew`) 获取软件包。参见 https://formulae.brew.sh/formula/cppcheck。 - (MacOS) 可通过 https://ports.macports.org/port/cppcheck 获取软件包。 - (多平台) 可通过 https://anaconda.org/conda-forge/cppcheck 获取软件包。 - (多平台) 可通过 https://conan.io/center/recipes/cppcheck 获取软件包。 - 也可以从各种下载门户获取软件包(主要是 Windows 安装程序 - 有时会重新打包)。 ## 网页 https://cppcheck.sourceforge.io/
### 官方 官方软件包由 Cppcheck 团队维护。 - (Windows) 可通过官方 Cppcheck SourceForge 页面获取官方 Windows 安装程序:https://cppcheck.sourceforge.io。 - (Windows) 当前开发版本的官方构建可通过 [release-windows](https://github.com/danmar/cppcheck/actions/workflows/release-windows.yml) 工作流获取。它们针对 `main` 分支每夜构建,针对发布分支则每次提交构建。由于这些是开发版本,请勿在生产环境中使用! - 便携版软件包(即不需要安装)作为 `portable` 构件提供。这仍在开发中 - 详情请参阅 https://trac.cppcheck.net/ticket/10771。 - 可通过 `installer` 构件获取安装程序。 - (多平台) 可通过 https://www.cppcheck.com 购买由 Cppcheck 原作者提供的具有额外功能的高级版本。 ### 第三方 第三方软件包***不是***由 Cppcheck 团队维护,而是由其各自的打包者维护。 *注意:* 以下列表仅供参考,排名不分先后。 *注意:* 请始终尝试首先从您操作系统/发行版的主要官方来源获取软件包,并确保您获得的是最新发布/标记版本(参见 https://github.com/danmar/cppcheck/tags)。不过,某些软件包可能不包含最新的补丁版本。 *注意:* 某些问题可能与这些软件包中的构建所携带的额外补丁或打包本身有关。请先尝试使用官方构建验证问题,然后再向上游报告。否则,您可能需要向软件包的相应维护者报告。 - (Windows / 过时) 可通过 https://portableapps.com/apps/development/cppcheck-portable 获取便携版软件包。 - (Windows / 过时) 可通过 https://community.chocolatey.org/packages/cppcheck 获取软件包。 - (Windows / 过时) 可通过 https://winget.run/pkg/Cppcheck/Cppcheck 获取软件包。 - (Windows) 可通过 https://scoop.sh/#/apps?q=cppcheck 获取软件包。 - (Linux/Unix) 许多主要发行版通过其集成包管理器(`yum`、`apt`、`pacman` 等)提供 Cppcheck 软件包。概览请参见 https://pkgs.org/search/?q=cppcheck 或 https://repology.org/project/cppcheck。 - (Linux/Unix) 除非您使用的是“滚动”发行版,否则它们可能不包含最新版本。有一些外部(主要是不受支持的)存储库,如 AUR (ArchLinux)、PPA (ubuntu)、EPEL (CentOS/Fedora) 等,可能会提供最新的软件包。 - (Linux/Unix / 过时) Canonical Snapcraft 软件包(https://snapcraft.io/cppcheck / https://snapcraft.io/cppcheckgui)无人维护且包含非常旧的(开发)版本。请避免使用它们!更多详情请参见 https://trac.cppcheck.net/ticket/11641。 - (MacOS) 可通过 Homebrew (`brew`) 获取软件包。参见 https://formulae.brew.sh/formula/cppcheck。 - (MacOS) 可通过 https://ports.macports.org/port/cppcheck 获取软件包。 - (多平台) 可通过 https://anaconda.org/conda-forge/cppcheck 获取软件包。 - (多平台) 可通过 https://conan.io/center/recipes/cppcheck 获取软件包。 - 也可以从各种下载门户获取软件包(主要是 Windows 安装程序 - 有时会重新打包)。 ## 网页 https://cppcheck.sourceforge.io/
标签:Bash脚本, Bug检测, C/C++, Cppcheck, DevSecOps, GPL-3.0, pocsuite3, 上游代理, 事务性I/O, 二进制发布, 云安全监控, 安全专业人员, 开源工具, 编译器技术, 软件测试, 逆向工具, 错误基检测, 静态代码分析, 静态分析