Add check that regular and unicode string literals are well formatted

This commit is contained in:
Alex Beregszaszi
2020-07-27 18:21:17 +01:00
parent 6fe8e63eee
commit 6eb60bc8cd
9 changed files with 39 additions and 7 deletions
+19 -5
View File
@@ -509,7 +509,7 @@ void Scanner::scanToken()
{
case '"':
case '\'':
token = scanString();
token = scanString(false);
break;
case '<':
// < <= << <<=
@@ -684,6 +684,18 @@ void Scanner::scanToken()
else
token = setError(ScannerError::IllegalToken);
}
else if (token == Token::Unicode)
{
// reset
m = 0;
n = 0;
// Special quoted hex string must follow
if (m_char == '"' || m_char == '\'')
token = scanString(true);
else
token = setError(ScannerError::IllegalToken);
}
}
else if (isDecimalDigit(m_char))
token = scanNumber();
@@ -775,7 +787,7 @@ bool Scanner::isUnicodeLinebreak()
return false;
}
Token Scanner::scanString()
Token Scanner::scanString(bool const _isUnicode)
{
char const quote = m_char;
advance(); // consume quote
@@ -791,11 +803,13 @@ Token Scanner::scanString()
}
else
{
// Report error on non-printable characters in string literals.
// Report error on non-printable characters in string literals, however
// allow anything for unicode string literals, because their validity will
// be verified later (in the syntax checker).
//
// We are using a manual range and not isprint() to avoid
// any potential complications with locale.
if (static_cast<unsigned>(c) <= 0x1f || static_cast<unsigned>(c) >= 0x7f)
if (!_isUnicode && (static_cast<unsigned>(c) <= 0x1f || static_cast<unsigned>(c) >= 0x7f))
return setError(ScannerError::IllegalCharacterInString);
addLiteralChar(c);
}
@@ -804,7 +818,7 @@ Token Scanner::scanString()
return setError(ScannerError::IllegalStringEndQuote);
literal.complete();
advance(); // consume quote
return Token::StringLiteral;
return _isUnicode ? Token::UnicodeStringLiteral : Token::StringLiteral;
}
Token Scanner::scanHexString()
+1 -1
View File
@@ -229,7 +229,7 @@ private:
Token scanNumber(char _charSeen = 0);
std::tuple<Token, unsigned, unsigned> scanIdentifierOrKeyword();
Token scanString();
Token scanString(bool const _isUnicode);
Token scanHexString();
/// Scans a single line comment and returns its corrected end position.
size_t scanSingleLineDocComment();
+2
View File
@@ -190,6 +190,7 @@ namespace solidity::langutil
K(Throw, "throw", 0) \
K(Try, "try", 0) \
K(Type, "type", 0) \
K(Unicode, "unicode", 0) \
K(Using, "using", 0) \
K(View, "view", 0) \
K(Virtual, "virtual", 0) \
@@ -227,6 +228,7 @@ namespace solidity::langutil
K(FalseLiteral, "false", 0) \
T(Number, nullptr, 0) \
T(StringLiteral, nullptr, 0) \
T(UnicodeStringLiteral, nullptr, 0) \
T(HexStringLiteral, nullptr, 0) \
T(CommentLiteral, nullptr, 0) \
\