Какой правильный тип использовать для объявления метавариабельной переменной, которая может совпадать с переменными или членами в структуре? - PullRequest
0 голосов
/ 11 января 2010

Какой правильный тип использовать для объявления метавариабельной переменной, которая может соответствовать либо переменным, либо членам в структуре?

Возьмем, к примеру, следующий пример исходного кода:

#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");
}

Со следующим семантическим патчем :

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

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

распределение ptr->s не сопоставляется, если не используется expression ptr. Использовать expression для этого мне кажется слишком широко. Это правильно и единственный способ сделать это?

1 Ответ

1 голос
/ 12 января 2010

В общем, вы хотите перехватить любой указатель lvalue - но поскольку вы сопоставляете только те места, где выражению присваивается значение из malloc, простое выражение будет хорошо работать (так как не указатель или не -lvalue должен заставить компилятор жаловаться).

Проблема, с которой вы столкнетесь, заключается в том, что выражение имеет побочные эффекты, например:

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

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