Bug fixing
This commit is contained in:
parent
d3366b0267
commit
8a3b14aeec
48
main.cpp
48
main.cpp
|
@ -1,4 +1,7 @@
|
||||||
|
|
||||||
|
|
||||||
|
// Todo: Output progress? Using commandline option "--progress"?
|
||||||
|
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
@ -82,6 +85,7 @@ static void CppCheck(const char FileName[])
|
||||||
Files.clear();
|
Files.clear();
|
||||||
Tokenize(FileName);
|
Tokenize(FileName);
|
||||||
|
|
||||||
|
|
||||||
CreateStatementList();
|
CreateStatementList();
|
||||||
|
|
||||||
|
|
||||||
|
@ -168,7 +172,7 @@ void combine_2tokens(TOKEN *tok, const char str1[], const char str2[])
|
||||||
|
|
||||||
free(tok->str);
|
free(tok->str);
|
||||||
free(tok->next->str);
|
free(tok->next->str);
|
||||||
tok->str = static_cast<char *>(malloc(strlen(str1)+strlen(str2)+1));
|
tok->str = (char *)malloc(strlen(str1)+strlen(str2)+1);
|
||||||
strcpy(tok->str, str1);
|
strcpy(tok->str, str1);
|
||||||
strcat(tok->str, str2);
|
strcat(tok->str, str2);
|
||||||
|
|
||||||
|
@ -195,7 +199,7 @@ void Tokenize(const char FileName[])
|
||||||
Files.push_back(FileName);
|
Files.push_back(FileName);
|
||||||
|
|
||||||
unsigned int lineno = 1;
|
unsigned int lineno = 1;
|
||||||
char CurrentToken[100];
|
char CurrentToken[1000];
|
||||||
memset(CurrentToken, 0, sizeof(CurrentToken));
|
memset(CurrentToken, 0, sizeof(CurrentToken));
|
||||||
char *pToken = CurrentToken;
|
char *pToken = CurrentToken;
|
||||||
for (char ch = (char)fin.get(); !fin.eof(); ch = (char)fin.get())
|
for (char ch = (char)fin.get(); !fin.eof(); ch = (char)fin.get())
|
||||||
|
@ -725,7 +729,7 @@ void CreateStatementList()
|
||||||
for (it = Statements.begin(); it != Statements.end(); it++)
|
for (it = Statements.begin(); it != Statements.end(); it++)
|
||||||
{
|
{
|
||||||
STATEMENT s = *it;
|
STATEMENT s = *it;
|
||||||
//std::cout << it->Token->linenr << " : ";
|
std::cout << it->Token->linenr << " : ";
|
||||||
switch (s.Type)
|
switch (s.Type)
|
||||||
{
|
{
|
||||||
case STATEMENT::OBRACE:
|
case STATEMENT::OBRACE:
|
||||||
|
@ -1008,15 +1012,15 @@ void CheckMemoryLeak()
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
// This is highly inaccurate at the moment
|
// This is highly inaccurate at the moment
|
||||||
if (Debug)
|
//if (Debug)
|
||||||
{
|
//{
|
||||||
if (varlist[i]->value == _variable::New || varlist[i]->value == _variable::NewA)
|
// if (varlist[i]->value == _variable::New || varlist[i]->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];
|
||||||
ReportErr(ostr.str());
|
// ReportErr(ostr.str());
|
||||||
}
|
// }
|
||||||
}
|
//}
|
||||||
|
|
||||||
// Delete this instance..
|
// Delete this instance..
|
||||||
delete varlist[i];
|
delete varlist[i];
|
||||||
|
@ -1030,6 +1034,7 @@ void CheckMemoryLeak()
|
||||||
if (indentlevel > 0)
|
if (indentlevel > 0)
|
||||||
{
|
{
|
||||||
_variable *NewVar = new _variable;
|
_variable *NewVar = new _variable;
|
||||||
|
memset(NewVar, 0, sizeof(_variable));
|
||||||
NewVar->indentlevel = indentlevel;
|
NewVar->indentlevel = indentlevel;
|
||||||
NewVar->varindex = it->VarIndex;
|
NewVar->varindex = it->VarIndex;
|
||||||
varlist.push_back(NewVar);
|
varlist.push_back(NewVar);
|
||||||
|
@ -1056,10 +1061,13 @@ void CheckMemoryLeak()
|
||||||
bool a1 = (varlist[i]->value == _variable::NewA);
|
bool a1 = (varlist[i]->value == _variable::NewA);
|
||||||
bool a2 = (it->Type == STATEMENT::DELETEARRAY);
|
bool a2 = (it->Type == STATEMENT::DELETEARRAY);
|
||||||
|
|
||||||
if (a1 != a2)
|
if (a1 ^ a2)
|
||||||
{
|
{
|
||||||
|
std::cout << (a1 ? "new[]" : "new") << "\n";
|
||||||
|
std::cout << (a2 ? "delete[]" : "delete") << "\n";
|
||||||
|
|
||||||
std::ostringstream ostr;
|
std::ostringstream ostr;
|
||||||
ostr << FileLine(it->Token) << ": Mismatching allocation and deallocation";
|
ostr << FileLine(it->Token) << ": Mismatching allocation and deallocation '" << VariableNames[varlist[i]->varindex] << "'";
|
||||||
ReportErr(ostr.str());
|
ReportErr(ostr.str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1583,6 +1591,8 @@ void WarningIncludeHeader()
|
||||||
|
|
||||||
void WarningRedundantCode()
|
void WarningRedundantCode()
|
||||||
{
|
{
|
||||||
|
|
||||||
|
// if (p) delete p
|
||||||
for (TOKEN *tok = tokens; tok; tok = tok->next)
|
for (TOKEN *tok = tokens; tok; tok = tok->next)
|
||||||
{
|
{
|
||||||
if (strcmp(tok->str,"if"))
|
if (strcmp(tok->str,"if"))
|
||||||
|
@ -1610,6 +1620,10 @@ void WarningRedundantCode()
|
||||||
err = (strcmp(getstr(tok2,1),varname1)==0);
|
err = (strcmp(getstr(tok2,1),varname1)==0);
|
||||||
else if (match(tok2,"{ delete var ; }"))
|
else if (match(tok2,"{ delete var ; }"))
|
||||||
err = (strcmp(getstr(tok2,2),varname1)==0);
|
err = (strcmp(getstr(tok2,2),varname1)==0);
|
||||||
|
else if (match(tok2,"delete [ ] var ;"))
|
||||||
|
err = (strcmp(getstr(tok2,1),varname1)==0);
|
||||||
|
else if (match(tok2,"{ delete [ ] var ; }"))
|
||||||
|
err = (strcmp(getstr(tok2,2),varname1)==0);
|
||||||
else if (match(tok2,"free ( var )"))
|
else if (match(tok2,"free ( var )"))
|
||||||
err = (strcmp(getstr(tok2,2),varname1)==0);
|
err = (strcmp(getstr(tok2,2),varname1)==0);
|
||||||
else if (match(tok2,"{ free ( var ) ; }"))
|
else if (match(tok2,"{ free ( var ) ; }"))
|
||||||
|
@ -1622,6 +1636,12 @@ void WarningRedundantCode()
|
||||||
ReportErr(ostr.str());
|
ReportErr(ostr.str());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// TODO
|
||||||
|
// if (haystack.find(needle) != haystack.end())
|
||||||
|
// haystack.remove(needle);
|
||||||
|
|
||||||
}
|
}
|
||||||
//---------------------------------------------------------------------------
|
//---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue