Bug fixes to avoid NULL pointer derefs with malformed programs.
This commit is contained in:
41
decl.cpp
41
decl.cpp
@@ -171,6 +171,11 @@ Declarator::Declarator(DeclaratorKind dk, SourcePos p)
|
|||||||
void
|
void
|
||||||
Declarator::InitFromDeclSpecs(DeclSpecs *ds) {
|
Declarator::InitFromDeclSpecs(DeclSpecs *ds) {
|
||||||
const Type *t = GetType(ds);
|
const Type *t = GetType(ds);
|
||||||
|
if (t == NULL) {
|
||||||
|
Assert(m->errorCount > 0);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
Symbol *sym = GetSymbol();
|
Symbol *sym = GetSymbol();
|
||||||
if (sym != NULL) {
|
if (sym != NULL) {
|
||||||
sym->type = t;
|
sym->type = t;
|
||||||
@@ -248,8 +253,10 @@ Declarator::GetFunctionInfo(DeclSpecs *ds, std::vector<Symbol *> *funArgs) {
|
|||||||
// already have been added to the symbol table by AddGlobal() by the
|
// already have been added to the symbol table by AddGlobal() by the
|
||||||
// time we get here.)
|
// time we get here.)
|
||||||
Symbol *funSym = m->symbolTable->LookupFunction(declSym->name.c_str(), type);
|
Symbol *funSym = m->symbolTable->LookupFunction(declSym->name.c_str(), type);
|
||||||
if (funSym != NULL)
|
if (funSym == NULL)
|
||||||
// May be NULL due to error earlier in compilation
|
// May be NULL due to error earlier in compilation
|
||||||
|
Assert(m->errorCount > 0);
|
||||||
|
else
|
||||||
funSym->pos = pos;
|
funSym->pos = pos;
|
||||||
|
|
||||||
// Walk down to the declarator for the function. (We have to get past
|
// Walk down to the declarator for the function. (We have to get past
|
||||||
@@ -262,7 +269,13 @@ Declarator::GetFunctionInfo(DeclSpecs *ds, std::vector<Symbol *> *funArgs) {
|
|||||||
|
|
||||||
for (unsigned int i = 0; i < d->functionParams.size(); ++i) {
|
for (unsigned int i = 0; i < d->functionParams.size(); ++i) {
|
||||||
Symbol *sym = d->GetSymbolForFunctionParameter(i);
|
Symbol *sym = d->GetSymbolForFunctionParameter(i);
|
||||||
sym->type = sym->type->ResolveUnboundVariability(Type::Varying);
|
if (sym->type == NULL) {
|
||||||
|
Assert(m->errorCount > 0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
sym->type = sym->type->ResolveUnboundVariability(Type::Varying);
|
||||||
|
|
||||||
funArgs->push_back(sym);
|
funArgs->push_back(sym);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -379,8 +392,12 @@ Declarator::GetType(const Type *base, DeclSpecs *ds) const {
|
|||||||
// report this differently than it was originally declared
|
// report this differently than it was originally declared
|
||||||
// in the function, but it's not clear that this is a
|
// in the function, but it's not clear that this is a
|
||||||
// significant problem.)
|
// significant problem.)
|
||||||
sym->type = PointerType::GetUniform(at->GetElementType());
|
if (at->GetElementType() == NULL) {
|
||||||
|
Assert(m->errorCount > 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
sym->type = PointerType::GetUniform(at->GetElementType());
|
||||||
// Make sure there are no unsized arrays (other than the
|
// Make sure there are no unsized arrays (other than the
|
||||||
// first dimension) in function parameter lists.
|
// first dimension) in function parameter lists.
|
||||||
at = dynamic_cast<const ArrayType *>(at->GetElementType());
|
at = dynamic_cast<const ArrayType *>(at->GetElementType());
|
||||||
@@ -547,11 +564,18 @@ Declaration::GetVariableDeclarations() const {
|
|||||||
|
|
||||||
for (unsigned int i = 0; i < declarators.size(); ++i) {
|
for (unsigned int i = 0; i < declarators.size(); ++i) {
|
||||||
Declarator *decl = declarators[i];
|
Declarator *decl = declarators[i];
|
||||||
if (decl == NULL)
|
if (decl == NULL) {
|
||||||
// Ignore earlier errors
|
// Ignore earlier errors
|
||||||
|
Assert(m->errorCount > 0);
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
Symbol *sym = decl->GetSymbol();
|
Symbol *sym = decl->GetSymbol();
|
||||||
|
if (sym == NULL || sym->type == NULL) {
|
||||||
|
// Ignore errors
|
||||||
|
Assert(m->errorCount > 0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
sym->type = sym->type->ResolveUnboundVariability(Type::Varying);
|
sym->type = sym->type->ResolveUnboundVariability(Type::Varying);
|
||||||
|
|
||||||
if (sym->type == AtomicType::Void)
|
if (sym->type == AtomicType::Void)
|
||||||
@@ -571,11 +595,18 @@ Declaration::DeclareFunctions() {
|
|||||||
|
|
||||||
for (unsigned int i = 0; i < declarators.size(); ++i) {
|
for (unsigned int i = 0; i < declarators.size(); ++i) {
|
||||||
Declarator *decl = declarators[i];
|
Declarator *decl = declarators[i];
|
||||||
if (decl == NULL)
|
if (decl == NULL) {
|
||||||
// Ignore earlier errors
|
// Ignore earlier errors
|
||||||
|
Assert(m->errorCount > 0);
|
||||||
continue;
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
Symbol *sym = decl->GetSymbol();
|
Symbol *sym = decl->GetSymbol();
|
||||||
|
if (sym == NULL || sym->type == NULL) {
|
||||||
|
// Ignore errors
|
||||||
|
Assert(m->errorCount > 0);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
sym->type = sym->type->ResolveUnboundVariability(Type::Varying);
|
sym->type = sym->type->ResolveUnboundVariability(Type::Varying);
|
||||||
|
|
||||||
if (dynamic_cast<const FunctionType *>(sym->type) == NULL)
|
if (dynamic_cast<const FunctionType *>(sym->type) == NULL)
|
||||||
|
|||||||
5
expr.cpp
5
expr.cpp
@@ -2584,6 +2584,11 @@ AssignExpr::TypeCheck() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const Type *lhsType = lvalue->GetType();
|
const Type *lhsType = lvalue->GetType();
|
||||||
|
if (lhsType == NULL) {
|
||||||
|
Assert(m->errorCount > 0);
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
if (lhsType->IsConstType()) {
|
if (lhsType->IsConstType()) {
|
||||||
Error(lvalue->pos, "Can't assign to type \"%s\" on left-hand side of "
|
Error(lvalue->pos, "Can't assign to type \"%s\" on left-hand side of "
|
||||||
"expression.", lhsType->GetString().c_str());
|
"expression.", lhsType->GetString().c_str());
|
||||||
|
|||||||
31
parse.yy
31
parse.yy
@@ -521,9 +521,16 @@ constant_expression
|
|||||||
declaration_statement
|
declaration_statement
|
||||||
: declaration
|
: declaration
|
||||||
{
|
{
|
||||||
if ($1->declSpecs->storageClass == SC_TYPEDEF) {
|
if ($1 == NULL) {
|
||||||
|
Assert(m->errorCount > 0);
|
||||||
|
$$ = NULL;
|
||||||
|
}
|
||||||
|
else if ($1->declSpecs->storageClass == SC_TYPEDEF) {
|
||||||
for (unsigned int i = 0; i < $1->declarators.size(); ++i) {
|
for (unsigned int i = 0; i < $1->declarators.size(); ++i) {
|
||||||
m->AddTypeDef($1->declarators[i]->GetSymbol());
|
if ($1->declarators[i] == NULL)
|
||||||
|
Assert(m->errorCount > 0);
|
||||||
|
else
|
||||||
|
m->AddTypeDef($1->declarators[i]->GetSymbol());
|
||||||
}
|
}
|
||||||
$$ = NULL;
|
$$ = NULL;
|
||||||
}
|
}
|
||||||
@@ -658,7 +665,6 @@ type_specifier
|
|||||||
: atomic_var_type_specifier { $$ = $1; }
|
: atomic_var_type_specifier { $$ = $1; }
|
||||||
| TOKEN_TYPE_NAME
|
| TOKEN_TYPE_NAME
|
||||||
{ const Type *t = m->symbolTable->LookupType(yytext);
|
{ const Type *t = m->symbolTable->LookupType(yytext);
|
||||||
Assert(t != NULL);
|
|
||||||
$$ = t;
|
$$ = t;
|
||||||
}
|
}
|
||||||
| struct_or_union_specifier { $$ = $1; }
|
| struct_or_union_specifier { $$ = $1; }
|
||||||
@@ -1618,7 +1624,10 @@ lAddDeclaration(DeclSpecs *ds, Declarator *decl) {
|
|||||||
m->AddFunctionDeclaration(sym, isInline);
|
m->AddFunctionDeclaration(sym, isInline);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
sym->type = sym->type->ResolveUnboundVariability(Type::Varying);
|
if (sym->type == NULL)
|
||||||
|
Assert(m->errorCount > 0);
|
||||||
|
else
|
||||||
|
sym->type = sym->type->ResolveUnboundVariability(Type::Varying);
|
||||||
bool isConst = (ds->typeQualifiers & TYPEQUAL_CONST) != 0;
|
bool isConst = (ds->typeQualifiers & TYPEQUAL_CONST) != 0;
|
||||||
m->AddGlobalVariable(sym, decl->initExpr, isConst);
|
m->AddGlobalVariable(sym, decl->initExpr, isConst);
|
||||||
}
|
}
|
||||||
@@ -1647,14 +1656,18 @@ lAddFunctionParams(Declarator *decl) {
|
|||||||
continue;
|
continue;
|
||||||
Assert(pdecl->declarators.size() == 1);
|
Assert(pdecl->declarators.size() == 1);
|
||||||
Symbol *sym = pdecl->declarators[0]->GetSymbol();
|
Symbol *sym = pdecl->declarators[0]->GetSymbol();
|
||||||
sym->type = sym->type->ResolveUnboundVariability(Type::Varying);
|
if (sym == NULL || sym->type == NULL)
|
||||||
#ifndef NDEBUG
|
|
||||||
bool ok = m->symbolTable->AddVariable(sym);
|
|
||||||
if (ok == false)
|
|
||||||
Assert(m->errorCount > 0);
|
Assert(m->errorCount > 0);
|
||||||
|
else {
|
||||||
|
sym->type = sym->type->ResolveUnboundVariability(Type::Varying);
|
||||||
|
#ifndef NDEBUG
|
||||||
|
bool ok = m->symbolTable->AddVariable(sym);
|
||||||
|
if (ok == false)
|
||||||
|
Assert(m->errorCount > 0);
|
||||||
#else
|
#else
|
||||||
m->symbolTable->AddVariable(sym);
|
m->symbolTable->AddVariable(sym);
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// The corresponding pop scope happens in function_definition rules
|
// The corresponding pop scope happens in function_definition rules
|
||||||
|
|||||||
Reference in New Issue
Block a user