Skip to content

Commit 79f9f53

Browse files
authored
adjusted message about unusedFunction not being active / improved testing of checks requiring --cppcheck-build-dir (danmar#6573)
1 parent ddf5480 commit 79f9f53

File tree

4 files changed

+119
-40
lines changed

4 files changed

+119
-40
lines changed

cli/cmdlineparser.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1411,9 +1411,12 @@ CmdLineParser::Result CmdLineParser::parseFromArgs(int argc, const char* const a
14111411
else if ((def || mSettings.preprocessOnly) && !maxconfigs)
14121412
mSettings.maxConfigs = 1U;
14131413

1414-
if (mSettings.checks.isEnabled(Checks::unusedFunction) && mSettings.jobs > 1 && mSettings.buildDir.empty()) {
1415-
// TODO: bail out
1416-
mLogger.printMessage("unusedFunction check can't be used with '-j' option. Disabling unusedFunction check.");
1414+
if (mSettings.jobs > 1 && mSettings.buildDir.empty()) {
1415+
// TODO: bail out instead?
1416+
if (mSettings.checks.isEnabled(Checks::unusedFunction))
1417+
mLogger.printMessage("unusedFunction check requires --cppcheck-build-dir to be active with -j.");
1418+
// TODO: enable
1419+
//mLogger.printMessage("whole program analysis requires --cppcheck-build-dir to be active with -j.");
14171420
}
14181421

14191422
if (!mPathNames.empty() && project.projectType != ImportProject::Type::NONE) {

test/cli/qml_test.py

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
# python3 -m pytest test-qml.py
33

44
import os
5+
import pytest
56
from testutils import cppcheck
67

78
__script_dir = os.path.dirname(os.path.abspath(__file__))
@@ -11,55 +12,54 @@
1112
__project_dir_sep = __project_dir + os.path.sep
1213

1314

14-
def test_unused_functions():
15-
ret, stdout, stderr = cppcheck(['-q', '--template=simple', '--library=qt', '--enable=unusedFunction', '-j1', __project_dir])
16-
# there are unused functions. But fillSampleData is not unused because that is referenced from main.qml
15+
def __test_unused_functions(extra_args):
16+
args = [
17+
'-q',
18+
'--template=simple',
19+
'--library=qt',
20+
'--enable=unusedFunction',
21+
__project_dir
22+
]
23+
args += extra_args
24+
ret, stdout, stderr = cppcheck(args)
1725
assert stdout.splitlines() == []
18-
assert stderr.splitlines() == [
19-
"{}samplemodel.cpp:9:0: style: The function 'rowCount' is never used. [unusedFunction]".format(__project_dir_sep),
26+
lines = stderr.splitlines()
27+
lines.sort()
28+
# there are unused functions. But fillSampleData is not unused because that is referenced from main.qml
29+
assert lines == [
2030
"{}samplemodel.cpp:15:0: style: The function 'data' is never used. [unusedFunction]".format(__project_dir_sep),
21-
"{}samplemodel.cpp:38:0: style: The function 'roleNames' is never used. [unusedFunction]".format(__project_dir_sep)
31+
"{}samplemodel.cpp:38:0: style: The function 'roleNames' is never used. [unusedFunction]".format(__project_dir_sep),
32+
"{}samplemodel.cpp:9:0: style: The function 'rowCount' is never used. [unusedFunction]".format(__project_dir_sep)
2233
]
2334
assert ret == 0, stdout
2435

2536

37+
def test_unused_functions():
38+
__test_unused_functions(['-j1'])
39+
40+
2641
def test_unused_functions_j():
27-
ret, stdout, stderr = cppcheck(['-q', '--template=simple', '--library=qt', '--enable=unusedFunction', '-j2', __project_dir])
28-
assert stdout.splitlines() == [
29-
"cppcheck: unusedFunction check can't be used with '-j' option. Disabling unusedFunction check."
42+
args = [
43+
'-q',
44+
'--template=simple',
45+
'--library=qt',
46+
'--enable=unusedFunction',
47+
'-j2',
48+
__project_dir
3049
]
50+
ret, stdout, stderr = cppcheck(args)
51+
assert stdout.splitlines() == ["cppcheck: unusedFunction check requires --cppcheck-build-dir to be active with -j."]
3152
assert stderr.splitlines() == []
32-
assert ret == 0, stdout # TODO: abil out on this
53+
assert ret == 0, stdout
3354

3455

3556
# TODO: fillSampleData is not unused
57+
@pytest.mark.xfail(strict=True)
3658
def test_unused_functions_builddir(tmpdir):
3759
build_dir = os.path.join(tmpdir, 'b1')
3860
os.mkdir(build_dir)
39-
ret, stdout, stderr = cppcheck(['-q', '--template=simple', '--library=qt', '--enable=unusedFunction', '--cppcheck-build-dir={}'.format(build_dir), __project_dir])
40-
assert stdout.splitlines() == []
41-
assert stderr.splitlines() == [
42-
"{}samplemodel.cpp:15:0: style: The function 'data' is never used. [unusedFunction]".format(__project_dir_sep),
43-
"{}samplemodel.cpp:47:0: style: The function 'fillSampleData' is never used. [unusedFunction]".format(__project_dir_sep),
44-
"{}samplemodel.cpp:38:0: style: The function 'roleNames' is never used. [unusedFunction]".format(__project_dir_sep),
45-
"{}samplemodel.cpp:9:0: style: The function 'rowCount' is never used. [unusedFunction]".format(__project_dir_sep),
46-
]
47-
assert ret == 0, stdout
48-
61+
__test_unused_functions(['--cppcheck-build-dir={}'.format(build_dir)])
4962

50-
# TODO: fillSampleData is not unused
51-
def test_unused_functions_builddir_j(tmpdir):
52-
build_dir = os.path.join(tmpdir, 'b1')
53-
os.mkdir(build_dir)
54-
ret, stdout, stderr = cppcheck(['-q', '--template=simple', '--library=qt', '--enable=unusedFunction', '-j2', '--cppcheck-build-dir={}'.format(build_dir), __project_dir])
55-
assert stdout.splitlines() == []
56-
assert stderr.splitlines() == [
57-
"{}samplemodel.cpp:15:0: style: The function 'data' is never used. [unusedFunction]".format(__project_dir_sep),
58-
"{}samplemodel.cpp:47:0: style: The function 'fillSampleData' is never used. [unusedFunction]".format(__project_dir_sep),
59-
"{}samplemodel.cpp:38:0: style: The function 'roleNames' is never used. [unusedFunction]".format(__project_dir_sep),
60-
"{}samplemodel.cpp:9:0: style: The function 'rowCount' is never used. [unusedFunction]".format(__project_dir_sep),
61-
]
62-
assert ret == 0, stdout
6363

6464
# TODO: test with project file
6565
# TODO: test with FileSettings

test/cli/unused_function_test.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ def test_unused_functions():
4242
def test_unused_functions_j():
4343
ret, stdout, stderr = cppcheck(['-q', '--template=simple', '--enable=unusedFunction', '--inline-suppr', '-j2', __project_dir])
4444
assert stdout.splitlines() == [
45-
"cppcheck: unusedFunction check can't be used with '-j' option. Disabling unusedFunction check."
45+
"cppcheck: unusedFunction check requires --cppcheck-build-dir to be active with -j."
4646
]
4747
assert stderr.splitlines() == []
4848
assert ret == 0, stdout
@@ -70,7 +70,7 @@ def test_unused_functions_project_j():
7070
'--project={}'.format(os.path.join(__project_dir, 'unusedFunction.cppcheck')),
7171
'-j2'])
7272
assert stdout.splitlines() == [
73-
"cppcheck: unusedFunction check can't be used with '-j' option. Disabling unusedFunction check."
73+
"cppcheck: unusedFunction check requires --cppcheck-build-dir to be active with -j."
7474
]
7575
assert [] == stderr.splitlines()
7676
assert ret == 0, stdout
@@ -102,7 +102,7 @@ def test_unused_functions_compdb_j(tmpdir):
102102
'-j2'
103103
])
104104
assert stdout.splitlines() == [
105-
"cppcheck: unusedFunction check can't be used with '-j' option. Disabling unusedFunction check."
105+
"cppcheck: unusedFunction check requires --cppcheck-build-dir to be active with -j."
106106
]
107107
assert stderr.splitlines() == []
108108
assert ret == 0, stdout

test/cli/whole-program_test.py

Lines changed: 77 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,11 +51,27 @@ def test_addon_suppress_inline():
5151
__test_addon_suppress_inline(['-j1'])
5252

5353

54+
# TODO: inline suppressions currently do not work with whole program analysis and addons - see #12835
55+
# whole program analysis requires a build dir with -j
5456
@pytest.mark.xfail(strict=True)
5557
def test_addon_suppress_inline_j():
5658
__test_addon_suppress_inline(['-j2'])
5759

5860

61+
def test_addon_suppress_inline_builddir(tmpdir):
62+
build_dir = os.path.join(tmpdir, 'b1')
63+
os.mkdir(build_dir)
64+
__test_addon_suppress_inline(['-j1', '--cppcheck-build-dir={}'.format(build_dir)])
65+
66+
67+
# TODO: inline suppressions currently do not work with whole program analysis and addons - see #12835
68+
@pytest.mark.xfail(strict=True)
69+
def test_addon_suppress_inline_builddir_j(tmpdir):
70+
build_dir = os.path.join(tmpdir, 'b1')
71+
os.mkdir(build_dir)
72+
__test_addon_suppress_inline(['-j2', '--cppcheck-build-dir={}'.format(build_dir)])
73+
74+
5975
def __test_addon_suppress_inline_project(tmpdir, extra_args):
6076
compile_db = __create_compile_commands(tmpdir, [
6177
os.path.join(__script_dir, 'whole-program', 'whole1.c'),
@@ -84,11 +100,27 @@ def test_addon_suppress_inline_project(tmpdir):
84100
__test_addon_suppress_inline_project(tmpdir, ['-j1'])
85101

86102

103+
# TODO: inline suppressions currently do not work with whole program analysis and addons - see #12835
104+
# whole program analysis requires a build dir with -j
87105
@pytest.mark.xfail(strict=True)
88106
def test_addon_suppress_inline_project_j(tmpdir):
89107
__test_addon_suppress_inline_project(tmpdir, ['-j2'])
90108

91109

110+
def test_addon_suppress_inline_project_builddir(tmpdir):
111+
build_dir = os.path.join(tmpdir, 'b1')
112+
os.mkdir(build_dir)
113+
__test_addon_suppress_inline_project(tmpdir, ['-j1', '--cppcheck-build-dir={}'.format(build_dir)])
114+
115+
116+
# TODO: inline suppressions currently do not work with whole program analysis and addons - see #12835
117+
@pytest.mark.xfail(strict=True)
118+
def test_addon_suppress_inline_project_builddir_j(tmpdir):
119+
build_dir = os.path.join(tmpdir, 'b1')
120+
os.mkdir(build_dir)
121+
__test_addon_suppress_inline_project(tmpdir, ['-j2', '--cppcheck-build-dir={}'.format(build_dir)])
122+
123+
92124
def __test_suppress_inline(extra_args):
93125
args = [
94126
'-q',
@@ -114,11 +146,27 @@ def test_suppress_inline():
114146
__test_suppress_inline(['-j1'])
115147

116148

149+
# TODO: inline suppressions do not work with whole program analysis and -j
150+
# whole program analysis requires a build dir with -j
117151
@pytest.mark.xfail(strict=True)
118152
def test_suppress_inline_j():
119153
__test_suppress_inline(['-j2'])
120154

121155

156+
def test_suppress_inline_builddir(tmpdir):
157+
build_dir = os.path.join(tmpdir, 'b1')
158+
os.mkdir(build_dir)
159+
__test_suppress_inline(['-j1', '--cppcheck-build-dir={}'.format(build_dir)])
160+
161+
162+
# TODO: inline suppressions do not work with whole program analysis and -j
163+
@pytest.mark.xfail(strict=True)
164+
def test_suppress_inline_builddir_j(tmpdir):
165+
build_dir = os.path.join(tmpdir, 'b1')
166+
os.mkdir(build_dir)
167+
__test_suppress_inline(['-j2', '--cppcheck-build-dir={}'.format(build_dir)])
168+
169+
122170
def __test_suppress_inline_project(tmpdir, extra_args):
123171
compile_db = __create_compile_commands(tmpdir, [
124172
os.path.join(__script_dir, 'whole-program', 'odr1.cpp'),
@@ -148,11 +196,25 @@ def test_suppress_inline_project(tmpdir):
148196
__test_suppress_inline_project(tmpdir, ['-j1'])
149197

150198

199+
# whole program analysis requires a build dir with -j
151200
@pytest.mark.xfail(strict=True)
152201
def test_suppress_inline_project_j(tmpdir):
153202
__test_suppress_inline_project(tmpdir, ['-j2'])
154203

155204

205+
def test_suppress_inline_project_builddir(tmpdir):
206+
build_dir = os.path.join(tmpdir, 'b1')
207+
os.mkdir(build_dir)
208+
__test_suppress_inline_project(tmpdir, ['-j1', '--cppcheck-build-dir={}'.format(build_dir)])
209+
210+
# TODO: inline suppressions do not work with whole program analysis and -j
211+
@pytest.mark.xfail(strict=True)
212+
def test_suppress_inline_project_builddir_j(tmpdir):
213+
build_dir = os.path.join(tmpdir, 'b1')
214+
os.mkdir(build_dir)
215+
__test_suppress_inline_project(tmpdir, ['-j2', '--cppcheck-build-dir={}'.format(build_dir)])
216+
217+
156218
def __test_checkclass(extra_args):
157219
args = [
158220
'-q',
@@ -179,11 +241,18 @@ def test_checkclass():
179241
__test_checkclass(['-j1'])
180242

181243

244+
# whole program analysis requires a build dir with -j
182245
@pytest.mark.xfail(strict=True)
183246
def test_checkclass_j():
184247
__test_checkclass(['-j2'])
185248

186249

250+
def test_checkclass_builddir(tmpdir):
251+
build_dir = os.path.join(tmpdir, 'b1')
252+
os.mkdir(build_dir)
253+
__test_checkclass(['--cppcheck-build-dir={}'.format(build_dir)])
254+
255+
187256
def __test_checkclass_project(tmpdir, extra_args):
188257
odr_file_1 = os.path.join(__script_dir, 'whole-program', 'odr1.cpp')
189258

@@ -216,6 +285,13 @@ def test_checkclass_project(tmpdir):
216285
__test_checkclass_project(tmpdir, ['-j1'])
217286

218287

288+
# whole program analysis requires a build dir with -j
219289
@pytest.mark.xfail(strict=True)
220290
def test_checkclass_project_j(tmpdir):
221-
__test_checkclass_project(tmpdir, ['-j2'])
291+
__test_checkclass_project(tmpdir, ['-j2'])
292+
293+
294+
def test_checkclass_project_builddir(tmpdir):
295+
build_dir = os.path.join(tmpdir, 'b1')
296+
os.mkdir(build_dir)
297+
__test_checkclass_project(tmpdir, ['-j1', '--cppcheck-build-dir={}'.format(build_dir)])

0 commit comments

Comments
 (0)