* Fix #5140 FN (error) buffer access out of bounds - known argument const char* argv[] * Format
This commit is contained in:
parent
b815153b0c
commit
7156afe003
|
@ -358,7 +358,7 @@ CTU::FileInfo *CTU::getFileInfo(const Tokenizer *tokenizer)
|
||||||
fileInfo->functionCalls.push_back(functionCall);
|
fileInfo->functionCalls.push_back(functionCall);
|
||||||
}
|
}
|
||||||
// array
|
// array
|
||||||
if (argtok->variable() && argtok->variable()->isArray() && argtok->variable()->dimensions().size()==1 && argtok->variable()->dimension(0)>1) {
|
if (argtok->variable() && argtok->variable()->isArray() && argtok->variable()->dimensions().size() == 1) {
|
||||||
FileInfo::FunctionCall functionCall;
|
FileInfo::FunctionCall functionCall;
|
||||||
functionCall.callValueType = ValueFlow::Value::ValueType::BUFFER_SIZE;
|
functionCall.callValueType = ValueFlow::Value::ValueType::BUFFER_SIZE;
|
||||||
functionCall.callId = getFunctionId(tokenizer, tokFunction);
|
functionCall.callId = getFunctionId(tokenizer, tokFunction);
|
||||||
|
|
|
@ -3153,7 +3153,7 @@ void Tokenizer::arraySize()
|
||||||
if (!tok->isName() || !Token::Match(tok, "%var% [ ] ="))
|
if (!tok->isName() || !Token::Match(tok, "%var% [ ] ="))
|
||||||
continue;
|
continue;
|
||||||
bool addlength = false;
|
bool addlength = false;
|
||||||
if (Token::Match(tok, "%var% [ ] = { %str% } ;")) {
|
if (Token::Match(tok->previous(), "!!* %var% [ ] = { %str% } ;")) {
|
||||||
Token *t = tok->tokAt(3);
|
Token *t = tok->tokAt(3);
|
||||||
t->deleteNext();
|
t->deleteNext();
|
||||||
t->next()->deleteNext();
|
t->next()->deleteNext();
|
||||||
|
|
|
@ -5118,6 +5118,23 @@ private:
|
||||||
ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:1]: (error) Array index out of bounds; 's' buffer size is 2 and it is accessed at offset 2.\n"
|
ASSERT_EQUALS("[test.cpp:5] -> [test.cpp:1]: (error) Array index out of bounds; 's' buffer size is 2 and it is accessed at offset 2.\n"
|
||||||
"[test.cpp:6] -> [test.cpp:2]: (error) Array index out of bounds; 's' buffer size is 2 and it is accessed at offset 2.\n",
|
"[test.cpp:6] -> [test.cpp:2]: (error) Array index out of bounds; 's' buffer size is 2 and it is accessed at offset 2.\n",
|
||||||
errout.str());
|
errout.str());
|
||||||
|
|
||||||
|
// #5140
|
||||||
|
ctu("void g(const char* argv[]) { std::cout << \"argv: \" << argv[4] << std::endl; }\n"
|
||||||
|
"void f() {\n"
|
||||||
|
" const char* argv[] = { \"test\" };\n"
|
||||||
|
" g(argv);\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:1]: (error) Array index out of bounds; 'argv' buffer size is 1 and it is accessed at offset 4.\n",
|
||||||
|
errout.str());
|
||||||
|
|
||||||
|
ctu("void g(const char* argv[]) { std::cout << \"argv: \" << argv[5] << std::endl; }\n"
|
||||||
|
"void f() {\n"
|
||||||
|
" const char* argv[1] = { \"test\" };\n"
|
||||||
|
" g(argv);\n"
|
||||||
|
"}\n");
|
||||||
|
ASSERT_EQUALS("[test.cpp:4] -> [test.cpp:1]: (error) Array index out of bounds; 'argv' buffer size is 1 and it is accessed at offset 5.\n",
|
||||||
|
errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
void ctu_variable() {
|
void ctu_variable() {
|
||||||
|
|
|
@ -126,6 +126,7 @@ private:
|
||||||
settings2.checkUnusedTemplates = true;
|
settings2.checkUnusedTemplates = true;
|
||||||
|
|
||||||
TEST_CASE(array);
|
TEST_CASE(array);
|
||||||
|
TEST_CASE(array_ptr);
|
||||||
TEST_CASE(stlarray1);
|
TEST_CASE(stlarray1);
|
||||||
TEST_CASE(stlarray2);
|
TEST_CASE(stlarray2);
|
||||||
|
|
||||||
|
@ -511,6 +512,29 @@ private:
|
||||||
ASSERT_EQUALS(12U, v->dimension(0));
|
ASSERT_EQUALS(12U, v->dimension(0));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void array_ptr() {
|
||||||
|
GET_SYMBOL_DB("const char* a[] = { \"abc\" };\n"
|
||||||
|
"const char* b[] = { \"def\", \"ghijkl\" };");
|
||||||
|
ASSERT(db != nullptr);
|
||||||
|
|
||||||
|
ASSERT(db->variableList().size() == 3); // the first one is not used
|
||||||
|
const Variable* v = db->getVariableFromVarId(1);
|
||||||
|
ASSERT(v != nullptr);
|
||||||
|
|
||||||
|
ASSERT(v->isArray());
|
||||||
|
ASSERT(v->isPointerArray());
|
||||||
|
ASSERT_EQUALS(1U, v->dimensions().size());
|
||||||
|
ASSERT_EQUALS(1U, v->dimension(0));
|
||||||
|
|
||||||
|
v = db->getVariableFromVarId(2);
|
||||||
|
ASSERT(v != nullptr);
|
||||||
|
|
||||||
|
ASSERT(v->isArray());
|
||||||
|
ASSERT(v->isPointerArray());
|
||||||
|
ASSERT_EQUALS(1U, v->dimensions().size());
|
||||||
|
ASSERT_EQUALS(2U, v->dimension(0));
|
||||||
|
}
|
||||||
|
|
||||||
void stlarray1() {
|
void stlarray1() {
|
||||||
GET_SYMBOL_DB("std::array<int, 16 + 4> arr;");
|
GET_SYMBOL_DB("std::array<int, 16 + 4> arr;");
|
||||||
ASSERT(db != nullptr);
|
ASSERT(db != nullptr);
|
||||||
|
|
Loading…
Reference in New Issue