Skip to content

Commit 899507a

Browse files
committed
fixed #14609 - valueflow.cpp: made timer results unique
1 parent 215c1e6 commit 899507a

2 files changed

Lines changed: 55 additions & 11 deletions

File tree

lib/valueflow.cpp

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1210,6 +1210,12 @@ static void valueFlowEnumValue(SymbolDatabase & symboldatabase, const Settings &
12101210
}
12111211
}
12121212

1213+
// trampoline to generate unique timer results entry
1214+
static void valueFlowEnumValueEarly(SymbolDatabase & symboldatabase, const Settings & settings)
1215+
{
1216+
valueFlowEnumValue(symboldatabase, settings);
1217+
}
1218+
12131219
static void valueFlowGlobalConstVar(TokenList& tokenList, const Settings& settings)
12141220
{
12151221
// Get variable values...
@@ -7200,7 +7206,7 @@ struct ValueFlowPassRunner {
72007206
bool run_once(std::initializer_list<ValuePtr<ValueFlowPass>> passes) const
72017207
{
72027208
return std::any_of(passes.begin(), passes.end(), [&](const ValuePtr<ValueFlowPass>& pass) {
7203-
return run(pass);
7209+
return run(pass, 0);
72047210
});
72057211
}
72067212

@@ -7210,10 +7216,11 @@ struct ValueFlowPassRunner {
72107216
std::size_t n = state.settings.vfOptions.maxIterations;
72117217
while (n > 0 && values != getTotalValues()) {
72127218
values = getTotalValues();
7213-
const std::string passnum = std::to_string(state.settings.vfOptions.maxIterations - n + 1);
7219+
const std::size_t passnum = state.settings.vfOptions.maxIterations - n + 1;
7220+
const std::string passnum_s = std::to_string(passnum);
72147221
if (std::any_of(passes.begin(), passes.end(), [&](const ValuePtr<ValueFlowPass>& pass) {
7215-
ProgressReporter progressReporter(state.errorLogger, state.settings.reportProgress >= 0, state.tokenlist.getSourceFilePath(), std::string("ValueFlow::") + pass->name() + (' ' + passnum));
7216-
return run(pass);
7222+
ProgressReporter progressReporter(state.errorLogger, state.settings.reportProgress >= 0, state.tokenlist.getSourceFilePath(), std::string("ValueFlow::") + pass->name() + (' ' + passnum_s));
7223+
return run(pass, passnum);
72177224
}))
72187225
return true;
72197226
--n;
@@ -7233,7 +7240,7 @@ struct ValueFlowPassRunner {
72337240
return false;
72347241
}
72357242

7236-
bool run(const ValuePtr<ValueFlowPass>& pass) const
7243+
bool run(const ValuePtr<ValueFlowPass>& pass, std::size_t it) const
72377244
{
72387245
auto start = Clock::now();
72397246
if (start > stop) {
@@ -7243,7 +7250,12 @@ struct ValueFlowPassRunner {
72437250
if (!state.tokenlist.isCPP() && pass->cpp())
72447251
return false;
72457252
if (timerResults) {
7246-
Timer t(pass->name(), state.settings.showtime, timerResults);
7253+
std::string name = pass->name();
7254+
if (it > 0) {
7255+
name += ' ';
7256+
name += std::to_string(it);
7257+
}
7258+
Timer t(name, state.settings.showtime, timerResults);
72477259
pass->run(state);
72487260
} else {
72497261
pass->run(state);
@@ -7375,7 +7387,7 @@ void ValueFlow::setValues(TokenList& tokenlist,
73757387

73767388
ValueFlowPassRunner runner{ValueFlowState{tokenlist, symboldatabase, errorLogger, settings}, timerResults};
73777389
runner.run_once({
7378-
VFA(valueFlowEnumValue(symboldatabase, settings)),
7390+
VFA(valueFlowEnumValueEarly(symboldatabase, settings)),
73797391
VFA(valueFlowNumber(tokenlist, settings)),
73807392
VFA(valueFlowString(tokenlist, settings)),
73817393
VFA(valueFlowTypeTraits(tokenlist, settings)),

test/cli/other_test.py

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1019,30 +1019,62 @@ def test_showtime_top5_summary_j_process(tmp_path):
10191019

10201020

10211021
def test_showtime_file(tmp_path):
1022-
__test_showtime(tmp_path, 'file', 77, 'Check time: ')
1022+
__test_showtime(tmp_path, 'file', 79, 'Check time: ')
10231023

10241024

10251025
# TODO: remove extra args when --executor=process works works
10261026
def test_showtime_summary(tmp_path):
1027-
__test_showtime(tmp_path, 'summary', 77, 'Overall time: ', ['-j1'])
1027+
__test_showtime(tmp_path, 'summary', 79, 'Overall time: ', ['-j1'])
10281028

10291029

10301030
# TODO: remove when --executor=process works works
10311031
def test_showtime_summary_j_thread(tmp_path):
1032-
__test_showtime(tmp_path, 'summary', 77, 'Overall time: ', ['-j2', '--executor=thread'])
1032+
__test_showtime(tmp_path, 'summary', 79, 'Overall time: ', ['-j2', '--executor=thread'])
10331033

10341034

10351035
# TODO: remove override when fixed
10361036
@pytest.mark.skipif(sys.platform == 'win32', reason="requires ProcessExecutor")
10371037
@pytest.mark.xfail(strict=True) # TODO: need to transfer the timer results to parent process - see #4452
10381038
def test_showtime_summary_j_process(tmp_path):
1039-
__test_showtime(tmp_path, 'summary', 77, 'Overall time: ', ['-j2', '--executor=process'])
1039+
__test_showtime(tmp_path, 'summary', 79, 'Overall time: ', ['-j2', '--executor=process'])
10401040

10411041

10421042
def test_showtime_file_total(tmp_path):
10431043
__test_showtime(tmp_path, 'file-total', 0, 'Check time: ')
10441044

10451045

1046+
def test_showtime_unique(tmp_path):
1047+
test_file = tmp_path / 'test.cpp'
1048+
with open(test_file, 'wt') as f:
1049+
f.write(
1050+
"""
1051+
void f()
1052+
{
1053+
(void)(*((int*)0)); // cppcheck-suppress nullPointer
1054+
}
1055+
""")
1056+
1057+
args = [
1058+
f'--showtime=summary',
1059+
'--quiet',
1060+
'--inline-suppr',
1061+
str(test_file)
1062+
]
1063+
1064+
exitcode, stdout, stderr = cppcheck(args)
1065+
assert exitcode == 0
1066+
multi_res = []
1067+
for line in stdout.splitlines():
1068+
# TODO: remove when we no longer emit empty line
1069+
if not line:
1070+
continue
1071+
if any(i in line for i in ['1 result(s)', 'Overall time:']):
1072+
continue
1073+
multi_res.append(line)
1074+
assert multi_res == []
1075+
assert stderr == ''
1076+
1077+
10461078
def test_missing_addon(tmpdir):
10471079
args = ['--addon=misra3', '--addon=misra', '--addon=misra2', 'file.c']
10481080

0 commit comments

Comments
 (0)