Skip to content

Commit 0ca410a

Browse files
committed
Fixed cppcheck-opensource#6668 (False positive bufferAccessOutOfBounds on sprintf() - regression)
1 parent c18461b commit 0ca410a

2 files changed

Lines changed: 13 additions & 0 deletions

File tree

lib/checkbufferoverrun.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -361,6 +361,10 @@ void CheckBufferOverrun::checkFunctionParameter(const Token &ftok, unsigned int
361361
for (std::size_t i = 0; i < arrayInfo.num().size(); ++i)
362362
arraySize *= arrayInfo.num(i);
363363

364+
// dimension is 0 or unknown => bailout
365+
if (arraySize == 0)
366+
return;
367+
364368
const Token *charSizeToken = nullptr;
365369
if (checkMinSizes(*minsizes, &ftok, (std::size_t)arraySize, &charSizeToken, _settings))
366370
bufferOverrunError(callstack, arrayInfo.varname());

test/testbufferoverrun.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3261,6 +3261,15 @@ class TestBufferOverrun : public TestFixture {
32613261
" mysprintf(x.a, \"aa\");\n"
32623262
"}", settings);
32633263
ASSERT_EQUALS("", errout.str());
3264+
3265+
check("struct Foo {\n" // #6668 - unknown size
3266+
" char a[LEN];\n"
3267+
" void f();\n"
3268+
"};"
3269+
"void Foo::f() {\n"
3270+
" mysprintf(a, \"abcd\");\n"
3271+
"}", settings);
3272+
ASSERT_EQUALS("", errout.str());
32643273
}
32653274

32663275
void minsize_mul() {

0 commit comments

Comments
 (0)