Fix another FP divideSizeof (#4009)
* Fix FP divideSizeof * Format * Undo * simpleMatch * Fix another FP divideSizeof
This commit is contained in:
parent
32978933b5
commit
ea65fe2b63
|
@ -378,22 +378,16 @@ void CheckSizeof::suspiciousSizeofCalculation()
|
|||
const Token* lPar = tok->astParent();
|
||||
if (lPar && lPar->str() == "(") {
|
||||
const Token* const rPar = lPar->link();
|
||||
const Token* varTok = rPar->previous();
|
||||
while (varTok && varTok->str() == "]")
|
||||
varTok = varTok->link()->previous();
|
||||
const Token* varTok = lPar->astOperand2();
|
||||
int derefCount = 0;
|
||||
while (Token::Match(varTok, "[|*")) {
|
||||
++derefCount;
|
||||
varTok = varTok->astOperand1();
|
||||
}
|
||||
if (lPar->astParent() && lPar->astParent()->str() == "/") {
|
||||
const Variable* var = varTok ? varTok->variable() : nullptr;
|
||||
if (var && var->isPointer() && !var->isArray() && !(lPar->astOperand2() && lPar->astOperand2()->str() == "*"))
|
||||
if (var && var->isPointer() && !var->isArray() && !(var->valueType() && var->valueType()->pointer <= derefCount))
|
||||
divideSizeofError(tok);
|
||||
else if (varTok && varTok->str() == "*") {
|
||||
const Token* arrTok = lPar->astParent()->astOperand1();
|
||||
arrTok = arrTok ? arrTok->astOperand2() : nullptr;
|
||||
while (Token::simpleMatch(arrTok, "."))
|
||||
arrTok = arrTok->astOperand2();
|
||||
var = arrTok ? arrTok->variable() : nullptr;
|
||||
if (var && var->isPointer() && !var->isArray())
|
||||
divideSizeofError(tok);
|
||||
}
|
||||
}
|
||||
else if (Token::simpleMatch(rPar, ") * sizeof") && rPar->next()->astOperand1() == tok->next())
|
||||
multiplySizeofError(tok);
|
||||
|
|
|
@ -440,11 +440,10 @@ private:
|
|||
"}\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("int f(const S& s) {\n"
|
||||
" int** p;\n"
|
||||
check("int f(int** p) {\n"
|
||||
" return sizeof(p[0]) / 4;\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS("[test.cpp:3]: (warning, inconclusive) Division of result of sizeof() on pointer type.\n", errout.str());
|
||||
ASSERT_EQUALS("[test.cpp:2]: (warning, inconclusive) Division of result of sizeof() on pointer type.\n", errout.str());
|
||||
|
||||
check("struct S {\n"
|
||||
" unsigned char* s;\n"
|
||||
|
@ -466,6 +465,17 @@ private:
|
|||
" for (int i = 0; i != sizeof(s->t[0].c) / sizeof(char*); i++) {}\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("void f(int32_t* buf, size_t len) {\n"
|
||||
" for (int i = 0; i < len / sizeof(buf[0]); i++) {}\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
|
||||
check("void f(int32_t*** buf, size_t len) {\n"
|
||||
" for (int i = 0; i < len / sizeof(**buf[0]); i++) {}\n"
|
||||
" for (int i = 0; i < len / sizeof(*buf[0][0]); i++) {}\n"
|
||||
"}\n");
|
||||
ASSERT_EQUALS("", errout.str());
|
||||
}
|
||||
|
||||
void checkPointerSizeof() {
|
||||
|
|
Loading…
Reference in New Issue