如何执行 cppcheck 交叉翻译单元 (CTU) 静态分析?



Cppcheck文档似乎暗示可以跨多个翻译单元进行分析,如--max-ctu-depths标志所示。这显然不适用于这里的玩具示例:

主.cpp:

int foo();
int main (void)
{
return 3 / foo();
}

foo.cpp:

int foo(void)
{
return 0;
}

即使设置了--enable=all--inconclusive,此问题也不会出现在报告中。似乎 cppcheck 可能不是为了进行跨文件分析而设计的,但max-ctu-depths标志有所不同。我在这里错过了什么吗?任何帮助不胜感激!

我是一名 cppcheck 开发人员。

Cppcheck中的整个程序分析非常有限。我们有一些这样的分析,但它不是很"深入",也不是很复杂。它当前仅跟踪传递到函数中的值。

一些示例测试用例(随意将这些代码示例复制/粘贴到不同的文件中(: https://github.com/danmar/cppcheck/blob/main/test/testbufferoverrun.cpp#L4272 https://github.com/danmar/cppcheck/blob/main/test/testbufferoverrun.cpp#L4383 https://github.com/danmar/cppcheck/blob/main/test/testbufferoverrun.cpp#L4394 https://github.com/danmar/cppcheck/blob/main/test/testnullpointer.cpp#L3281 https://github.com/danmar/cppcheck/blob/main/test/testuninitvar.cpp#L4723

..然后是整个未使用的功能检查器。

如果您使用的是线程,则必须使用--cppcheck-build-dir来使 CTU 成为可能。

根据 CTU 检查器的文档和源代码(以及关联的标头(,它不包含交叉翻译单元除以零检查。

CTU 类(和检查器(的少数入口点之一是CTU::getUnsafeUsage,其描述(在代码中(如下:

强调
">

"不安全"功能在写入数据之前无条件读取数据

std::list<CTU::FileInfo::UnsafeUsage> CTU::getUnsafeUsage(...) {
std::list<CTU::FileInfo::UnsafeUsage> unsafeUsage;
// Parse all functions in TU
const SymbolDatabase *const symbolDatabase = tokenizer->getSymbolDatabase();
for (const Scope &scope : symbolDatabase->scopeList) {
// ...
// "Unsafe" functions unconditionally reads data before it is written..
for (int argnr = 0; argnr < function->argCount(); ++argnr) {
// ...
}
}
return unsafeUsage;
}
.."。

在CTU 检查器的上下文中,没有提到除以零分析。


似乎cppcheck可能不是为了进行跨文件分析而设计的

基于CTU类公共API的简洁性,cppchecks跨文件分析目前确实有些有限。

最新更新