Skip to content

Commit 13bc2fa

Browse files
committed
Allow possible values
1 parent 31b88ba commit 13bc2fa

2 files changed

Lines changed: 15 additions & 3 deletions

File tree

lib/checkbufferoverrun.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ static const ValueFlow::Value *getBufferSizeValue(const Token *tok)
6969
if (it != tokenValues.cend())
7070
return &*it;
7171
it = std::find_if(tokenValues.cbegin(), tokenValues.cend(), [](const ValueFlow::Value& v) {
72-
return v.isContainerSizeValue() && v.isKnown();
72+
return v.isContainerSizeValue() && !v.isImpossible();
7373
});
7474
return it == tokenValues.cend() ? nullptr : &*it;
7575
}
@@ -589,7 +589,9 @@ ValueFlow::Value CheckBufferOverrunImpl::getBufferSize(const Token *bufTok, cons
589589
if (elementSize > 0) {
590590
ValueFlow::Value bufSizeVal;
591591
bufSizeVal.valueType = ValueFlow::Value::ValueType::BUFFER_SIZE;
592-
bufSizeVal.intvalue = value->intvalue * elementSize;
592+
bufSizeVal.intvalue = value->intvalue * elementSize;
593+
bufSizeVal.valueKind = value->valueKind;
594+
bufSizeVal.errorPath = value->errorPath;
593595
return bufSizeVal;
594596
}
595597
}
@@ -723,7 +725,10 @@ void CheckBufferOverrunImpl::bufferOverflow()
723725

724726
void CheckBufferOverrunImpl::bufferOverflowError(const Token *tok, const ValueFlow::Value *value, Certainty certainty)
725727
{
726-
reportError(getErrorPath(tok, value, "Buffer overrun"), Severity::error, "bufferAccessOutOfBounds", "Buffer is accessed out of bounds: " + (tok ? getRealBufferTok(tok)->expressionString() : "buf"), CWE_BUFFER_OVERRUN, certainty);
728+
const auto errorPath = getErrorPath(tok, value, "Buffer overrun");
729+
const auto severity = !value || value->isKnown() ? Severity::error : Severity::warning;
730+
const std::string msg = "Buffer is accessed out of bounds: " + (tok ? getRealBufferTok(tok)->expressionString() : "buf");
731+
reportError(errorPath, severity, "bufferAccessOutOfBounds", msg, CWE_BUFFER_OVERRUN, certainty);
727732
}
728733

729734
//---------------------------------------------------------------------------

test/testbufferoverrun.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3572,6 +3572,13 @@ class TestBufferOverrun : public TestFixture {
35723572
" std::memcpy(&u, &s[0], sizeof(u));\n"
35733573
"}\n");
35743574
ASSERT_EQUALS("", errout_str());
3575+
3576+
check("void f(const std::vector<uint8_t>& s) {\n"
3577+
" if (s.size() == 2) {}\n"
3578+
" uint32_t u = 0;\n"
3579+
" std::memcpy(&u, &s[0], sizeof(u));\n"
3580+
"}\n");
3581+
ASSERT_EQUALS("[test.cpp:4:21]: (warning) Buffer is accessed out of bounds: &s[0] [bufferAccessOutOfBounds]\n", errout_str());
35753582
}
35763583

35773584
void buffer_overrun_errorpath() {

0 commit comments

Comments
 (0)