Was ist der richtige Typ, um eine Metavariable zu deklarieren, die möglicherweise entweder Variablen oder Mitgliedern in einer Struktur übereinstimmen könnte?
-
20-09-2019 - |
Frage
Was ist der richtige Typ, um eine Metavariable zu deklarieren, die möglicherweise entweder Variablen oder Mitgliedern in einer Struktur übereinstimmen könnte?
Nehmen Sie zum Beispiel den folgenden Beispiel -Quellcode:
#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");
}
Mit den folgenden Semantischer Patch:
@@
identifier ptr;
//idexpression ptr;
//expression ptr;
expression E;
@@
ptr = malloc(E);
+if (ptr == NULL)
+ return;
das ptr->s
Die Zuteilung wird nicht übereinstimmen, es sei denn expression ptr
wird genutzt. Benutzen expression
Denn dies scheint mir ein bisschen zu weitgehend zu sein. Ist das richtig und der einzige Weg, dies zu tun?
Lösung
Im Allgemeinen möchten Sie einen lvalue -Zeiger fangen - aber da Sie nur an Orte übereinstimmen, an denen der Ausdruck ein Wert zugewiesen wird malloc
, Ein einfacher Ausdruck erledigt die Arbeit gut (da ein Nicht-Zeiger oder ein Nicht-LValue den Compiler beschweren sollte).
Das Problem, das Sie haben werden, ist, ob der Ausdruck Nebenwirkungen hat, z. B.:
struct some_struct *a[10];
int i = 0;
a[i++] = malloc(sizeof(struct some_struct));