@@ -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
724726void 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// ---------------------------------------------------------------------------
0 commit comments