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

StackOverflow https://stackoverflow.com/questions/2043787

  •  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));
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top