Added 2 checks for memory leaks

This commit is contained in:
Daniel Marjamäki 2007-07-27 08:11:07 +00:00
parent 639d5fe344
commit 2b3f362dfd
6 changed files with 53 additions and 15 deletions

View File

@ -26,6 +26,7 @@ struct _variable
int indentlevel; int indentlevel;
unsigned int varindex; unsigned int varindex;
enum {Any, Data, Malloc, New, NewA} value; enum {Any, Data, Malloc, New, NewA} value;
int dealloc_level;
}; };
//--------------------------------------------------------------------------- //---------------------------------------------------------------------------
@ -82,10 +83,15 @@ static void _InFunction()
{ {
for (unsigned int i = 0; i < varlist.size(); i++) for (unsigned int i = 0; i < varlist.size(); i++)
{ {
if (varlist[i]->indentlevel != indentlevel) struct _variable *var = varlist[i];
if (var->dealloc_level == indentlevel)
var->dealloc_level = 0;
if (var->indentlevel != indentlevel)
continue; continue;
if (varlist[i]->value == _variable::Malloc || varlist[i]->value == _variable::New || varlist[i]->value == _variable::NewA) if (var->value == _variable::Malloc || var->value == _variable::New || var->value == _variable::NewA)
{ {
std::ostringstream ostr; std::ostringstream ostr;
ostr << FileLine(it->Token) << ": Memory leak:" << VariableNames[varlist[i]->varindex]; ostr << FileLine(it->Token) << ": Memory leak:" << VariableNames[varlist[i]->varindex];
@ -199,20 +205,20 @@ static void _InFunction()
if ( it->Type == STATEMENT::MALLOC ) if ( it->Type == STATEMENT::MALLOC )
varlist[i]->value = _variable::Malloc; varlist[i]->value = _variable::Malloc;
else if ( it->Type == STATEMENT::FREE )
varlist[i]->value = _variable::Any;
else if ( it->Type == STATEMENT::NEW ) else if ( it->Type == STATEMENT::NEW )
varlist[i]->value = _variable::New; varlist[i]->value = _variable::New;
else if ( it->Type == STATEMENT::NEWARRAY ) else if ( it->Type == STATEMENT::NEWARRAY )
varlist[i]->value = _variable::NewA; varlist[i]->value = _variable::NewA;
else if ( it->Type == STATEMENT::DELETE ) else
varlist[i]->value = _variable::Any; {
// Deallocation...
else if ( it->Type == STATEMENT::DELETEARRAY ) if (indentlevel > varlist[i]->indentlevel)
varlist[i]->value = _variable::Any; varlist[i]->dealloc_level = indentlevel;
else
varlist[i]->value = _variable::Any;
}
break; break;
} }
@ -234,18 +240,21 @@ static void _InFunction()
case STATEMENT::RETURN: case STATEMENT::RETURN:
for (unsigned int i = 0; i < varlist.size(); i++) for (unsigned int i = 0; i < varlist.size(); i++)
{ {
if ( varlist[i]->varindex == it->VarIndex ) struct _variable *var = varlist[i];
if ( var->varindex == it->VarIndex )
{ {
varlist[i]->value = _variable::Any; var->value = _variable::Any;
} }
else if (varlist[i]->value==_variable::New || else if (var->value==_variable::New ||
varlist[i]->value==_variable::NewA ) var->value==_variable::NewA ||
var->value==_variable::Malloc )
{ {
std::ostringstream ostr; std::ostringstream ostr;
ostr << FileLine(it->Token) << ": Memory leak:" << VariableNames[varlist[i]->varindex]; ostr << FileLine(it->Token) << ": Memory leak:" << VariableNames[varlist[i]->varindex];
ReportErr(ostr.str()); ReportErr(ostr.str());
varlist[i]->value = _variable::Any; var->value = _variable::Any;
break; break;
} }
} }

View File

@ -278,6 +278,9 @@ void CreateStatementList()
if (parlevel==0 && strchr("{};", tok2->str[0])) if (parlevel==0 && strchr("{};", tok2->str[0]))
break; break;
if (match(tok2,"free ( var )"))
break;
if (tok2->str[0] == '(') if (tok2->str[0] == '(')
parlevel++; parlevel++;
if (tok2->str[0] == ')') if (tok2->str[0] == ')')

1
testmemleak2/err.msg Normal file
View File

@ -0,0 +1 @@
[testmemleak2\testmemleak2.cpp:8]: Memory leak:str

View File

@ -0,0 +1,12 @@
bool f()
{
char *str = strdup("hello");
if (a==b)
{
return false;
}
free(str);
return true;
}

1
testmemleak3/err.msg Normal file
View File

@ -0,0 +1 @@
[testmemleak3\testmemleak3.cpp:9]: Memory leak:str

View File

@ -0,0 +1,12 @@
bool f()
{
char *str = strdup("hello");
if (a==b)
{
free(str);
return false;
}
return true;
}