From 2d38d87ec2f623db376cec09f1aefe5d5fd72ee4 Mon Sep 17 00:00:00 2001 From: chrchr Date: Mon, 11 Apr 2022 17:28:44 +0200 Subject: [PATCH 1/4] Fix FP divideSizeof --- lib/checksizeof.cpp | 4 +++- test/testsizeof.cpp | 10 ++++++++++ 2 files changed, 13 insertions(+), 1 deletion(-) diff --git a/lib/checksizeof.cpp b/lib/checksizeof.cpp index ed9e8099f37..8236103f8cd 100644 --- a/lib/checksizeof.cpp +++ b/lib/checksizeof.cpp @@ -387,7 +387,9 @@ void CheckSizeof::suspiciousSizeofCalculation() divideSizeofError(tok); else if (varTok && varTok->str() == "*") { const Token* arrTok = lPar->astParent()->astOperand1(); - arrTok = arrTok ? arrTok->next() : nullptr; + arrTok = arrTok ? arrTok->astOperand2() : nullptr; + while (Token::Match(arrTok, ".|[")) + arrTok = arrTok->astOperand2(); var = arrTok ? arrTok->variable() : nullptr; if (var && var->isPointer() && !var->isArray()) divideSizeofError(tok); diff --git a/test/testsizeof.cpp b/test/testsizeof.cpp index 4f4602439f6..c08ca8a7098 100644 --- a/test/testsizeof.cpp +++ b/test/testsizeof.cpp @@ -456,6 +456,16 @@ class TestSizeof : public TestFixture { " for (size_t i = 0; i < sizeof(t->s) / sizeof(t->s[0]); i++) {}\n" "}\n"); ASSERT_EQUALS("", errout.str()); + + check("struct S {\n" + " struct T {\n" + " char* c[3];\n" + " } t[1];\n" + "};\n" + "void f(S* s) {\n" + " for (int i = 0; i != sizeof(s->t[0].c) / sizeof(char*); i++) {}\n" + "}\n"); + ASSERT_EQUALS("", errout.str()); } void checkPointerSizeof() { From 267f0f75a5f8da0bff6fb3e2da9ef697f56ece42 Mon Sep 17 00:00:00 2001 From: chrchr Date: Mon, 11 Apr 2022 17:36:37 +0200 Subject: [PATCH 2/4] Format --- test/testsizeof.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/test/testsizeof.cpp b/test/testsizeof.cpp index c08ca8a7098..d52380b4e9e 100644 --- a/test/testsizeof.cpp +++ b/test/testsizeof.cpp @@ -458,13 +458,13 @@ class TestSizeof : public TestFixture { ASSERT_EQUALS("", errout.str()); check("struct S {\n" - " struct T {\n" - " char* c[3];\n" - " } t[1];\n" - "};\n" - "void f(S* s) {\n" - " for (int i = 0; i != sizeof(s->t[0].c) / sizeof(char*); i++) {}\n" - "}\n"); + " struct T {\n" + " char* c[3];\n" + " } t[1];\n" + "};\n" + "void f(S* s) {\n" + " for (int i = 0; i != sizeof(s->t[0].c) / sizeof(char*); i++) {}\n" + "}\n"); ASSERT_EQUALS("", errout.str()); } From b0700e664469a9eb3d8ffda71e21b3a0b86b45f7 Mon Sep 17 00:00:00 2001 From: chrchr Date: Mon, 11 Apr 2022 17:41:46 +0200 Subject: [PATCH 3/4] Undo --- lib/checksizeof.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checksizeof.cpp b/lib/checksizeof.cpp index 8236103f8cd..6c6aeb480e3 100644 --- a/lib/checksizeof.cpp +++ b/lib/checksizeof.cpp @@ -388,7 +388,7 @@ void CheckSizeof::suspiciousSizeofCalculation() else if (varTok && varTok->str() == "*") { const Token* arrTok = lPar->astParent()->astOperand1(); arrTok = arrTok ? arrTok->astOperand2() : nullptr; - while (Token::Match(arrTok, ".|[")) + while (Token::Match(arrTok, ".")) arrTok = arrTok->astOperand2(); var = arrTok ? arrTok->variable() : nullptr; if (var && var->isPointer() && !var->isArray()) From b312427a194ebf562e706f890f0fd1deeed4d8b0 Mon Sep 17 00:00:00 2001 From: chrchr Date: Mon, 11 Apr 2022 18:35:16 +0200 Subject: [PATCH 4/4] simpleMatch --- lib/checksizeof.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/checksizeof.cpp b/lib/checksizeof.cpp index 6c6aeb480e3..daa08ee62f6 100644 --- a/lib/checksizeof.cpp +++ b/lib/checksizeof.cpp @@ -388,7 +388,7 @@ void CheckSizeof::suspiciousSizeofCalculation() else if (varTok && varTok->str() == "*") { const Token* arrTok = lPar->astParent()->astOperand1(); arrTok = arrTok ? arrTok->astOperand2() : nullptr; - while (Token::Match(arrTok, ".")) + while (Token::simpleMatch(arrTok, ".")) arrTok = arrTok->astOperand2(); var = arrTok ? arrTok->variable() : nullptr; if (var && var->isPointer() && !var->isArray())