diff --git a/lib/valueflow.cpp b/lib/valueflow.cpp index 5efe698bf61..7acf7179723 100644 --- a/lib/valueflow.cpp +++ b/lib/valueflow.cpp @@ -7025,6 +7025,12 @@ static void valueFlowDynamicBufferSize(const TokenList& tokenlist, const SymbolD auto getBufferSizeFromNew = [&](const Token* newTok) -> MathLib::bigint { MathLib::bigint sizeValue = -1, numElem = -1; + // ::operator new(size_t size) + if (Token::Match(newTok->astOperand1(), "::| operatornew")) { + const Token *sizeTok = newTok->astOperand2(); + return sizeTok->hasKnownIntValue() ? sizeTok->getKnownIntValue() : -1; + } + if (newTok && newTok->astOperand1()) { // number of elements const Token* bracTok = nullptr, *typeTok = nullptr; if (newTok->astOperand1()->str() == "[") @@ -7071,7 +7077,7 @@ static void valueFlowDynamicBufferSize(const TokenList& tokenlist, const SymbolD if (!rhs) continue; - const bool isNew = rhs->isCpp() && rhs->str() == "new"; + const bool isNew = rhs->isCpp() && (rhs->str() == "new" || Token::Match(rhs->astOperand1(), "::| operatornew")); if (!isNew && !Token::Match(rhs->previous(), "%name% (")) continue; diff --git a/test/testvalueflow.cpp b/test/testvalueflow.cpp index 4fc47f63d86..39916ddeb43 100644 --- a/test/testvalueflow.cpp +++ b/test/testvalueflow.cpp @@ -7932,6 +7932,13 @@ class TestValueFlow : public TestFixture { " return x;\n" "}"; ASSERT_EQUALS(true, testValueOfX(code, 4U, 4, ValueFlow::Value::ValueType::BUFFER_SIZE, &settingsCfg)); + + code = "void f()\n" + "{\n" + " void *x = ::operator new(0);\n" + " (void) x;\n" + "}\n"; + ASSERT_EQUALS(true, testValueOfX(code, 4U, 0, ValueFlow::Value::ValueType::BUFFER_SIZE)); } void valueFlowSafeFunctionParameterValues() {