Was ist der richtige Typ, um eine Metavariable zu deklarieren, die möglicherweise entweder Variablen oder Mitgliedern in einer Struktur übereinstimmen könnte?

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

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

War es hilfreich?

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));
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top