Merge pull request #4748 from ethereum/validate-identifier

Assert that type identifier contains only valid characters
This commit is contained in:
chriseth 2018-08-08 12:50:45 +02:00 committed by GitHub
commit d0863f4994
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 13 additions and 2 deletions

View File

@ -108,7 +108,7 @@ Grammar::
'break' | 'continue' 'break' | 'continue'
FunctionCall = FunctionCall =
Identifier '(' ( Expression ( ',' Expression )* )? ')' Identifier '(' ( Expression ( ',' Expression )* )? ')'
Identifier = [a-zA-Z_$] [a-zA-Z_0-9]* Identifier = [a-zA-Z_$] [a-zA-Z_$0-9]*
IdentifierList = Identifier ( ',' Identifier)* IdentifierList = Identifier ( ',' Identifier)*
TypeName = Identifier | BuiltinTypeName TypeName = Identifier | BuiltinTypeName
BuiltinTypeName = 'bool' | [us] ( '8' | '32' | '64' | '128' | '256' ) BuiltinTypeName = 'bool' | [us] ( '8' | '32' | '64' | '128' | '256' )

View File

@ -254,6 +254,17 @@ string Type::escapeIdentifier(string const& _identifier)
return ret; return ret;
} }
string Type::identifier() const
{
string ret = escapeIdentifier(richIdentifier());
solAssert(ret.find_first_of("0123456789") != 0, "Identifier cannot start with a number.");
solAssert(
ret.find_first_not_of("0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMONPQRSTUVWXYZ_$") == string::npos,
"Identifier contains invalid characters."
);
return ret;
}
TypePointer Type::fromElementaryTypeName(ElementaryTypeNameToken const& _type) TypePointer Type::fromElementaryTypeName(ElementaryTypeNameToken const& _type)
{ {
solAssert(Token::isElementaryTypeName(_type.token()), solAssert(Token::isElementaryTypeName(_type.token()),

View File

@ -172,7 +172,7 @@ public:
/// only if they have the same identifier. /// only if they have the same identifier.
/// The identifier should start with "t_". /// The identifier should start with "t_".
/// Will not contain any character which would be invalid as an identifier. /// Will not contain any character which would be invalid as an identifier.
std::string identifier() const { return escapeIdentifier(richIdentifier()); } std::string identifier() const;
/// More complex identifier strings use "parentheses", where $_ is interpreted as as /// More complex identifier strings use "parentheses", where $_ is interpreted as as
/// "opening parenthesis", _$ as "closing parenthesis", _$_ as "comma" and any $ that /// "opening parenthesis", _$ as "closing parenthesis", _$_ as "comma" and any $ that