Quel est le type correct d'utiliser pour déclarer une metavariable qui pourrait éventuellement correspondre à des variables ou des membres dans un struct?

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

  •  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?

Était-ce utile?

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));
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top