added internal support for handling list of classes that are automaticly deallocated
This commit is contained in:
parent
28475b2986
commit
d7cd09cb6e
|
@ -428,9 +428,9 @@ Token *CheckMemoryLeakClass::getcode(const Token *tok, std::list<const Token *>
|
||||||
if (_settings._showAll)
|
if (_settings._showAll)
|
||||||
{
|
{
|
||||||
|
|
||||||
if (_settings._vcl && Token::Match(tok->tokAt(4), "( %var%") && (tok->strAt(3)[0] == 'T'))
|
if (_settings.isAutoDealloc(tok->strAt(3)))
|
||||||
{
|
{
|
||||||
// Guess this is a VCL class with automatic deallocation
|
// This class has automatic deallocation
|
||||||
alloc = No;
|
alloc = No;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -1440,8 +1440,8 @@ void CheckMemoryLeakClass::CheckMemoryLeak_ClassMembers_ParseClass(const Token *
|
||||||
// Declaring member variable.. check allocations and deallocations
|
// Declaring member variable.. check allocations and deallocations
|
||||||
if (Token::Match(tok->next(), "%type% * %var% ;"))
|
if (Token::Match(tok->next(), "%type% * %var% ;"))
|
||||||
{
|
{
|
||||||
// No false positives for vcl classes..
|
// No false positives for auto deallocated classes..
|
||||||
if (_settings._vcl && tok->next()->str()[0] == 'T')
|
if (_settings.isAutoDealloc(tok->strAt(1)))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (tok->isName() || Token::Match(tok, "[;}]"))
|
if (tok->isName() || Token::Match(tok, "[;}]"))
|
||||||
|
|
|
@ -19,6 +19,8 @@
|
||||||
|
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
|
|
||||||
|
#include <algorithm>
|
||||||
|
|
||||||
Settings::Settings()
|
Settings::Settings()
|
||||||
{
|
{
|
||||||
_debug = false;
|
_debug = false;
|
||||||
|
@ -30,7 +32,6 @@ Settings::Settings()
|
||||||
_xml = false;
|
_xml = false;
|
||||||
_unusedFunctions = false;
|
_unusedFunctions = false;
|
||||||
_security = false;
|
_security = false;
|
||||||
_vcl = false;
|
|
||||||
_jobs = 1;
|
_jobs = 1;
|
||||||
_exitCode = 0;
|
_exitCode = 0;
|
||||||
}
|
}
|
||||||
|
@ -39,3 +40,25 @@ Settings::~Settings()
|
||||||
{
|
{
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Settings::autoDealloc(std::istream &istr)
|
||||||
|
{
|
||||||
|
std::string line;
|
||||||
|
while (getline(istr,line))
|
||||||
|
{
|
||||||
|
// Check if line has a valid classname..
|
||||||
|
if (line.empty())
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Add classname to list
|
||||||
|
_autoDealloc.push_back(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool Settings::isAutoDealloc(const char classname[]) const
|
||||||
|
{
|
||||||
|
return (std::find(_autoDealloc.begin(), _autoDealloc.end(), classname) != _autoDealloc.end());
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,6 +20,10 @@
|
||||||
#ifndef SETTINGS_H
|
#ifndef SETTINGS_H
|
||||||
#define SETTINGS_H
|
#define SETTINGS_H
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
#include <string>
|
||||||
|
#include <istream>
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This is just a container for general settings so that we don't need
|
* This is just a container for general settings so that we don't need
|
||||||
* to pass individual values to functions or constructors now or in the
|
* to pass individual values to functions or constructors now or in the
|
||||||
|
@ -27,6 +31,10 @@
|
||||||
*/
|
*/
|
||||||
class Settings
|
class Settings
|
||||||
{
|
{
|
||||||
|
private:
|
||||||
|
/** classes that are automaticly deallocated */
|
||||||
|
std::list<std::string> _autoDealloc;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Settings();
|
Settings();
|
||||||
virtual ~Settings();
|
virtual ~Settings();
|
||||||
|
@ -49,9 +57,6 @@ public:
|
||||||
/** Security checks */
|
/** Security checks */
|
||||||
bool _security;
|
bool _security;
|
||||||
|
|
||||||
/** Disable warnings for VCL classes */
|
|
||||||
bool _vcl;
|
|
||||||
|
|
||||||
/** How many processes/threads should do checking at the same
|
/** How many processes/threads should do checking at the same
|
||||||
time. Default is 1. */
|
time. Default is 1. */
|
||||||
unsigned int _jobs;
|
unsigned int _jobs;
|
||||||
|
@ -59,6 +64,12 @@ public:
|
||||||
/** If errors are found, this value is returned from main().
|
/** If errors are found, this value is returned from main().
|
||||||
Default value is 0. */
|
Default value is 0. */
|
||||||
int _exitCode;
|
int _exitCode;
|
||||||
|
|
||||||
|
/** Fill list of automaticly deallocated classes */
|
||||||
|
void autoDealloc(std::istream &istr);
|
||||||
|
|
||||||
|
/** is a class automaticly deallocated? */
|
||||||
|
bool isAutoDealloc(const char classname[]) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SETTINGS_H
|
#endif // SETTINGS_H
|
||||||
|
|
|
@ -1931,12 +1931,14 @@ private:
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void checkvcl(const char code[])
|
void checkvcl(const char code[], const char _autoDealloc[])
|
||||||
{
|
{
|
||||||
// Tokenize..
|
// Tokenize..
|
||||||
Tokenizer tokenizer;
|
Tokenizer tokenizer;
|
||||||
|
{
|
||||||
std::istringstream istr(code);
|
std::istringstream istr(code);
|
||||||
tokenizer.tokenize(istr, "test.cpp");
|
tokenizer.tokenize(istr, "test.cpp");
|
||||||
|
}
|
||||||
tokenizer.setVarId();
|
tokenizer.setVarId();
|
||||||
tokenizer.simplifyTokenList();
|
tokenizer.simplifyTokenList();
|
||||||
|
|
||||||
|
@ -1947,7 +1949,12 @@ private:
|
||||||
Settings settings;
|
Settings settings;
|
||||||
settings._debug = true;
|
settings._debug = true;
|
||||||
settings._showAll = true;
|
settings._showAll = true;
|
||||||
settings._vcl = true;
|
|
||||||
|
{
|
||||||
|
std::istringstream istr(_autoDealloc);
|
||||||
|
settings.autoDealloc(istr);
|
||||||
|
}
|
||||||
|
|
||||||
CheckMemoryLeakClass checkMemoryLeak(&tokenizer, settings, this);
|
CheckMemoryLeakClass checkMemoryLeak(&tokenizer, settings, this);
|
||||||
checkMemoryLeak.CheckMemoryLeak();
|
checkMemoryLeak.CheckMemoryLeak();
|
||||||
}
|
}
|
||||||
|
@ -1959,7 +1966,7 @@ private:
|
||||||
checkvcl("void Form1::foo()\n"
|
checkvcl("void Form1::foo()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" TEdit *Edit1 = new TEdit(this);\n"
|
" TEdit *Edit1 = new TEdit(this);\n"
|
||||||
"}\n");
|
"}\n", "TEdit\n");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1977,7 +1984,7 @@ private:
|
||||||
"Fred::Fred()\n"
|
"Fred::Fred()\n"
|
||||||
"{\n"
|
"{\n"
|
||||||
" button = new TButton(this);\n"
|
" button = new TButton(this);\n"
|
||||||
"}\n");
|
"}\n", "TButton\n");
|
||||||
ASSERT_EQUALS("", errout.str());
|
ASSERT_EQUALS("", errout.str());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue