parent
e8de2aeeea
commit
78c7e3351f
|
@ -1326,7 +1326,9 @@ void CheckStl::negativeIndexError(const Token *tok, const ValueFlow::Value &inde
|
||||||
<< ", otherwise there is negative array index " << index.intvalue << ".";
|
<< ", otherwise there is negative array index " << index.intvalue << ".";
|
||||||
else
|
else
|
||||||
errmsg << "Array index " << index.intvalue << " is out of bounds.";
|
errmsg << "Array index " << index.intvalue << " is out of bounds.";
|
||||||
reportError(errorPath, index.errorSeverity() ? Severity::error : Severity::warning, "negativeContainerIndex", errmsg.str(), CWE786, index.isInconclusive() ? Certainty::inconclusive : Certainty::normal);
|
const auto severity = index.errorSeverity() && index.isKnown() ? Severity::error : Severity::warning;
|
||||||
|
const auto certainty = index.isInconclusive() ? Certainty::inconclusive : Certainty::normal;
|
||||||
|
reportError(errorPath, severity, "negativeContainerIndex", errmsg.str(), CWE786, certainty);
|
||||||
}
|
}
|
||||||
|
|
||||||
void CheckStl::erase()
|
void CheckStl::erase()
|
||||||
|
|
|
@ -7217,7 +7217,7 @@ struct MultiValueFlowAnalyzer : ValueFlowAnalyzer {
|
||||||
|
|
||||||
void addErrorPath(const Token* tok, const std::string& s) override {
|
void addErrorPath(const Token* tok, const std::string& s) override {
|
||||||
for (auto&& p:values) {
|
for (auto&& p:values) {
|
||||||
p.second.errorPath.emplace_back(tok, "Assuming condition is " + s);
|
p.second.errorPath.emplace_back(tok, s);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -82,6 +82,7 @@ private:
|
||||||
TEST_CASE(STLSize);
|
TEST_CASE(STLSize);
|
||||||
TEST_CASE(STLSizeNoErr);
|
TEST_CASE(STLSizeNoErr);
|
||||||
TEST_CASE(negativeIndex);
|
TEST_CASE(negativeIndex);
|
||||||
|
TEST_CASE(negativeIndexMultiline);
|
||||||
TEST_CASE(erase1);
|
TEST_CASE(erase1);
|
||||||
TEST_CASE(erase2);
|
TEST_CASE(erase2);
|
||||||
TEST_CASE(erase3);
|
TEST_CASE(erase3);
|
||||||
|
@ -2324,7 +2325,28 @@ private:
|
||||||
settings = oldSettings;
|
settings = oldSettings;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void negativeIndexMultiline() {
|
||||||
|
setMultiline();
|
||||||
|
const auto oldSettings = settings;
|
||||||
|
settings.verbose = true;
|
||||||
|
|
||||||
|
check("bool valid(int);\n" // #11697
|
||||||
|
"void f(int i, const std::vector<int>& v) {\n"
|
||||||
|
" if (!valid(i))\n"
|
||||||
|
" return;\n"
|
||||||
|
" if (v[i]) {}\n"
|
||||||
|
"}\n"
|
||||||
|
"void g(const std::vector<int>& w) {\n"
|
||||||
|
" f(-1, w);\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("test.cpp:5:warning:Array index -1 is out of bounds.\n"
|
||||||
|
"test.cpp:8:note:Calling function 'f', 1st argument '-1' value is -1\n"
|
||||||
|
"test.cpp:3:note:Assuming condition is false\n"
|
||||||
|
"test.cpp:5:note:Negative array index\n",
|
||||||
|
errout.str());
|
||||||
|
|
||||||
|
settings = oldSettings;
|
||||||
|
}
|
||||||
|
|
||||||
void erase1() {
|
void erase1() {
|
||||||
check("void f()\n"
|
check("void f()\n"
|
||||||
|
|
Loading…
Reference in New Issue