From 6b5ee6ccc047387441f556a8d512b8e75ae14ce9 Mon Sep 17 00:00:00 2001 From: Matt Pharr Date: Thu, 7 Jul 2011 11:10:27 +0100 Subject: [PATCH] Add missing "$$=NULL;" in error production in parser. This fixes a crash from a malformed program bug. --- expr.cpp | 4 ++-- parse.yy | 1 + stmt.cpp | 11 +++++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/expr.cpp b/expr.cpp index 45b847ad..0ce3fc16 100644 --- a/expr.cpp +++ b/expr.cpp @@ -1899,8 +1899,8 @@ static void lPrintPassedTypes(const char *funName, const std::vector &argExprs) { fprintf(stderr, "Passed types:\n\t%s(", funName); for (unsigned int i = 0; i < argExprs.size(); ++i) { - const Type *t = argExprs[i]->GetType(); - if (t) + const Type *t; + if (argExprs[i] != NULL && (t = argExprs[i]->GetType()) != NULL) fprintf(stderr, "%s%s", t->GetString().c_str(), (i < argExprs.size()-1) ? ", " : ")\n\n"); else diff --git a/parse.yy b/parse.yy index 06761dba..24b79f35 100644 --- a/parse.yy +++ b/parse.yy @@ -927,6 +927,7 @@ statement std::vector alternates = MatchStrings(yytext, builtinTokens); std::string alts = lGetAlternates(alternates); Error(@1, "Syntax error--token \"%s\" unknown.%s", yytext, alts.c_str()); + $$ = NULL; } ; diff --git a/stmt.cpp b/stmt.cpp index 5110ca96..07602fde 100644 --- a/stmt.cpp +++ b/stmt.cpp @@ -239,6 +239,7 @@ DeclStmt::EmitCode(FunctionEmitContext *ctx) const { continue; Symbol *sym = decl->sym; + assert(decl->sym != NULL); const Type *type = sym->type; if (!type) continue; @@ -280,6 +281,7 @@ DeclStmt::EmitCode(FunctionEmitContext *ctx) const { } const llvm::Type *llvmType = type->LLVMType(g->ctx); + assert(llvmType != NULL); if (declaration->declSpecs->storageClass == SC_STATIC) { // For static variables, we need a compile-time constant value @@ -353,11 +355,16 @@ DeclStmt::Optimize() { Stmt * DeclStmt::TypeCheck() { + bool encounteredError = false; for (unsigned int i = 0; i < declaration->declarators.size(); ++i) { Declarator *decl = declaration->declarators[i]; - if (!decl || !decl->initExpr) + if (!decl) { + encounteredError = true; continue; + } + if (!decl->initExpr) + continue; decl->initExpr = decl->initExpr->TypeCheck(); if (!decl->initExpr) continue; @@ -374,7 +381,7 @@ DeclStmt::TypeCheck() { decl->initExpr = decl->initExpr->TypeConv(type, "initializer"); } } - return this; + return encounteredError ? NULL : this; }