Qual è il tipo corretto da utilizzare per dichiarare un metavariable che forse potrebbe corrispondere sia variabili o membri di una struttura?
-
20-09-2019 - |
Domanda
Qual è il tipo corretto da utilizzare per dichiarare un metavariable che forse potrebbe corrispondere sia variabili o membri in una struttura?
Prendete per esempio il seguente codice sorgente di esempio:
#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");
}
Con la seguente semantica di patch :
@@
identifier ptr;
//idexpression ptr;
//expression ptr;
expression E;
@@
ptr = malloc(E);
+if (ptr == NULL)
+ return;
l'assegnazione ptr->s
non corrisponde a meno che non viene utilizzato expression ptr
. Per utilizzare expression
per questo sembra un po 'troppo ampia per me. È questo corretto e l'unico modo per farlo?
Soluzione
In generale, si vuole prendere qualsiasi puntatore lvalue - ma dal momento che si sta solo corrispondenti luoghi in cui l'espressione è assegnato un valore da malloc
, un'espressione semplice farà il buon lavoro (dal momento che un non-puntatore o non-lvalue dovrebbe rendere il compilatore lamentarsi).
Il problema si sta andando ad avere è se l'espressione ha effetti secondari, come ad esempio:
struct some_struct *a[10];
int i = 0;
a[i++] = malloc(sizeof(struct some_struct));