이전에 C++/COM 작업을 한 번도 해 본 적이 없으므로 기존 솔루션을 가로 채고 내 필요에 맞게 변경하려고합니다. 이 프로젝트는 VC 6으로 작성되었고 성공적으로 2010 년에 작업하려고 시도하고 있습니다. 컴파일하기 위해 몇 가지 참조를 변경해야했지만 어떤 이유에서든 생성하는 DLL에서 예외가 발생했습니다. 내 시스템 (원래 작동). 오류에 대한 조사를하고 있는데, 문자 배열을 선언하려고하면 버퍼 오버 플로우가 발생하는 것 같습니다.문자 배열 선언시 버퍼 오버플로
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++
나는 어리석은 기본적인 실수가있을 것이라고 확신하지만, 생각지도 못한 것 같습니다.
'cData'에 대한 자세한 정보를 제공해 주시겠습니까? –
72는 영어 숫자입니다. 프로그래머는 256을 사용합니다. 물론 코드 스 니펫은 전혀 의미가 없습니다. –
cData에 대한 자세한 내용을 추가했지만이 프로젝트는 VS 6이 빌드 될 때 컴파일되고 실행됩니다.이 코드는 수년간 사용 중이며 2007 년부터 수정되지 않았습니다. – JStinebaugh