2010-01-11 1 views
0

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

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

#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

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

Проблема вы будете иметь, если выражение имеет побочные эффекты,, например:

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

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

На самом деле просто «[я]» является выражением, а также, и я определенно хочу, чтобы поддержать это. См. Также http://lists.diku.dk/pipermail/cocci/2010-January/000628.html – hlovdal

Смежные вопросы