Merge pull request #2703 from rikardfalkeborn/9652-fp-function-call-cast-config
Fix #9652 (fp memleak with function call with cast)
This commit is contained in:
commit
0c6aabe444
|
@ -856,7 +856,8 @@ void CheckLeakAutoVar::functionCall(const Token *tokName, const Token *tokOpenin
|
||||||
}
|
}
|
||||||
|
|
||||||
int argNr = 1;
|
int argNr = 1;
|
||||||
for (const Token *arg = tokFirstArg; arg; arg = arg->nextArgument()) {
|
for (const Token *funcArg = tokFirstArg; funcArg; funcArg = funcArg->nextArgument()) {
|
||||||
|
const Token* arg = funcArg;
|
||||||
if (mTokenizer->isCPP() && arg->str() == "new") {
|
if (mTokenizer->isCPP() && arg->str() == "new") {
|
||||||
arg = arg->next();
|
arg = arg->next();
|
||||||
if (Token::simpleMatch(arg, "( std :: nothrow )"))
|
if (Token::simpleMatch(arg, "( std :: nothrow )"))
|
||||||
|
|
|
@ -184,6 +184,8 @@ private:
|
||||||
TEST_CASE(smartPtrInContainer); // #8262
|
TEST_CASE(smartPtrInContainer); // #8262
|
||||||
|
|
||||||
TEST_CASE(recursiveCountLimit); // #5872 #6157 #9097
|
TEST_CASE(recursiveCountLimit); // #5872 #6157 #9097
|
||||||
|
|
||||||
|
TEST_CASE(functionCallCastConfig); // #9652
|
||||||
}
|
}
|
||||||
|
|
||||||
void check(const char code[], bool cpp = false) {
|
void check(const char code[], bool cpp = false) {
|
||||||
|
@ -202,6 +204,22 @@ private:
|
||||||
c.runChecks(&tokenizer, &settings, this);
|
c.runChecks(&tokenizer, &settings, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void check(const char code[], Settings & settings) {
|
||||||
|
// Clear the error buffer..
|
||||||
|
errout.str("");
|
||||||
|
|
||||||
|
// Tokenize..
|
||||||
|
Tokenizer tokenizer(&settings, this);
|
||||||
|
std::istringstream istr(code);
|
||||||
|
tokenizer.tokenize(istr, "test.cpp");
|
||||||
|
|
||||||
|
// Check for leaks..
|
||||||
|
CheckLeakAutoVar c;
|
||||||
|
settings.checkLibrary = true;
|
||||||
|
settings.addEnabled("information");
|
||||||
|
c.runChecks(&tokenizer, &settings, this);
|
||||||
|
}
|
||||||
|
|
||||||
void checkP(const char code[], bool cpp = false) {
|
void checkP(const char code[], bool cpp = false) {
|
||||||
// Clear the error buffer..
|
// Clear the error buffer..
|
||||||
errout.str("");
|
errout.str("");
|
||||||
|
@ -2023,6 +2041,31 @@ private:
|
||||||
"}"));
|
"}"));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void functionCallCastConfig() { // #9652
|
||||||
|
Settings settingsFunctionCall = settings;
|
||||||
|
|
||||||
|
const char xmldata[] = "<?xml version=\"1.0\"?>\n"
|
||||||
|
"<def format=\"2\">\n"
|
||||||
|
" <function name=\"free_func\">\n"
|
||||||
|
" <noreturn>false</noreturn>\n"
|
||||||
|
" <arg nr=\"1\">\n"
|
||||||
|
" <not-uninit/>\n"
|
||||||
|
" </arg>\n"
|
||||||
|
" <arg nr=\"2\">\n"
|
||||||
|
" <not-uninit/>\n"
|
||||||
|
" </arg>\n"
|
||||||
|
" </function>\n"
|
||||||
|
"</def>";
|
||||||
|
tinyxml2::XMLDocument doc;
|
||||||
|
doc.Parse(xmldata, sizeof(xmldata));
|
||||||
|
settingsFunctionCall.library.load(doc);
|
||||||
|
check("void test_func()\n"
|
||||||
|
"{\n"
|
||||||
|
" char * buf = malloc(4);\n"
|
||||||
|
" free_func((void *)(1), buf);\n"
|
||||||
|
"}", settingsFunctionCall);
|
||||||
|
ASSERT_EQUALS("[test.cpp:5]: (information) --check-library: Function free_func() should have <use>/<leak-ignore> configuration\n", errout.str());
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
REGISTER_TEST(TestLeakAutoVar)
|
REGISTER_TEST(TestLeakAutoVar)
|
||||||
|
|
Loading…
Reference in New Issue