]> git.ozlabs.org Git - ccan/blobdiff - ccan/cdump/cdump.c
cdump: fix uninitialized warning with optimization
[ccan] / ccan / cdump / cdump.c
index fb942594e0578f15ec9b37d4a60071296f9507ed..7e42dbd74dc6d328186680598a6b364b2c957bb9 100644 (file)
@@ -213,7 +213,7 @@ static struct cdump_type *get_type(struct cdump_definitions *defs,
                                   enum cdump_type_kind kind,
                                   const char *name)
 {
-       struct cdump_map *m;
+       cdump_map_t *m = (void *)0x1L; /* Shouldn't be used */
        struct cdump_type *t;
 
        switch (kind) {
@@ -390,6 +390,28 @@ static bool tok_maybe_take_cdump_note(const tal_t *ctx,
        return true;
 }
 
+/* __attribute__((...)) */
+static bool tok_ignore_attribute(struct parse_state *ps)
+{
+       if (!tok_take_if(&ps->toks, "__attribute__"))
+               return true;
+
+       if (!tok_take_if(&ps->toks, "(") || !tok_take_if(&ps->toks, "(")) {
+               complain(ps, "Expected (( after __attribute__");
+               return false;
+       }
+
+       if (!tok_take_expr(ps, ")")) {
+               complain(ps, "Expected expression after __attribute__((");
+               return false;
+       }
+       if (!tok_take_if(&ps->toks, ")")) {
+               complain(ps, "Expected )) __attribute__((");
+               return false;
+       }
+       return true;
+}
+
 /* struct|union ... */
 static bool tok_take_conglom(struct parse_state *ps,
                             enum cdump_type_kind conglom_kind)
@@ -415,6 +437,9 @@ static bool tok_take_conglom(struct parse_state *ps,
        if (!tok_maybe_take_cdump_note(e, ps, &e->note))
                return false;
 
+       if (!tok_ignore_attribute(ps))
+               return false;
+
        if (!tok_take_if(&ps->toks, "{")) {
                complain(ps, "Expected { for struct/union");
                return false;
@@ -426,6 +451,9 @@ static bool tok_take_conglom(struct parse_state *ps,
                const struct token *quals;
                unsigned int num_quals = 0;
 
+               if (!tok_ignore_attribute(ps))
+                       return false;
+
                /* Anything can have these prepended. */
                quals = ps->toks;
                while (tok_take_if(&ps->toks, "const")
@@ -455,6 +483,9 @@ static bool tok_take_conglom(struct parse_state *ps,
                        while (tok_take_if(&ps->toks, "*"))
                                m->type = ptr_of(ps, m->type);
 
+                       if (!tok_ignore_attribute(ps))
+                               return false;
+
                        m->name = tok_take_ident(e, &ps->toks);
                        if (!m->name) {
                                complain(ps, "Expected name for member");
@@ -471,6 +502,9 @@ static bool tok_take_conglom(struct parse_state *ps,
                        if (!tok_maybe_take_cdump_note(e->u.members,
                                                       ps, &m->note))
                                return false;
+
+                       if (!tok_ignore_attribute(ps))
+                               return false;
                } while (tok_take_if(&ps->toks, ","));
 
                if (!tok_take_if(&ps->toks, ";")) {
@@ -479,10 +513,19 @@ static bool tok_take_conglom(struct parse_state *ps,
                }
        }
 
-       if (tok_take_if(&ps->toks, "}") && tok_take_if(&ps->toks, ";"))
-               return true;
-       complain(ps, "Expected }; at end of struct/union");
-       return false;
+       if (!tok_take_if(&ps->toks, "}")) {
+               complain(ps, "Expected } at end of struct/union");
+               return false;
+       }
+
+       if (!tok_ignore_attribute(ps))
+               return false;
+
+       if (!tok_take_if(&ps->toks, ";")) {
+               complain(ps, "Expected ; at end of struct/union");
+               return false;
+       }
+       return true;
 }
 
 /* enum ... */
@@ -510,6 +553,9 @@ static bool tok_take_enum(struct parse_state *ps)
        if (!tok_maybe_take_cdump_note(e, ps, &e->note))
                return false;
 
+       if (!tok_ignore_attribute(ps))
+               return false;
+
        if (!tok_take_if(&ps->toks, "{")) {
                complain(ps, "Expected { after enum name");
                return false;
@@ -546,16 +592,24 @@ static bool tok_take_enum(struct parse_state *ps)
                        v->value = NULL;
        } while (tok_take_if(&ps->toks, ","));
 
-       if (tok_take_if(&ps->toks, "}") && tok_take_if(&ps->toks, ";"))
-               return true;
+       if (!tok_take_if(&ps->toks, "}")) {
+               complain(ps, "Expected } at end of enum");
+               return false;
+       }
 
-       complain(ps, "Expected }; at end of enum");
-       return false;
+       if (!tok_ignore_attribute(ps))
+               return false;
+
+       if (!tok_take_if(&ps->toks, ";")) {
+               complain(ps, "Expected ; at end of enum");
+               return false;
+       }
+       return true;
 }
 
 static bool gather_undefines(const char *name,
                             struct cdump_type *t,
-                            struct cdump_map *undefs)
+                            cdump_map_t *undefs)
 {
        if (!type_defined(t))
                strmap_add(undefs, name, t);
@@ -564,15 +618,15 @@ static bool gather_undefines(const char *name,
 
 static bool remove_from_map(const char *name,
                            struct cdump_type *t,
-                           struct cdump_map *map)
+                           cdump_map_t *map)
 {
        strmap_del(map, name, NULL);
        return true;
 }
 
-static void remove_undefined(struct cdump_map *map)
+static void remove_undefined(cdump_map_t *map)
 {
-       struct cdump_map undefs;
+       cdump_map_t undefs;
 
        /* We can't delete inside iterator, so gather all the undefs
         * then remove them. */
@@ -608,6 +662,8 @@ struct cdump_definitions *cdump_extract(const tal_t *ctx, const char *code,
 
        toks = ps.toks = tokenize(ps.defs, code);
        while (tok_peek(&ps.toks)) {
+               if (!tok_ignore_attribute(&ps))
+                       goto fail;
                if (tok_take_if(&ps.toks, "struct")) {
                        if (!tok_take_conglom(&ps, CDUMP_STRUCT))
                                goto fail;