Klocwork(或其他工具)可以知道类型,typedef和#define指令吗?

Hen*_*iam 6 c++ static-analysis klocwork

我一直在寻找工具来帮助检测阻止程序作为64位代码正常运行的错误.最近,我一直在玩弄Klocwork及其自定义检查器功能,这让我可以使用XPath将源代码导航为树.这对于正则表达式来说是一种"更聪明"的替代方法,但我无法让它知道类型.

例如,假设我想找到一个for使用a int或a long计数的循环的每个实例.以下代码很容易找到.

for (int i = 0; i < 10; i++)
    // ...
Run Code Online (Sandbox Code Playgroud)

搜索此代码很简单,因为变量定义就在循环内部.但是,请考虑以下示例.

int i;
// ...
for (i = 0; i < 10; i++)
    // ...
Run Code Online (Sandbox Code Playgroud)

这很难找到,因为变量定义与循环是分开的,并且必要的XPath表达式要么笨重,要么容易出错.

那么,自定义Klocwork规则可以找到这样的表达式,其中类型感知是必要的,包括解析typedef#define语句?还有其他工具可以做到这一点吗?

编辑1:考虑以下示例.

typedef int myint;

void Foo() {
    int i;
    for (i = 0; i < 10; i++) {
        Bar();
    }

    myint j;
    for (j = 0; j < 10; j++) {
        Bar();
    }
}
Run Code Online (Sandbox Code Playgroud)

ahmeddirie提供解决方案找到了第一个循环,因为i明确定义了类型int.但是,找不到第二个循环,因为typedef模糊了底层类型.用什么工具跟踪类型的方式,将确定第二循环变量j作为的确是一个int

小智 1

不完全确定这是否是您想要的,但您始终可以使用内置函数轻松解析类型。例如,回答您的问题(尽管可能不是您的潜在需求):

\n\n
//ForStmt / Init::ExprStmt / Expr::BinaryExpr [ $type := Left.getTypeName() ] [ $type = 'int' | $type.contains('long') ]\n
Run Code Online (Sandbox Code Playgroud)\n\n

这将非常方便地找到使用 \xe2\x80\x98int\xe2\x80\x99 或 \xe2\x80\x98long int\xe2\x80\x99 计数器类型的 \xe2\x80\x98for\xe2\x80\x99 循环,并且显然可以应用于基于表达式的语句的任何元素。

\n\n

类型定义适合这种操作,无论是程序员定义的还是语言定义的。然而,预处理器定义只会产生它们的本机语言类型(即宏本身不能通过 KAST 进行操作,只能扩展到它扩展的内容)。

\n