用于声明可能与结构中的变量或成员匹配的元变量的正确类型是什么?

时间:2010-01-11 18:07:08

标签: c coccinelle

用于声明可能与结构中的变量或成员匹配的元变量的正确类型是什么?

以下面的示例源代码为例:

#include <stdio.h>
#include <stdlib.h>

struct some_struct {
        int i;
        char *s;
};

void test(void)
{
        struct some_struct *ptr;
        char *s;

        s = malloc(100);
        ptr = malloc(sizeof(struct some_struct));
        ptr->s = malloc(100);

        puts("done");
}

使用以下semantic patch

@@
identifier ptr;
//idexpression ptr;
//expression ptr;
expression E;
@@

ptr = malloc(E);
+if (ptr == NULL)
+       return;

除非使用ptr->s,否则expression ptr分配不匹配。使用expression对我来说似乎有点过于宽泛。这是正确的,也是唯一的方法吗?

1 个答案:

答案 0 :(得分:1)

通常,您希望捕获任何左值指针 - 但由于您只匹配表达式从malloc赋值的位置,因此普通表达式可以正常工作(因为非指针或非左值应使编译器抱怨)。

您将遇到的问题是表达式是否有副作用,例如:

struct some_struct *a[10];
int i = 0;

a[i++] = malloc(sizeof(struct some_struct));