MCPcopy Create free account
hub / github.com/cppcheck-opensource/cppcheck / checkMissingPercentCharacter

Method checkMissingPercentCharacter

lib/checkinternal.cpp:210–249  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

208}
209
210void CheckInternalImpl::checkMissingPercentCharacter()
211{
212 const SymbolDatabase *symbolDatabase = mTokenizer->getSymbolDatabase();
213 for (const Scope* scope : symbolDatabase->functionScopes) {
214 for (const Token* tok = scope->bodyStart->next(); tok != scope->bodyEnd; tok = tok->next()) {
215 if (!Token::simpleMatch(tok, "Token :: Match (") && !Token::simpleMatch(tok, "Token :: findmatch ("))
216 continue;
217
218 const std::string& funcname = tok->strAt(2);
219
220 // Get pattern string
221 const Token *patternTok = tok->tokAt(4)->nextArgument();
222 if (!patternTok || patternTok->tokType() != Token::eString)
223 continue;
224
225 const std::string pattern = patternTok->strValue();
226
227 for (auto knownPattern = knownPatterns.cbegin(); knownPattern != knownPatterns.cend(); ++knownPattern) {
228 const std::string brokenPattern = knownPattern->substr(0, knownPattern->size() - 1);
229
230 std::string::size_type pos = 0;
231 while ((pos = pattern.find(brokenPattern, pos)) != std::string::npos) {
232 // Check if it's the full pattern
233 if (pattern.find(*knownPattern, pos) != pos) {
234 // Known whitelist of substrings
235 if ((brokenPattern == "%var" && pattern.find("%varid%", pos) == pos) ||
236 (brokenPattern == "%or" && pattern.find("%oror%", pos) == pos)) {
237 ++pos;
238 continue;
239 }
240
241 missingPercentCharacterError(tok, pattern, funcname);
242 }
243
244 ++pos;
245 }
246 }
247 }
248 }
249}
250
251void CheckInternalImpl::checkUnknownPattern()
252{

Callers 1

runChecksMethod · 0.80

Calls 7

nextMethod · 0.80
simpleMatchFunction · 0.70
nextArgumentMethod · 0.45
tokAtMethod · 0.45
strValueMethod · 0.45
sizeMethod · 0.45
findMethod · 0.45

Tested by

no test coverage detected