From 941b006002df94fa41d413d01cc55f15a8ecbd31 Mon Sep 17 00:00:00 2001 From: Nick Bowler Date: Wed, 6 Jul 2011 22:31:48 -0400 Subject: [PATCH] Validate function return types. --- src/parse-decl.c | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/src/parse-decl.c b/src/parse-decl.c index dd4bd19..059f5f7 100644 --- a/src/parse-decl.c +++ b/src/parse-decl.c @@ -275,6 +275,10 @@ reduce_parentheses(struct cdecl_declarator **p, struct cdecl_declarator *d) return 0; } +/* + * Function parameters and return types have a few restrictions that are + * really easy to check in comparison to the above absurdity. + */ static int check_parameters(struct cdecl_declarator **p, struct cdecl_declarator *d) { @@ -307,6 +311,28 @@ check_parameters(struct cdecl_declarator **p, struct cdecl_declarator *d) return 0; } +/* + * Functions cannot return arrays or functions. Since the parse tree is + * "inside-out", we need to look for functions as the child declarator. + */ +static int +check_rettypes(struct cdecl_declarator **p, struct cdecl_declarator *d) +{ + if (!d->child || d->child->type != CDECL_DECL_FUNCTION) + return 0; + + switch (d->type) { + case CDECL_DECL_FUNCTION: + fprintf(stderr, "functions cannot return functions\n"); + return -1; + case CDECL_DECL_ARRAY: + fprintf(stderr, "functions cannot return arrays\n"); + return -1; + } + + return 0; +} + /* * Traverse the parse tree, calling a function on every declarator in a * depth-first preorder traversal. The function is given a pointer to the @@ -364,6 +390,8 @@ struct cdecl *cdecl_parse_decl(const char *declstr) goto err; if (!forall_declarators(i, check_parameters)) goto err; + if (!forall_declarators(i, check_rettypes)) + goto err; if (!valid_declspecs(i, true)) goto err; -- 2.43.2