Skip to content

Commit 217da6d

Browse files
committed
CheckUnusedFunctions: look up proper file / added (TODO) test cases for #11483
1 parent d24710c commit 217da6d

4 files changed

Lines changed: 52 additions & 7 deletions

File tree

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -853,7 +853,7 @@ test/testtype.o: test/testtype.cpp lib/check.h lib/checktype.h lib/color.h lib/c
853853
test/testuninitvar.o: test/testuninitvar.cpp lib/check.h lib/checkuninitvar.h lib/color.h lib/config.h lib/ctu.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h
854854
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testuninitvar.cpp
855855

856-
test/testunusedfunctions.o: test/testunusedfunctions.cpp lib/check.h lib/checkunusedfunctions.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h
856+
test/testunusedfunctions.o: test/testunusedfunctions.cpp externals/simplecpp/simplecpp.h lib/check.h lib/checkunusedfunctions.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/preprocessor.h lib/settings.h lib/standards.h lib/suppressions.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h test/helpers.h
857857
$(CXX) ${INCLUDE_FOR_TEST} $(CPPFLAGS) $(CXXFLAGS) -c -o $@ test/testunusedfunctions.cpp
858858

859859
test/testunusedprivfunc.o: test/testunusedprivfunc.cpp externals/simplecpp/simplecpp.h lib/check.h lib/checkclass.h lib/color.h lib/config.h lib/errorlogger.h lib/errortypes.h lib/importproject.h lib/library.h lib/mathlib.h lib/platform.h lib/settings.h lib/sourcelocation.h lib/standards.h lib/suppressions.h lib/symboldatabase.h lib/templatesimplifier.h lib/token.h lib/tokenize.h lib/tokenlist.h lib/utils.h lib/vfvalue.h test/fixture.h

lib/checkunusedfunctions.cpp

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ void CheckUnusedFunctions::parseTokens(const Tokenizer &tokenizer, const char Fi
7878
const SymbolDatabase* symbolDatabase = tokenizer.getSymbolDatabase();
7979
for (const Scope* scope : symbolDatabase->functionScopes) {
8080
const Function* func = scope->function;
81-
if (!func || !func->token || scope->bodyStart->fileIndex() != 0)
81+
if (!func || !func->token)
8282
continue;
8383

8484
// Don't warn about functions that are marked by __attribute__((constructor)) or __attribute__((destructor))
@@ -95,12 +95,14 @@ void CheckUnusedFunctions::parseTokens(const Tokenizer &tokenizer, const char Fi
9595
if (!usage.lineNumber)
9696
usage.lineNumber = func->token->linenr();
9797

98+
const std::string fileName = tokenizer.list.getFiles()[func->token->fileIndex()];
99+
98100
// No filename set yet..
99101
if (usage.filename.empty()) {
100-
usage.filename = tokenizer.list.getSourceFilePath();
102+
usage.filename = fileName;
101103
}
102104
// Multiple files => filename = "+"
103-
else if (usage.filename != tokenizer.list.getSourceFilePath()) {
105+
else if (usage.filename != fileName) {
104106
//func.filename = "+";
105107
usage.usedOtherFile |= usage.usedSameFile;
106108
}
@@ -137,7 +139,7 @@ void CheckUnusedFunctions::parseTokens(const Tokenizer &tokenizer, const char Fi
137139
mFunctions[markupVarToken->str()].usedOtherFile = true;
138140
else if (markupVarToken->next()->str() == "(") {
139141
FunctionUsage &func = mFunctions[markupVarToken->str()];
140-
func.filename = tokenizer.list.getSourceFilePath();
142+
func.filename = tokenizer.list.getFiles()[markupVarToken->fileIndex()];
141143
if (func.filename.empty() || func.filename == "+")
142144
func.usedOtherFile = true;
143145
else
@@ -251,7 +253,7 @@ void CheckUnusedFunctions::parseTokens(const Tokenizer &tokenizer, const char Fi
251253
if (funcname) {
252254
const auto baseName = stripTemplateParameters(funcname->str());
253255
FunctionUsage &func = mFunctions[baseName];
254-
const std::string& called_from_file = tokenizer.list.getSourceFilePath();
256+
const std::string& called_from_file = tokenizer.list.getFiles()[funcname->fileIndex()];
255257

256258
if (func.filename.empty() || func.filename == "+" || func.filename != called_from_file)
257259
func.usedOtherFile = true;

test/cli/test-other.py

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,4 +60,28 @@ def test_missing_include_inline_suppr(tmpdir):
6060
args = ['--enable=missingInclude', '--inline-suppr', test_file]
6161

6262
_, _, stderr = cppcheck(args)
63-
assert stderr == ''
63+
assert stderr == ''
64+
65+
# #11483
66+
def test_unused_function_include(tmpdir):
67+
test_cpp_file = os.path.join(tmpdir, 'test.cpp')
68+
with open(test_cpp_file, 'wt') as f:
69+
f.write("""
70+
#include "test.h"
71+
""")
72+
73+
test_h_file = os.path.join(tmpdir, 'test.h')
74+
with open(test_h_file, 'wt') as f:
75+
f.write("""
76+
class A {
77+
public:
78+
void f() {}
79+
// cppcheck-suppress unusedFunction
80+
void f2() {}
81+
};
82+
""")
83+
84+
args = ['--enable=unusedFunction', '--inline-suppr', '--template={file}:{line}:{column}: {severity}:{inconclusive:inconclusive:} {message} [{id}]', test_cpp_file]
85+
86+
_, _, stderr = cppcheck(args)
87+
assert stderr == "{}:4:0: style: The function 'f' is never used. [unusedFunction]\n".format(test_h_file)

test/testunusedfunctions.cpp

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@
1818

1919
#include "checkunusedfunctions.h"
2020
#include "errortypes.h"
21+
#include "helpers.h"
2122
#include "platform.h"
23+
#include "preprocessor.h"
2224
#include "settings.h"
2325
#include "fixture.h"
2426
#include "tokenize.h"
@@ -75,6 +77,8 @@ class TestUnusedFunctions : public TestFixture {
7577
TEST_CASE(entrypointsWin);
7678
TEST_CASE(entrypointsWinU);
7779
TEST_CASE(entrypointsUnix);
80+
81+
TEST_CASE(includes);
7882
}
7983

8084
#define check(...) check_(__FILE__, __LINE__, __VA_ARGS__)
@@ -674,6 +678,21 @@ class TestUnusedFunctions : public TestFixture {
674678
"int _fini() { }\n", cppcheck::Platform::Type::Native, &s);
675679
ASSERT_EQUALS("", errout.str());
676680
}
681+
682+
void includes()
683+
{
684+
// #11483
685+
const char inc[] = "class A {\n"
686+
"public:\n"
687+
" void f() {}\n"
688+
"};";
689+
const char code[] = R"(#include "test.h")";
690+
ScopedFile header("test.h", inc);
691+
Preprocessor preprocessor(settings, this);
692+
const std::string processed = PreprocessorHelper::getcode(preprocessor, code, "", "test.cpp");
693+
check(processed.c_str());
694+
TODO_ASSERT_EQUALS("[test.h:3]: (style) The function 'f' is never used.\n", "[test.cpp:3]: (style) The function 'f' is never used.\n", errout.str());
695+
}
677696
};
678697

679698
REGISTER_TEST(TestUnusedFunctions)

0 commit comments

Comments
 (0)