如何查找特定类型的所有赋值表达式

时间:2019-07-23 09:07:33

标签: c static-analysis

说我有一些结构定义,例如

struct sql_subtype {
    sql_type *type;
    unsigned int digits;
    unsigned int scale;
}

此结构sql_subtype在我的代码库中到处都是巨大的。这种类型的对象通常是其他对象的成员。因此,简单的字符串匹配不足以找到分配位置。是否有一些不错的技巧或开源静态分析工具可以为我提供代码库中将该类型的任何对象设置为某个值的位置?查找与

相似的所有位置
struct sql_subtype type1 = type2;

c1->t = c2->t; // where the t's are of the type of interest.

一般问题:给定包含涉及某个运算符并返回某种类型的表达式的类,我如何找到所有包含此类表达式的语句?

1 个答案:

答案 0 :(得分:1)

这不是一般的解决方案,但是有一种方法可以单独使用C编译器来查找struct分配。 C允许您将结构的成员声明为const,因此可以向声明为struct的{​​{1}}添加一个额外的成员,并且只有赋值会失败:

const

使用GCC进行编译,唯一得到的诊断信息就是

struct sql_subtype {
    unsigned int digits;
    unsigned int scale;
    const unsigned int poison_pill;
};

void function_call(struct sql_subtype foo) {
    struct sql_subtype initialized_from_copy = foo;
    initialized_from_copy.digits = 42;
    struct sql_subtype another = {0};
    another = foo;
}

// if the const member is the last one even initializer lists will work!
struct sql_subtype initialized = {1, 2};

int main(void) {
    function_call(initialized);
}