Added internal check for || and | inside Token::Match patterns.
This commit is contained in:
parent
62d07878d7
commit
719304a8fc
|
@ -77,6 +77,8 @@ void CheckInternal::checkTokenMatchPatterns()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (pattern.find("||") != std::string::npos || pattern.find(" | ") != std::string::npos || pattern[0] == '|' || (pattern[pattern.length() - 1] == '|' && pattern[pattern.length() - 2] == ' '))
|
||||||
|
orInComplexPattern(tok, pattern, funcname);
|
||||||
|
|
||||||
// Check for signs of complex patterns
|
// Check for signs of complex patterns
|
||||||
if (pattern.find_first_of("[|%") != std::string::npos)
|
if (pattern.find_first_of("[|%") != std::string::npos)
|
||||||
|
@ -321,4 +323,10 @@ void CheckInternal::redundantNextPreviousError(const Token* tok, const std::stri
|
||||||
"Call to 'Token::" + func1 + "()' followed by 'Token::" + func2 + "()' can be simplified.");
|
"Call to 'Token::" + func1 + "()' followed by 'Token::" + func2 + "()' can be simplified.");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CheckInternal::orInComplexPattern(const Token* tok, const std::string& pattern, const std::string &funcname)
|
||||||
|
{
|
||||||
|
reportError(tok, Severity::error, "orInComplexPattern",
|
||||||
|
"Token::" + funcname + "() pattern \"" + pattern + "\" contains \"||\" or \"|\". Replace it by \"%oror%\" or \"%or%\".");
|
||||||
|
}
|
||||||
|
|
||||||
#endif // #ifdef CHECK_INTERNAL
|
#endif // #ifdef CHECK_INTERNAL
|
||||||
|
|
|
@ -77,6 +77,7 @@ private:
|
||||||
void missingPercentCharacterError(const Token *tok, const std::string &pattern, const std::string &funcname);
|
void missingPercentCharacterError(const Token *tok, const std::string &pattern, const std::string &funcname);
|
||||||
void unknownPatternError(const Token* tok, const std::string& pattern);
|
void unknownPatternError(const Token* tok, const std::string& pattern);
|
||||||
void redundantNextPreviousError(const Token* tok, const std::string& func1, const std::string& func2);
|
void redundantNextPreviousError(const Token* tok, const std::string& func1, const std::string& func2);
|
||||||
|
void orInComplexPattern(const Token *tok, const std::string &pattern, const std::string &funcname);
|
||||||
|
|
||||||
void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const {
|
void getErrorMessages(ErrorLogger *errorLogger, const Settings *settings) const {
|
||||||
CheckInternal c(0, settings, errorLogger);
|
CheckInternal c(0, settings, errorLogger);
|
||||||
|
@ -86,6 +87,7 @@ private:
|
||||||
c.missingPercentCharacterError(0, "%num", "Match");
|
c.missingPercentCharacterError(0, "%num", "Match");
|
||||||
c.unknownPatternError(0, "%typ");
|
c.unknownPatternError(0, "%typ");
|
||||||
c.redundantNextPreviousError(0, "previous", "next");
|
c.redundantNextPreviousError(0, "previous", "next");
|
||||||
|
c.orInComplexPattern(0, "||", "Match");
|
||||||
}
|
}
|
||||||
|
|
||||||
static std::string myName() {
|
static std::string myName() {
|
||||||
|
|
|
@ -41,6 +41,7 @@ private:
|
||||||
TEST_CASE(redundantNextPrevious)
|
TEST_CASE(redundantNextPrevious)
|
||||||
TEST_CASE(internalError)
|
TEST_CASE(internalError)
|
||||||
TEST_CASE(invalidMultiCompare);
|
TEST_CASE(invalidMultiCompare);
|
||||||
|
TEST_CASE(orInComplexPattern);
|
||||||
}
|
}
|
||||||
|
|
||||||
void check(const char code[]) {
|
void check(const char code[]) {
|
||||||
|
@ -342,6 +343,38 @@ private:
|
||||||
"}");
|
"}");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void orInComplexPattern() {
|
||||||
|
check("void f() {\n"
|
||||||
|
" Token::Match(tok, \"||\");\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("[test.cpp:2]: (error) Token::Match() pattern \"||\" contains \"||\" or \"|\". Replace it by \"%oror%\" or \"%or%\".\n", errout.str());
|
||||||
|
|
||||||
|
check("void f() {\n"
|
||||||
|
" Token::Match(tok, \"|\");\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("[test.cpp:2]: (error) Token::Match() pattern \"|\" contains \"||\" or \"|\". Replace it by \"%oror%\" or \"%or%\".\n", errout.str());
|
||||||
|
|
||||||
|
check("void f() {\n"
|
||||||
|
" Token::Match(tok, \"[|+-]\");\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
|
||||||
|
check("void f() {\n"
|
||||||
|
" Token::Match(tok, \"foo | bar\");\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("[test.cpp:2]: (error) Token::Match() pattern \"foo | bar\" contains \"||\" or \"|\". Replace it by \"%oror%\" or \"%or%\".\n", errout.str());
|
||||||
|
|
||||||
|
check("void f() {\n"
|
||||||
|
" Token::Match(tok, \"foo |\");\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("[test.cpp:2]: (error) Token::Match() pattern \"foo |\" contains \"||\" or \"|\". Replace it by \"%oror%\" or \"%or%\".\n", errout.str());
|
||||||
|
|
||||||
|
check("void f() {\n"
|
||||||
|
" Token::Match(tok, \"bar foo|\");\n"
|
||||||
|
"}");
|
||||||
|
ASSERT_EQUALS("", errout.str());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_TEST(TestInternal)
|
REGISTER_TEST(TestInternal)
|
||||||
|
|
Loading…
Reference in New Issue