cmDependsJavaParserHelper: fix dangling pointer
The cmDependsJavaParserHelper tries to implement a "deep copy" in the assignment operator of the internal class CurrentClass. To do that, it uses std::copy and std::back_inserter. The copy constructor is implemented in terms of the assignment operator but it does not initialize the member NestedClasses, a pointer to vector. This pointer is dereferenced in the assignment operator. Change the pointer to a value and rely on the compiler generated special functions.
This commit is contained in:
parent
f3d76a88b7
commit
fe27879c6b
|
@ -35,7 +35,7 @@ cmDependsJavaParserHelper::~cmDependsJavaParserHelper()
|
|||
}
|
||||
|
||||
void cmDependsJavaParserHelper::CurrentClass::AddFileNamesForPrinting(
|
||||
std::vector<std::string>* files, const char* prefix, const char* sep)
|
||||
std::vector<std::string>* files, const char* prefix, const char* sep) const
|
||||
{
|
||||
std::string rname = "";
|
||||
if (prefix) {
|
||||
|
@ -44,8 +44,8 @@ void cmDependsJavaParserHelper::CurrentClass::AddFileNamesForPrinting(
|
|||
}
|
||||
rname += this->Name;
|
||||
files->push_back(rname);
|
||||
std::vector<CurrentClass>::iterator it;
|
||||
for (it = this->NestedClasses->begin(); it != this->NestedClasses->end();
|
||||
std::vector<CurrentClass>::const_iterator it;
|
||||
for (it = this->NestedClasses.begin(); it != this->NestedClasses.end();
|
||||
++it) {
|
||||
it->AddFileNamesForPrinting(files, rname.c_str(), sep);
|
||||
}
|
||||
|
@ -191,25 +191,19 @@ void cmDependsJavaParserHelper::StartClass(const char* cls)
|
|||
|
||||
void cmDependsJavaParserHelper::EndClass()
|
||||
{
|
||||
CurrentClass* parent = 0;
|
||||
CurrentClass* current = 0;
|
||||
if (!this->ClassStack.empty()) {
|
||||
current = &(*(this->ClassStack.end() - 1));
|
||||
if (this->ClassStack.size() > 1) {
|
||||
parent = &(*(this->ClassStack.end() - 2));
|
||||
}
|
||||
}
|
||||
if (current == 0) {
|
||||
if (this->ClassStack.empty()) {
|
||||
std::cerr << "Error when parsing. Current class is null" << std::endl;
|
||||
abort();
|
||||
}
|
||||
if (parent == 0) {
|
||||
if (this->ClassStack.size() <= 1) {
|
||||
std::cerr << "Error when parsing. Parent class is null" << std::endl;
|
||||
abort();
|
||||
}
|
||||
CurrentClass& current = this->ClassStack.back();
|
||||
CurrentClass& parent = this->ClassStack[this->ClassStack.size() - 2];
|
||||
this->CurrentDepth--;
|
||||
parent->NestedClasses->push_back(*current);
|
||||
this->ClassStack.erase(this->ClassStack.end() - 1, this->ClassStack.end());
|
||||
parent.NestedClasses.push_back(current);
|
||||
this->ClassStack.pop_back();
|
||||
}
|
||||
|
||||
void cmDependsJavaParserHelper::PrintClasses()
|
||||
|
@ -228,10 +222,10 @@ void cmDependsJavaParserHelper::PrintClasses()
|
|||
std::vector<std::string> cmDependsJavaParserHelper::GetFilesProduced()
|
||||
{
|
||||
std::vector<std::string> files;
|
||||
CurrentClass* toplevel = &(*(this->ClassStack.begin()));
|
||||
std::vector<CurrentClass>::iterator it;
|
||||
for (it = toplevel->NestedClasses->begin();
|
||||
it != toplevel->NestedClasses->end(); ++it) {
|
||||
CurrentClass const& toplevel = this->ClassStack.front();
|
||||
std::vector<CurrentClass>::const_iterator it;
|
||||
for (it = toplevel.NestedClasses.begin(); it != toplevel.NestedClasses.end();
|
||||
++it) {
|
||||
it->AddFileNamesForPrinting(&files, 0, "$");
|
||||
}
|
||||
return files;
|
||||
|
@ -309,11 +303,10 @@ int cmDependsJavaParserHelper::LexInput(char* buf, int maxlen)
|
|||
if (buf[0] == '\n') {
|
||||
this->CurrentLine++;
|
||||
}
|
||||
return (1);
|
||||
} else {
|
||||
buf[0] = '\n';
|
||||
return (0);
|
||||
return 1;
|
||||
}
|
||||
buf[0] = '\n';
|
||||
return 0;
|
||||
}
|
||||
void cmDependsJavaParserHelper::Error(const char* str)
|
||||
{
|
||||
|
|
|
@ -48,7 +48,7 @@ public:
|
|||
|
||||
// For yacc
|
||||
void AddClassFound(const char* sclass);
|
||||
void PrepareElement(ParserType* opt);
|
||||
void PrepareElement(ParserType* me);
|
||||
void DeallocateParserType(char** pt);
|
||||
void CheckEmpty(int line, int cnt, ParserType* pt);
|
||||
void StartClass(const char* cls);
|
||||
|
@ -69,20 +69,9 @@ private:
|
|||
{
|
||||
public:
|
||||
std::string Name;
|
||||
std::vector<CurrentClass>* NestedClasses;
|
||||
CurrentClass() { this->NestedClasses = new std::vector<CurrentClass>; }
|
||||
~CurrentClass() { delete this->NestedClasses; }
|
||||
CurrentClass& operator=(CurrentClass const& c)
|
||||
{
|
||||
this->NestedClasses->clear();
|
||||
this->Name = c.Name;
|
||||
std::copy(c.NestedClasses->begin(), c.NestedClasses->end(),
|
||||
std::back_inserter(*this->NestedClasses));
|
||||
return *this;
|
||||
}
|
||||
CurrentClass(CurrentClass const& c) { (*this) = c; }
|
||||
std::vector<CurrentClass> NestedClasses;
|
||||
void AddFileNamesForPrinting(std::vector<std::string>* files,
|
||||
const char* prefix, const char* sep);
|
||||
const char* prefix, const char* sep) const;
|
||||
};
|
||||
std::string CurrentPackage;
|
||||
std::string::size_type InputBufferPos;
|
||||
|
|
Loading…
Reference in New Issue