Quel est le type correct d'utiliser pour déclarer une metavariable qui pourrait éventuellement correspondre à des variables ou des membres dans un struct?
-
20-09-2019 - |
Question
Quel est le type correct d'utiliser pour déclarer une metavariable qui pourrait éventuellement correspondre à des variables ou des membres dans une struct?
Prenons par exemple le code source exemple suivant:
#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");
}
Avec le Patch sémantique :
@@
identifier ptr;
//idexpression ptr;
//expression ptr;
expression E;
@@
ptr = malloc(E);
+if (ptr == NULL)
+ return;
l'allocation ptr->s
ne correspond pas à moins expression ptr
est utilisé. Pour utiliser expression
pour cela semble un peu trop large pour moi. Est-ce exact et la seule façon de le faire?
La solution
En général, vous voulez attraper tout pointeur lvalue - mais puisque vous êtes correspondant à seulement des endroits où l'expression est attribuée une valeur de malloc
, une expression simple fera le bien de l'emploi (car un non-pointeur ou non lvalue devrait faire le compilateur se plaindre).
Le problème que vous allez avoir est de savoir si l'expression a sideeffects, par exemple:
struct some_struct *a[10];
int i = 0;
a[i++] = malloc(sizeof(struct some_struct));