bizarre crashing bug when assigning to StringTableEntry from data structure
by Thomas -elfprince13- Dickerson · in Torque 3D Professional · 09/01/2011 (9:50 am) · 2 replies
LDFileData * bufferFile(LDFileSearchInfo &fileSearchInfo){
LDFileData * ret;
U32 cacheDepth = gLDrawPrintCacheTree ? 0 : -1;
//Something is going desperately wrong here!
//Overwriting a chunk of the heap or some bad stuff like that
AssertFatal(fileSearchInfo.path != NULL && fileSearchInfo.name != NULL && !fileSearchInfo.subFile, "LDFileSearchInfo passed to LDParse::bufferFile() was for a sub-file, or was the result of a failed search");
StringTableEntry filename;
filename = NULL;
//
// Stepping over this line causes the program to crash.
// path = 0x08673088 "C:/Program Files (x86)/LDraw/PARTS/2531.dat"
//
filename = fileSearchInfo.path;
FileStream *s = new FileStream;
char* script = NULL;
if( !s->open (filename, Torque::FS::File::Read) ) {
// ...About the author
C.S. PhD student at Brown University. Project lead for FreeBuild. Administrator, Cemetech tech community. Webmaster for the Village2Village Projects and the Vermont Sustainable Heating Initiative.
#2
09/01/2011 (11:46 am)
Nevermind, the debugger was lying to me. The stack trace after the crash would jump to an entirely different portion of code then the one I was stepping through when the crash occurred. I think I have it figured out.
Torque 3D Owner Thomas -elfprince13- Dickerson
[edit]
changing the problematic assignation to this:
//Overwriting a chunk of the heap or some bad stuff like that AssertFatal(fileSearchInfo.path != NULL && fileSearchInfo.name != NULL && !fileSearchInfo.subFile, "LDFileSearchInfo passed to LDParse::bufferFile() was for a sub-file, or was the result of a failed search"); StringTableEntry filename; filename = NULL; filename = "toothpaste"; filename = StringTable->insert("C:/Program Files (x86)/LDraw/PARTS/2531.dat"); // // Stepping over this line causes the program to crash. // fileSearchInfo.path == filename already, after the last step, but the assignment crashes it. // filename = fileSearchInfo.path;Still causes the crash in the same place, namely when I try to assign the string from fileSearchInfo.path, but the debugger tells me it has the same contents as the string I assign immediately before that.[edit #2]
Here is the code that instantiates fileSearchInfo:
LDFileSearchInfo * findLDrawFile(const char * filename, Vector<LDFileData*> &subfile_search_stack) { U32 i; U32 cacheDepth = gLDrawPrintCacheTree ? 0 : -1; StringTableEntry file = StringTable->insert(filename); LDCacheNode * cacheRoot = LDCacheNode::getRoot(); LDCacheNode * subFileList = NULL; LDCacheNode * cachedFile = NULL; LDFileSearchInfo * ret = new LDFileSearchInfo; ret->name = NULL; ret->path = NULL; ret->subFile = false; ret->file = NULL; U32 ldis = gLDrawInstallation.size(); if(ldis % 3) { Con::errorf("findLDrawFile called before any entries in $pref::LDraw::Directory were validated. Please call checkLDrawDirectory()"); } else if(!subfile_search_stack.empty()) for(i = 0; i < subfile_search_stack.size(); i++){ subFileList = subfile_search_stack[i]->getSubfileCache(); if((subFileList != NULL) && // Did we get passed some sub-files? ((cachedFile = subFileList->find(file,cacheDepth)) != NULL) && // Is the file name among the sub-files? (cachedFile->getContents() != NULL) // Is it really holding something? ) { ret->name = file; ret->path = cachedFile->getContents()->getPath(); ret->subFile = true; ret->file = cachedFile->getContents(); break; } } if(ret->name == NULL){ if((cacheRoot != NULL) && ((cachedFile = cacheRoot->find(file,cacheDepth)) != NULL) && // Is the file name among the sub-files? (cachedFile->getContents() != NULL) && // Is it really holding something? (cachedFile->getContents()->hasCache() || cachedFile->getContents()->hasSubfiles()) // Have we cached it yet? ) { ret->name = file; ret->path = cachedFile->getContents()->getPath(); ret->file = cachedFile->getContents(); } else { //Assumes a beginning->end traversal to ensure proper precedence. StringTableEntry path; char pReturn[1024]; for(std::deque<std::string>::const_iterator itr = gLDrawInstallation.begin(); itr!=gLDrawInstallation.end(); ++itr ) { path = StringTable->insert(itr->c_str()); Platform::makeFullPathName(file, pReturn, 1024, path); if(Platform::isFile(pReturn) && !Platform::isDirectory(pReturn)){ ret->name = file; ret->path = StringTable->insert(pReturn); break; } } } } if(ret->name == NULL) Con::warnf("File '%s' not found in LDraw directories",file); return ret; }