Skip to content

Commit 8686997

Browse files
committed
Add experimental option --performance-valueflow-max-time=T
1 parent 6c11e2a commit 8686997

4 files changed

Lines changed: 71 additions & 29 deletions

File tree

cli/cmdlineparser.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,6 +567,11 @@ bool CmdLineParser::parseFromArgs(int argc, const char* const argv[])
567567
else if (std::strncmp(argv[i], "--output-file=", 14) == 0)
568568
mSettings->outputFile = Path::simplifyPath(Path::fromNativeSeparators(argv[i] + 14));
569569

570+
// Experimental: limit execution time for extended valueflow analysis. basic valueflow analysis
571+
// is always executed.
572+
else if (std::strncmp(argv[i], "--performance-valueflow-max-time=", 33) == 0)
573+
mSettings->performanceValueFlowMaxTime = std::atoi(argv[i] + 33);
574+
570575
// Specify platform
571576
else if (std::strncmp(argv[i], "--platform=", 11) == 0) {
572577
const std::string platform(11+argv[i]);

lib/settings.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ Settings::Settings()
6060
maxConfigs(12),
6161
maxCtuDepth(2),
6262
maxTemplateRecursion(100),
63+
performanceValueFlowMaxTime(-1),
6364
preprocessOnly(false),
6465
quiet(false),
6566
relativePaths(false),

lib/settings.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,9 @@ class CPPCHECKLIB Settings : public cppcheck::Platform {
234234
/** @brief write results (--output-file=<file>) */
235235
std::string outputFile;
236236

237+
/** @brief Experimental: --performance-valueflow-max-time=T */
238+
int performanceValueFlowMaxTime;
239+
237240
/** @brief plist output (--plist-output=<dir>) */
238241
std::string plistOutput;
239242

lib/valueflow.cpp

Lines changed: 62 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,7 @@
107107
#include <climits>
108108
#include <cstdlib>
109109
#include <cstring>
110+
#include <ctime>
110111
#include <exception>
111112
#include <functional>
112113
#include <initializer_list>
@@ -8880,44 +8881,76 @@ void ValueFlow::setValues(TokenList *tokenlist, SymbolDatabase* symboldatabase,
88808881
valueFlowSameExpressions(tokenlist);
88818882
valueFlowConditionExpressions(tokenlist, symboldatabase, errorLogger, settings);
88828883

8884+
const std::time_t stopTime = (settings->performanceValueFlowMaxTime >= 0) ? (std::time(nullptr) + settings->performanceValueFlowMaxTime) : (~0ULL/2);
8885+
88838886
std::size_t values = 0;
88848887
std::size_t n = 4;
88858888
while (n > 0 && values != getTotalValues(tokenlist)) {
88868889
values = getTotalValues(tokenlist);
8887-
valueFlowImpossibleValues(tokenlist, settings);
8888-
valueFlowSymbolicOperators(tokenlist, symboldatabase);
8889-
valueFlowCondition(SymbolicConditionHandler{}, tokenlist, symboldatabase, errorLogger, settings);
8890-
valueFlowSymbolicInfer(tokenlist, symboldatabase);
8891-
valueFlowArrayBool(tokenlist);
8892-
valueFlowArrayElement(tokenlist, settings);
8893-
valueFlowRightShift(tokenlist, settings);
8894-
valueFlowAfterAssign(tokenlist, symboldatabase, errorLogger, settings);
8895-
valueFlowAfterSwap(tokenlist, symboldatabase, errorLogger, settings);
8896-
valueFlowCondition(SimpleConditionHandler{}, tokenlist, symboldatabase, errorLogger, settings);
8897-
valueFlowInferCondition(tokenlist, settings);
8898-
valueFlowSwitchVariable(tokenlist, symboldatabase, errorLogger, settings);
8899-
valueFlowForLoop(tokenlist, symboldatabase, errorLogger, settings);
8900-
valueFlowSubFunction(tokenlist, symboldatabase, errorLogger, settings);
8901-
valueFlowFunctionReturn(tokenlist, errorLogger);
8902-
valueFlowLifetime(tokenlist, symboldatabase, errorLogger, settings);
8903-
valueFlowFunctionDefaultParameter(tokenlist, symboldatabase);
8904-
valueFlowUninit(tokenlist, symboldatabase, settings);
8890+
8891+
if (std::time(nullptr) < stopTime)
8892+
valueFlowImpossibleValues(tokenlist, settings);
8893+
if (std::time(nullptr) < stopTime)
8894+
valueFlowSymbolicOperators(tokenlist, symboldatabase);
8895+
if (std::time(nullptr) < stopTime)
8896+
valueFlowCondition(SymbolicConditionHandler{}, tokenlist, symboldatabase, errorLogger, settings);
8897+
if (std::time(nullptr) < stopTime)
8898+
valueFlowSymbolicInfer(tokenlist, symboldatabase);
8899+
if (std::time(nullptr) < stopTime)
8900+
valueFlowArrayBool(tokenlist);
8901+
if (std::time(nullptr) < stopTime)
8902+
valueFlowArrayElement(tokenlist, settings);
8903+
if (std::time(nullptr) < stopTime)
8904+
valueFlowRightShift(tokenlist, settings);
8905+
if (std::time(nullptr) < stopTime)
8906+
valueFlowAfterAssign(tokenlist, symboldatabase, errorLogger, settings);
8907+
if (std::time(nullptr) < stopTime)
8908+
valueFlowAfterSwap(tokenlist, symboldatabase, errorLogger, settings);
8909+
if (std::time(nullptr) < stopTime)
8910+
valueFlowCondition(SimpleConditionHandler{}, tokenlist, symboldatabase, errorLogger, settings);
8911+
if (std::time(nullptr) < stopTime)
8912+
valueFlowInferCondition(tokenlist, settings);
8913+
if (std::time(nullptr) < stopTime)
8914+
valueFlowSwitchVariable(tokenlist, symboldatabase, errorLogger, settings);
8915+
if (std::time(nullptr) < stopTime)
8916+
valueFlowForLoop(tokenlist, symboldatabase, errorLogger, settings);
8917+
if (std::time(nullptr) < stopTime)
8918+
valueFlowSubFunction(tokenlist, symboldatabase, errorLogger, settings);
8919+
if (std::time(nullptr) < stopTime)
8920+
valueFlowFunctionReturn(tokenlist, errorLogger);
8921+
if (std::time(nullptr) < stopTime)
8922+
valueFlowLifetime(tokenlist, symboldatabase, errorLogger, settings);
8923+
if (std::time(nullptr) < stopTime)
8924+
valueFlowFunctionDefaultParameter(tokenlist, symboldatabase);
8925+
if (std::time(nullptr) < stopTime)
8926+
valueFlowUninit(tokenlist, symboldatabase, settings);
8927+
89058928
if (tokenlist->isCPP()) {
8906-
valueFlowAfterMove(tokenlist, symboldatabase, settings);
8907-
valueFlowSmartPointer(tokenlist, errorLogger, settings);
8908-
valueFlowIterators(tokenlist, settings);
8909-
valueFlowCondition(IteratorConditionHandler{}, tokenlist, symboldatabase, errorLogger, settings);
8910-
valueFlowIteratorInfer(tokenlist, settings);
8911-
valueFlowContainerSize(tokenlist, symboldatabase, errorLogger, settings);
8912-
valueFlowCondition(ContainerConditionHandler{}, tokenlist, symboldatabase, errorLogger, settings);
8913-
}
8914-
valueFlowSafeFunctions(tokenlist, symboldatabase, settings);
8929+
if (std::time(nullptr) < stopTime)
8930+
valueFlowAfterMove(tokenlist, symboldatabase, settings);
8931+
if (std::time(nullptr) < stopTime)
8932+
valueFlowSmartPointer(tokenlist, errorLogger, settings);
8933+
if (std::time(nullptr) < stopTime)
8934+
valueFlowIterators(tokenlist, settings);
8935+
if (std::time(nullptr) < stopTime)
8936+
valueFlowCondition(IteratorConditionHandler{}, tokenlist, symboldatabase, errorLogger, settings);
8937+
if (std::time(nullptr) < stopTime)
8938+
valueFlowIteratorInfer(tokenlist, settings);
8939+
if (std::time(nullptr) < stopTime)
8940+
valueFlowContainerSize(tokenlist, symboldatabase, errorLogger, settings);
8941+
if (std::time(nullptr) < stopTime)
8942+
valueFlowCondition(ContainerConditionHandler{}, tokenlist, symboldatabase, errorLogger, settings);
8943+
}
8944+
if (std::time(nullptr) < stopTime)
8945+
valueFlowSafeFunctions(tokenlist, symboldatabase, settings);
89158946
n--;
89168947
}
89178948

8918-
valueFlowDynamicBufferSize(tokenlist, symboldatabase, settings);
8949+
if (std::time(nullptr) < stopTime)
8950+
valueFlowDynamicBufferSize(tokenlist, symboldatabase, settings);
89198951

8920-
valueFlowDebug(tokenlist, errorLogger);
8952+
if (std::time(nullptr) < stopTime)
8953+
valueFlowDebug(tokenlist, errorLogger);
89218954
}
89228955

89238956
ValueFlow::Value ValueFlow::Value::unknown()

0 commit comments

Comments
 (0)