Skip to content

Commit c2a8e1f

Browse files
Fix #13218 FP duplicateExpression with nested defines (#6918)
1 parent b8c110c commit c2a8e1f

File tree

3 files changed

+29
-6
lines changed

3 files changed

+29
-6
lines changed

Diff for: lib/astutils.cpp

+6-2
Original file line numberDiff line numberDiff line change
@@ -1547,8 +1547,12 @@ bool compareTokenFlags(const Token* tok1, const Token* tok2, bool macro) {
15471547
if (macro) {
15481548
if (tok1->isExpandedMacro() != tok2->isExpandedMacro())
15491549
return false;
1550-
if (tok1->isExpandedMacro() && tok1->getMacroName() != tok2->getMacroName())
1551-
return false;
1550+
if (tok1->isExpandedMacro()) { // both are macros
1551+
if (tok1->getMacroName() != tok2->getMacroName())
1552+
return false;
1553+
if (tok1->astParent() && tok2->astParent() && tok1->astParent()->isExpandedMacro() && tok1->astParent()->getMacroName() == tok2->astParent()->getMacroName())
1554+
return false;
1555+
}
15521556
if (tok1->isTemplateArg() || tok2->isTemplateArg())
15531557
return false;
15541558
}

Diff for: test/cfg/bsd.c

+4-4
Original file line numberDiff line numberDiff line change
@@ -32,15 +32,15 @@ void nullPointer_setlinebuf(FILE *stream)
3232
// #9323, #9331
3333
void verify_timercmp(struct timeval t)
3434
{
35-
// cppcheck-suppress duplicateExpression
35+
// TODO cppcheck-suppress duplicateExpression
3636
(void)timercmp(&t, &t, <);
37-
// cppcheck-suppress duplicateExpression
37+
// TODO cppcheck-suppress duplicateExpression
3838
(void)timercmp(&t, &t, <=);
3939
(void)timercmp(&t, &t, ==);
4040
(void)timercmp(&t, &t, !=);
41-
// cppcheck-suppress duplicateExpression
41+
// TODO cppcheck-suppress duplicateExpression
4242
(void)timercmp(&t, &t, >=);
43-
// cppcheck-suppress duplicateExpression
43+
// TODO cppcheck-suppress duplicateExpression
4444
(void)timercmp(&t, &t, >);
4545
}
4646

Diff for: test/testother.cpp

+19
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,7 @@ class TestOther : public TestFixture {
177177
TEST_CASE(duplicateExpression15); // #10650
178178
TEST_CASE(duplicateExpression16); // #10569
179179
TEST_CASE(duplicateExpression17); // #12036
180+
TEST_CASE(duplicateExpression18);
180181
TEST_CASE(duplicateExpressionLoop);
181182
TEST_CASE(duplicateValueTernary);
182183
TEST_CASE(duplicateExpressionTernary); // #6391
@@ -7492,6 +7493,24 @@ class TestOther : public TestFixture {
74927493
ASSERT_EQUALS("", errout_str());
74937494
}
74947495

7496+
void duplicateExpression18() {
7497+
checkP("#if defined(ABC)\n" // #13218
7498+
"#define MACRO1 (0x1)\n"
7499+
"#else\n"
7500+
"#define MACRO1 (0)\n"
7501+
"#endif\n"
7502+
"#if defined(XYZ)\n"
7503+
"#define MACRO2 (0x2)\n"
7504+
"#else\n"
7505+
"#define MACRO2 (0)\n"
7506+
"#endif\n"
7507+
"#define MACRO_ALL (MACRO1 | MACRO2)\n"
7508+
"void f() {\n"
7509+
" if (MACRO_ALL == 0) {}\n"
7510+
"}\n");
7511+
ASSERT_EQUALS("", errout_str());
7512+
}
7513+
74957514
void duplicateExpressionLoop() {
74967515
check("void f() {\n"
74977516
" int a = 1;\n"

0 commit comments

Comments
 (0)