2012-02-11 13 views
1

私は以前にC++/COMの仕事をしたことがないので、既存のソリューションをハイジャックしようとしています。プロジェクトは、VC 6で書かれ、正常にコンパイルされました。私は今、2010年にそれを使用しようとしています。コンパイルするためにいくつかのリファレンスを変更しなければならなかったのですが、何らかの理由で、私のシステム(元の作品は正常です)。エラーのいくつかの研究をして、私は文字配列を宣言しようとすると、バッファオーバーフローを得ているように見えます。ここ文字配列宣言時にバッファオーバーフローが発生する

bool CFile::simpleWrite(char* cData) 
{ 
    try{ 

     // temp result variable 
     BOOL bResult = 0; 

     // file handle 
     HANDLE hFile = INVALID_HANDLE_VALUE; 

     // get the CMain singleton 
     CMain* m_pMain = CMain::GetInstance(); 

     // this point gets synchronization to ensure we get unique file name... 
     char cDirFilename[MAX_PATH + 1]; 
     GetLogFileName(cDirFilename, MAX_PATH); 

     // sanity check 
     if(strcmp(cDirFilename, "c:\\") == 0) assert(0); 

     // try and create a file 
     hFile = CreateFile(cDirFilename, GENERIC_WRITE, FILE_SHARE_READ,NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); 

     // if have a good file handle 
     if(hFile != INVALID_HANDLE_VALUE){ 

      size_t lenFileData = strlen(cData) + 72; 
      char* cFileData = new char[lenFileData]; 
      _snprintf(cFileData, lenFileData, "<?xml version=\"1.0\"?>\r\n<RootElement>\r\n%s</RootElement>\r\n\0", cData); 
... 

はCDATA(呼び出しメソッドでのcXML)の宣言/割り当てです。

char cXML[EVENT_LOG_MAX_MESSAGE]; 
// get the CMain singleton 
CMain* pMain = CMain::GetInstance(); 

long lThreadID = GetCurrentThreadId(); 

// put the parameters into XML format 
pMain->BuildXML(cXML, EVENT_LOG_MAX_MESSAGE,errLogLevel,userActivityID,methodName,lineNumber,className,AppID,errorDescription,errorID,lThreadID); 

// write the data to file 
if(!simpleWrite(cXML)) 
... 

BuildXMLはcXMLに_snprintfを実行して返します。

私の呼び出しからいくつかのVCファイルに移動するスタックトレースです。

Test.dll!_heap_alloc_base(unsigned int size) Line 55 C 
Test.dll!_heap_alloc_dbg_impl(unsigned int nSize, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 431 + 0x9 bytes C++ 
Test.dll!_nh_malloc_dbg_impl(unsigned int nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine, int * errno_tmp) Line 239 + 0x19 bytes C++ 
Test.dll!_nh_malloc_dbg(unsigned int nSize, int nhFlag, int nBlockUse, const char * szFileName, int nLine) Line 302 + 0x1d bytes C++ 
Test.dll!malloc(unsigned int nSize) Line 56 + 0x15 bytes C++ 
Test.dll!operator new(unsigned int size) Line 59 + 0x9 bytes C++ 
Test.dll!operator new[](unsigned int count) Line 6 + 0x9 bytes C++ 
Test.dll!CFile::simpleWrite(char * cData) Line 87 + 0xc bytes C++ 

私は確かにいくつかの愚かな基本的な間違いがありますが、わかりません。

+0

'cData'に関する詳細情報を提供できますか? –

+1

72は英語の番号です。プログラマーは256を使用します。もちろん、コードスニペットは全く無意味です。 –

+0

私はcDataの詳細をいくつか追加しましたが、このプロジェクトはVS 6でビルドされたときにコンパイルして正常に動作することを思い出させたかっただけです。このコードは数年間使用されており、2007年以降は変更されていません。 – JStinebaugh

答えて

0

エラーは、ヒープを破損してしまう可能性が最も高い場所です。私はここでstrlenを使用して、終端のゼロを追加することなく使用していることに気付きました。私はあなたが1バイトをあまりにも少し割り当ててstrcpy'ingすることによってヒープを破損していると思うので、あなたのコードで見て、あなたがメモリを割り当ててどこかにコピーするためにstrlenを使用するかどうかを見てください。

+1

; cDataをどこに割り当ててコピーするかを見てください。あなたは万事チャンスをしていますか?cData = new char [strlen(oldString)]; strcpy(cData、oldString)? これは、終端の0がバッファの終わりを上書きするため、ヒープの破損につながります。 – Tobias

0

私が疑ったように、これは私自身の愚かさでした。このCOMアプリケーションには、私が気づいていなかった依存関係がありました。プロセスモニタでそのファイルを探すのを見たことがありません。プロジェクトにはコンパイル目的のファイルのローカルコピーがあるようです。しかし、入力をありがとう。

関連する問題