Visual c++ 声明字符数组时缓冲区溢出

Visual c++ 声明字符数组时缓冲区溢出,visual-c++,dll,com,Visual C++,Dll,Com,我以前从未做过任何C++/COM工作,所以我试图劫持一个现有的解决方案,并根据自己的需要对其进行修改。该项目是用VC 6编写并成功编译的,我现在正试图在2010年使用它。我不得不更改一些引用以使其进行编译,但由于某种原因,我生成的dll在我的系统上引起了异常(原始的工作正常)。在对错误进行一些研究时,当我试图声明一个char数组时,似乎遇到了缓冲区溢出 bool CFile::simpleWrite(char* cData) { try{ // temp result

我以前从未做过任何C++/COM工作,所以我试图劫持一个现有的解决方案,并根据自己的需要对其进行修改。该项目是用VC 6编写并成功编译的,我现在正试图在2010年使用它。我不得不更改一些引用以使其进行编译,但由于某种原因,我生成的dll在我的系统上引起了异常(原始的工作正常)。在对错误进行一些研究时,当我试图声明一个char数组时,似乎遇到了缓冲区溢出

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);
...
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++

我确信存在一些愚蠢的基本错误,但我似乎无法解决它。

您的错误很可能在其他地方导致堆损坏。我注意到您在这里使用strlen,没有为终止零添加一。请查看您的代码,看看是否使用strlen分配内存并在某处复制,因为我认为您分配的字节太少,然后对其进行strcpy,这是在破坏堆。

正如我所怀疑的,这完全是我自己的愚蠢。这个COM应用程序有一个我不知道的依赖项。从没有在进程监视器中看到任何试图查找它的东西,而且项目显然有一个用于编译的本地文件副本。感谢您的输入。

您能提供更多关于cData的信息吗?72是一个英文数字。程序员使用256。代码片段当然毫无意义。我添加了一些关于cData的详细信息,但只是想提醒一下,当内置VS6时,这个项目编译并运行良好。这个代码已经使用了好几年,从2007年起就没有被修改过;看看您在哪里分配cData并复制到它。您是否有机会使用cData=new char[strlen(oldString)];strcpy(cData,旧字符串)?这将导致堆损坏,因为终止0会覆盖缓冲区的结尾。
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++