Fix possible crash when parsing layout qualifiers nodes.

Task-number: QTCREATORBUG-4563
Reviewed-by: Leandro Melo <leandro.melo@nokia.com>
This commit is contained in:
Roberto Raggi
2011-04-18 11:00:23 +02:00
parent 42732605a4
commit c6653f43b7
9 changed files with 364 additions and 348 deletions

View File

@@ -290,11 +290,11 @@ public:
List<ExpressionAST *> *arguments; List<ExpressionAST *> *arguments;
} function; } function;
int qualifier; int qualifier;
LayoutQualifier *layout; LayoutQualifierAST *layout;
List<LayoutQualifier *> *layout_list; List<LayoutQualifierAST *> *layout_list;
struct { struct {
int qualifier; int qualifier;
List<LayoutQualifier *> *layout_list; List<LayoutQualifierAST *> *layout_list;
} type_qualifier; } type_qualifier;
struct { struct {
TypeAST *type; TypeAST *type;
@@ -1394,7 +1394,7 @@ case $rule_number: {
ast(1) = makeAstNode<ParameterDeclarationAST> ast(1) = makeAstNode<ParameterDeclarationAST>
(makeAstNode<QualifiedTypeAST> (makeAstNode<QualifiedTypeAST>
(sym(1).qualifier, sym(3).param_declarator.type, (sym(1).qualifier, sym(3).param_declarator.type,
(List<LayoutQualifier *> *)0), (List<LayoutQualifierAST *> *)0),
ParameterDeclarationAST::Qualifier(sym(2).qualifier), ParameterDeclarationAST::Qualifier(sym(2).qualifier),
sym(3).param_declarator.name); sym(3).param_declarator.name);
} break; } break;
@@ -1415,7 +1415,7 @@ parameter_declaration ::= parameter_type_qualifier parameter_qualifier parameter
case $rule_number: { case $rule_number: {
ast(1) = makeAstNode<ParameterDeclarationAST> ast(1) = makeAstNode<ParameterDeclarationAST>
(makeAstNode<QualifiedTypeAST> (makeAstNode<QualifiedTypeAST>
(sym(1).qualifier, type(3), (List<LayoutQualifier *> *)0), (sym(1).qualifier, type(3), (List<LayoutQualifierAST *> *)0),
ParameterDeclarationAST::Qualifier(sym(2).qualifier), ParameterDeclarationAST::Qualifier(sym(2).qualifier),
(const QString *)0); (const QString *)0);
} break; } break;
@@ -1605,7 +1605,7 @@ case $rule_number: {
fully_specified_type ::= type_specifier ; fully_specified_type ::= type_specifier ;
/. /.
case $rule_number: { case $rule_number: {
ast(1) = makeAstNode<QualifiedTypeAST>(0, type(1), (List<LayoutQualifier *> *)0); ast(1) = makeAstNode<QualifiedTypeAST>(0, type(1), (List<LayoutQualifierAST *> *)0);
} break; } break;
./ ./
@@ -1656,28 +1656,28 @@ case $rule_number: {
layout_qualifier_id_list ::= layout_qualifier_id ; layout_qualifier_id_list ::= layout_qualifier_id ;
/. /.
case $rule_number: { case $rule_number: {
sym(1).layout_list = makeAstNode< List<LayoutQualifier *> >(sym(1).layout); sym(1).layout_list = makeAstNode< List<LayoutQualifierAST *> >(sym(1).layout);
} break; } break;
./ ./
layout_qualifier_id_list ::= layout_qualifier_id_list COMMA layout_qualifier_id ; layout_qualifier_id_list ::= layout_qualifier_id_list COMMA layout_qualifier_id ;
/. /.
case $rule_number: { case $rule_number: {
sym(1).layout_list = makeAstNode< List<LayoutQualifier *> >(sym(1).layout_list, sym(3).layout); sym(1).layout_list = makeAstNode< List<LayoutQualifierAST *> >(sym(1).layout_list, sym(3).layout);
} break; } break;
./ ./
layout_qualifier_id ::= IDENTIFIER ; layout_qualifier_id ::= IDENTIFIER ;
/. /.
case $rule_number: { case $rule_number: {
sym(1).layout = makeAstNode<LayoutQualifier>(string(1), (const QString *)0); sym(1).layout = makeAstNode<LayoutQualifierAST>(string(1), (const QString *)0);
} break; } break;
./ ./
layout_qualifier_id ::= IDENTIFIER EQUAL NUMBER ; layout_qualifier_id ::= IDENTIFIER EQUAL NUMBER ;
/. /.
case $rule_number: { case $rule_number: {
sym(1).layout = makeAstNode<LayoutQualifier>(string(1), string(3)); sym(1).layout = makeAstNode<LayoutQualifierAST>(string(1), string(3));
} break; } break;
./ ./

View File

@@ -354,6 +354,13 @@ List<StructTypeAST::Field *> *StructTypeAST::fixInnerTypes(TypeAST *innerType, L
return fields; return fields;
} }
void LayoutQualifierAST::accept0(Visitor *visitor)
{
if (visitor->visit(this)) {
}
visitor->endVisit(this);
}
void QualifiedTypeAST::accept0(Visitor *visitor) void QualifiedTypeAST::accept0(Visitor *visitor)
{ {
if (visitor->visit(this)) if (visitor->visit(this))

View File

@@ -69,6 +69,7 @@ class BasicTypeAST;
class NamedTypeAST; class NamedTypeAST;
class ArrayTypeAST; class ArrayTypeAST;
class StructTypeAST; class StructTypeAST;
class LayoutQualifierAST;
class QualifiedTypeAST; class QualifiedTypeAST;
class DeclarationAST; class DeclarationAST;
class PrecisionDeclarationAST; class PrecisionDeclarationAST;
@@ -214,6 +215,7 @@ public:
Kind_StructType, Kind_StructType,
Kind_AnonymousStructType, Kind_AnonymousStructType,
Kind_StructField, Kind_StructField,
Kind_LayoutQualifier,
Kind_QualifiedType, Kind_QualifiedType,
// Declarations // Declarations
@@ -260,6 +262,7 @@ public:
virtual ArrayTypeAST *asArrayType() { return 0; } virtual ArrayTypeAST *asArrayType() { return 0; }
virtual StructTypeAST *asStructType() { return 0; } virtual StructTypeAST *asStructType() { return 0; }
virtual QualifiedTypeAST *asQualifiedType() { return 0; } virtual QualifiedTypeAST *asQualifiedType() { return 0; }
virtual LayoutQualifierAST *asLayoutQualifier() { return 0; }
virtual DeclarationAST *asDeclaration() { return 0; } virtual DeclarationAST *asDeclaration() { return 0; }
virtual PrecisionDeclarationAST *asPrecisionDeclaration() { return 0; } virtual PrecisionDeclarationAST *asPrecisionDeclaration() { return 0; }
@@ -785,22 +788,24 @@ public: // attributes
List<Field *> *fields; List<Field *> *fields;
}; };
class GLSL_EXPORT LayoutQualifier class GLSL_EXPORT LayoutQualifierAST: public AST
{ {
public: public:
LayoutQualifier(const QString *_name, const QString *_number) LayoutQualifierAST(const QString *_name, const QString *_number)
: name(_name), number(_number), lineno(0) {} : AST(Kind_LayoutQualifier), name(_name), number(_number) {}
virtual LayoutQualifierAST *asLayoutQualifier() { return this; }
virtual void accept0(Visitor *visitor);
public: // attributes public: // attributes
const QString *name; const QString *name;
const QString *number; const QString *number;
int lineno;
}; };
class GLSL_EXPORT QualifiedTypeAST: public TypeAST class GLSL_EXPORT QualifiedTypeAST: public TypeAST
{ {
public: public:
QualifiedTypeAST(int _qualifiers, TypeAST *_type, List<LayoutQualifier *> *_layout_list) QualifiedTypeAST(int _qualifiers, TypeAST *_type, List<LayoutQualifierAST *> *_layout_list)
: TypeAST(Kind_QualifiedType), qualifiers(_qualifiers), type(_type) : TypeAST(Kind_QualifiedType), qualifiers(_qualifiers), type(_type)
, layout_list(finish(_layout_list)) {} , layout_list(finish(_layout_list)) {}
@@ -840,7 +845,7 @@ public:
public: // attributes public: // attributes
int qualifiers; int qualifiers;
TypeAST *type; TypeAST *type;
List<LayoutQualifier *> *layout_list; List<LayoutQualifierAST *> *layout_list;
}; };
class GLSL_EXPORT DeclarationAST: public AST class GLSL_EXPORT DeclarationAST: public AST

View File

@@ -129,6 +129,9 @@ public:
virtual bool visit(StructTypeAST::Field *) { return true; } virtual bool visit(StructTypeAST::Field *) { return true; }
virtual void endVisit(StructTypeAST::Field *) {} virtual void endVisit(StructTypeAST::Field *) {}
virtual bool visit(LayoutQualifierAST *) { return true; }
virtual void endVisit(LayoutQualifierAST *) {}
virtual bool visit(QualifiedTypeAST *) { return true; } virtual bool visit(QualifiedTypeAST *) { return true; }
virtual void endVisit(QualifiedTypeAST *) {} virtual void endVisit(QualifiedTypeAST *) {}

File diff suppressed because it is too large Load Diff

View File

@@ -1,5 +1,5 @@
#line 218 "./glsl.g" #line 217 "./glsl.g"
/************************************************************************** /**************************************************************************
** **
@@ -76,11 +76,11 @@ public:
List<ExpressionAST *> *arguments; List<ExpressionAST *> *arguments;
} function; } function;
int qualifier; int qualifier;
LayoutQualifier *layout; LayoutQualifierAST *layout;
List<LayoutQualifier *> *layout_list; List<LayoutQualifierAST *> *layout_list;
struct { struct {
int qualifier; int qualifier;
List<LayoutQualifier *> *layout_list; List<LayoutQualifierAST *> *layout_list;
} type_qualifier; } type_qualifier;
struct { struct {
TypeAST *type; TypeAST *type;

View File

@@ -6,6 +6,7 @@
** **
** Contact: Nokia Corporation (info@qt.nokia.com) ** Contact: Nokia Corporation (info@qt.nokia.com)
** **
**
** GNU Lesser General Public License Usage ** GNU Lesser General Public License Usage
** **
** This file may be used under the terms of the GNU Lesser General Public ** This file may be used under the terms of the GNU Lesser General Public
@@ -29,7 +30,6 @@
** **
**************************************************************************/ **************************************************************************/
// This file was generated by qlalr - DO NOT EDIT! // This file was generated by qlalr - DO NOT EDIT!
#include "glslparsertable_p.h" #include "glslparsertable_p.h"

View File

@@ -6,6 +6,7 @@
** **
** Contact: Nokia Corporation (info@qt.nokia.com) ** Contact: Nokia Corporation (info@qt.nokia.com)
** **
**
** GNU Lesser General Public License Usage ** GNU Lesser General Public License Usage
** **
** This file may be used under the terms of the GNU Lesser General Public ** This file may be used under the terms of the GNU Lesser General Public

View File

@@ -786,8 +786,8 @@ bool Semantic::visit(StructTypeAST *ast)
bool Semantic::visit(QualifiedTypeAST *ast) bool Semantic::visit(QualifiedTypeAST *ast)
{ {
_type = type(ast->type); _type = type(ast->type);
for (List<LayoutQualifier *> *it = ast->layout_list; it; it = it->next) { for (List<LayoutQualifierAST *> *it = ast->layout_list; it; it = it->next) {
LayoutQualifier *q = it->value; LayoutQualifierAST *q = it->value;
// q->name; // q->name;
// q->number; // q->number;
Q_UNUSED(q); Q_UNUSED(q);