From f5a11a6510d256f0abf470bd9967f09c4c6f7a3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Marjam=C3=A4ki?= Date: Mon, 29 Jan 2018 15:15:35 +0100 Subject: [PATCH] UninitVar: Speedup whole program analysis a bit --- lib/checkuninitvar.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/lib/checkuninitvar.cpp b/lib/checkuninitvar.cpp index d7a82bbdc..ab11be948 100644 --- a/lib/checkuninitvar.cpp +++ b/lib/checkuninitvar.cpp @@ -1486,12 +1486,16 @@ Check::FileInfo * CheckUninitVar::loadFileInfoFromXml(const tinyxml2::XMLElement static bool findPath(const CheckUninitVar::MyFileInfo::FunctionArg &from, const CheckUninitVar::MyFileInfo::FunctionArg &to, - const std::list &nestedCalls) + const std::map> &nestedCalls) { if (from.id == to.id && from.argnr == to.argnr) return true; - for (std::list::const_iterator it = nestedCalls.begin(); it != nestedCalls.end(); ++it) { + const std::map>::const_iterator nc = nestedCalls.find(from.id); + if (nc == nestedCalls.end()) + return false; + + for (std::list::const_iterator it = nc->second.begin(); it != nc->second.end(); ++it) { if (from.id == it->id && from.argnr == it->argnr && it->id2 == to.id && it->argnr2 == to.argnr) return true; } @@ -1518,12 +1522,18 @@ bool CheckUninitVar::analyseWholeProgram(const std::list &file bool foundErrors = false; + std::map> nestedCalls; + for (std::list::const_iterator it = all.nestedCall.begin(); it != all.nestedCall.end(); ++it) { + std::list &list = nestedCalls[it->id]; + list.push_back(*it); + } + for (std::list::const_iterator it1 = all.uninitialized.begin(); it1 != all.uninitialized.end(); ++it1) { const CheckUninitVar::MyFileInfo::FunctionArg &uninitialized = *it1; for (std::list::const_iterator it2 = all.readData.begin(); it2 != all.readData.end(); ++it2) { const CheckUninitVar::MyFileInfo::FunctionArg &readData = *it2; - if (!findPath(*it1, *it2, all.nestedCall)) + if (!findPath(*it1, *it2, nestedCalls)) continue; ErrorLogger::ErrorMessage::FileLocation fileLoc1; @@ -1559,7 +1569,7 @@ bool CheckUninitVar::analyseWholeProgram(const std::list &file for (std::list::const_iterator it2 = all.dereferenced.begin(); it2 != all.dereferenced.end(); ++it2) { const CheckUninitVar::MyFileInfo::FunctionArg &dereference = *it2; - if (!findPath(*it1, *it2, all.nestedCall)) + if (!findPath(*it1, *it2, nestedCalls)) continue; ErrorLogger::ErrorMessage::FileLocation fileLoc1;