Каков правильный тип для объявления метаваризации, который, возможно, может соответствовать либо переменным, либо членам в структуре?
-
20-09-2019 - |
Вопрос
Каков правильный тип для объявления метаваризации, который, возможно, может соответствовать либо переменным, либо членам в структуре?
Возьмите, к примеру, следующий пример исходный код:
#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
Потому что это кажется мне слишком широко. Это правильно и единственный способ сделать это?
Решение
В общем, вы хотите поймать какой -либо указатель LVALU malloc
, Простая выражение сделает все возможное (поскольку не указание или не-LVALUE должно заставить компилятора жаловаться).
Проблема, которую у вас будет, заключается в том, что выражение имеет побочные эффекты, например:
struct some_struct *a[10];
int i = 0;
a[i++] = malloc(sizeof(struct some_struct));
Не связан с StackOverflow