Added '--check-headers=no' option.

This commit is contained in:
Daniel Marjamäki 2019-03-02 19:52:15 +01:00
parent 5087f15035
commit f5c274b3b1
5 changed files with 54 additions and 0 deletions

View File

@ -155,6 +155,10 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[])
else if (std::strcmp(argv[i], "--dump") == 0) else if (std::strcmp(argv[i], "--dump") == 0)
mSettings->dump = true; mSettings->dump = true;
// --check-headers=no
else if (std::strcmp(argv[i], "--check-headers=no") == 0)
mSettings->checkHeaders = false;
// max ctu depth // max ctu depth
else if (std::strncmp(argv[i], "--max-ctu-depth=", 16) == 0) else if (std::strncmp(argv[i], "--max-ctu-depth=", 16) == 0)
mSettings->maxCtuDepth = std::atoi(argv[i] + 16); mSettings->maxCtuDepth = std::atoi(argv[i] + 16);
@ -914,6 +918,8 @@ void CmdLineParser::printHelp()
" incremental analysis, distributed analysis.\n" " incremental analysis, distributed analysis.\n"
" --check-config Check cppcheck configuration. The normal code\n" " --check-config Check cppcheck configuration. The normal code\n"
" analysis is disabled by this flag.\n" " analysis is disabled by this flag.\n"
" --check-headers=no Turn off checking of included files, to make the\n"
" analysis faster.\n"
" --check-library Show information messages when library files have\n" " --check-library Show information messages when library files have\n"
" incomplete info.\n" " incomplete info.\n"
" --config-exclude=<dir>\n" " --config-exclude=<dir>\n"

View File

@ -49,6 +49,7 @@ Settings::Settings()
maxConfigs(12), maxConfigs(12),
enforcedLang(None), enforcedLang(None),
reportProgress(false), reportProgress(false),
checkHeaders(true),
checkConfiguration(false), checkConfiguration(false),
checkLibrary(false) checkLibrary(false)
{ {

View File

@ -285,6 +285,10 @@ public:
/** Check for incomplete info in library files? */ /** Check for incomplete info in library files? */
bool checkLibrary; bool checkLibrary;
/** Check code in the headers, this is on by default but can
* be turned off to save CPU */
bool checkHeaders;
/** Struct contains standards settings */ /** Struct contains standards settings */
Standards standards; Standards standards;

View File

@ -3630,6 +3630,8 @@ bool Tokenizer::simplifyTokenList1(const char FileName[])
createLinks(); createLinks();
simplifyHeaders();
// Remove __asm.. // Remove __asm..
simplifyAsm(); simplifyAsm();
@ -4257,6 +4259,40 @@ void Tokenizer::dump(std::ostream &out) const
list.front()->printValueFlow(true, out); list.front()->printValueFlow(true, out);
} }
void Tokenizer::simplifyHeaders()
{
// TODO : can we remove anything in headers here? Like unused declarations.
// Maybe if --dump is used we want to have _everything_.
if (mSettings->checkHeaders)
// Default=full analysis. All information in the headers are kept.
return;
// We want to remove selected stuff from the headers but not *everything*.
// The intention here is to not damage the analysis of the source file.
// TODO: Remove unused types/variables/etc in headers..
for (Token *tok = list.front(); tok; tok = tok->next()) {
if (tok->fileIndex() == 0)
// Keep all code in the source file
continue;
// Remove executable code
if (tok->str() == "{") {
const Token *prev = tok->previous();
while (prev && prev->isName())
prev = prev->previous();
if (Token::simpleMatch(prev, ")")) {
// Replace all tokens from { to } with a ";".
Token::eraseTokens(tok,tok->link()->next());
tok->str(";");
tok->link(nullptr);
}
}
}
}
void Tokenizer::removeMacrosInGlobalScope() void Tokenizer::removeMacrosInGlobalScope()
{ {
for (Token *tok = list.front(); tok; tok = tok->next()) { for (Token *tok = list.front(); tok; tok = tok->next()) {

View File

@ -164,6 +164,13 @@ public:
*/ */
bool simplifyTokenList2(); bool simplifyTokenList2();
/**
* If --check-headers=no has been given; then remove unneeded code in headers.
* - All executable code.
* - Unused types/variables/etc
*/
void simplifyHeaders();
/** /**
* Deletes dead code between 'begin' and 'end'. * Deletes dead code between 'begin' and 'end'.
* In general not everything can be erased, such as: * In general not everything can be erased, such as: