@@ -169,6 +169,51 @@ void CheckInternal::checkMissingPercentCharacter()
169169 }
170170}
171171
172+ void CheckInternal::checkUnknownPattern ()
173+ {
174+ static std::set<std::string> knownPatterns;
175+ if (knownPatterns.empty ()) {
176+ knownPatterns.insert (" %any%" );
177+ knownPatterns.insert (" %var%" );
178+ knownPatterns.insert (" %type%" );
179+ knownPatterns.insert (" %num%" );
180+ knownPatterns.insert (" %bool%" );
181+ knownPatterns.insert (" %str%" );
182+ knownPatterns.insert (" %varid%" );
183+ knownPatterns.insert (" %or%" );
184+ knownPatterns.insert (" %oror%" );
185+ knownPatterns.insert (" %op%" );
186+ }
187+
188+ for (const Token *tok = _tokenizer->tokens (); tok; tok = tok->next ()) {
189+ if (!Token::simpleMatch (tok, " Token :: Match (" ) && !Token::simpleMatch (tok, " Token :: findmatch (" ))
190+ continue ;
191+
192+ // Get pattern string
193+ const Token *pattern_tok = tok->tokAt (4 )->nextArgument ();
194+ if (!pattern_tok || pattern_tok->type () != Token::eString)
195+ continue ;
196+
197+ const std::string pattern = pattern_tok->strValue ();
198+ bool inBrackets = false ;
199+
200+ for (std::string::size_type i = 0 ; i < pattern.length ()-1 ; i++) {
201+ if (pattern[i] == ' [' && (i == 0 || pattern[i-1 ] == ' ' ))
202+ inBrackets = true ;
203+ else if (pattern[i] == ' ]' )
204+ inBrackets = false ;
205+ else if (pattern[i] == ' %' && pattern[i+1 ] != ' ' && pattern[i+1 ] != ' |' && !inBrackets) {
206+ std::string::size_type end = pattern.find (' %' , i+1 );
207+ if (end != std::string::npos) {
208+ std::string s = pattern.substr (i, end-i+1 );
209+ if (knownPatterns.find (s) == knownPatterns.end ())
210+ unknownPatternError (tok, s);
211+ }
212+ }
213+ }
214+ }
215+ }
216+
172217void CheckInternal::simplePatternError (const Token* tok, const std::string& pattern, const std::string &funcname)
173218{
174219 reportError (tok, Severity::warning, " simplePatternError" ,
@@ -190,4 +235,10 @@ void CheckInternal::missingPercentCharacterError(const Token* tok, const std::st
190235 );
191236}
192237
238+ void CheckInternal::unknownPatternError (const Token* tok, const std::string& pattern)
239+ {
240+ reportError (tok, Severity::error, " unkownPattern" ,
241+ " Unkown pattern used: \" " + pattern + " \" " );
242+ }
243+
193244#endif // #ifndef NDEBUG
0 commit comments