2014-10-04 2 views
0

레지스트리를 통해 일부 프로그램 버전을 가져 오려고합니다. 내 코드는 릴리스 구성으로 설정하면 잘 작동합니다. 디버그 모드에서 실행하려고하면 "Run-Time Check Failure # 2 - 변수 '버전 주위의 스택'이 손상되었습니다."라는 메시지와 함께이 함수를 떠날 때 코드가 충돌합니다.디버그 구성에만 손상된 스택 C++

내 기능의 관련 코드 만 붙여 넣습니다. 그것은 내 코드에서 "버전"으로 나타나는 것입니다. 디버깅 할 때 버전이 적절한 값을 얻습니다. 릴리스 구성에서 코드가 충돌하지 않습니다. 두 구성 모두에 대해 "다중 바이트 문자 세트 사용"을 설정합니다.

TCHAR version[20]; 
DWORD dwBufferSize = 0; 
if (RegQueryValueEx(hAppKey, "DisplayVersion", NULL,&dwType, (unsigned char*)version, &dwBufferSize) == ERROR_SUCCESS) 
{ 
    dwBufferSize = 20; 
    std::string vers(version, dwBufferSize); 
    return vers; 
} 

어떤 아이디어로 해결할 수 있습니까?

답변

0

버퍼 크기가 0이라고 보입니다. 왜 20시에 말하는거야?

+0

물론 모든 코드가 아닙니다. 그것은 20으로 설정됩니다. 그렇지 않으면 릴리스 구성에서 작동하지 않습니다. –

+0

@ IggyBrodevíć : 그렇다면 관련 코드를 충분히 표시하지 않았습니다. 그것이 의미하는 것처럼'DWORD dwBufferSize = 0;'에 이어'RegQueryValueEx'가 단지 명백한 잘못입니다. 당신이 실제로 그것을하고 그것을 릴리스에서 실행하는 경우 실제로 옳은 일을하고있는 것처럼 보일 수 있습니다. 그것이 코드가하는 것이 아니라면 실제 문제를 나타내는 코드를 제시해야합니다. –

+0

더 많은 관련 코드를 보지 않아도됩니다. 당신의 문제에 대한 나의 가장 좋은 추측은 이것입니다. 실제 코드에서는 dwBufferSize를 sizeof (버전)보다 큰 값으로 설정합니다. MCHS로 빌드한다고해도 TCHAR는 1 또는 2 바이트가 될 수 있으므로 sizeof()를 사용합니다. 스택 손상으로 인해 'version' 버퍼를 채우고 스택이 손상되었는지 탐지하는 데 사용 된 가드 비트를 지 웠습니다.다른 가능성은 버퍼를 덮어 쓴'version'을 다루는 다른 코드를 빠뜨린 것입니다. 임의의 최대 아웃 버퍼의 끝 부분에 널 문자 (\ 0)를 추가 했습니까? –

0

이는 당신의 버퍼가 0입니다 말한대로 잘못된 것 같습니다 그러나 20 TCHAR입니다 :

DWORD dwBufferSize = 0; 

아마해야합니다

DWORD dwBufferSize = sizeof(version); 

이 전달하는 데 사용되기 때문에이 중요하다 버퍼 version의 크기 인 RegQueryValueEx으로 변경하십시오. RegQueryValueEx 실제로 사용 된 바이트 수를 반환하면 해당 값이 업데이트됩니다.

1

코드에서 이 아니고은 잘 작동합니다. 여기에는 추가 오류 검사가 포함 된 디버그 빌드가 실행되는 버퍼 오버런이 포함되어 있습니다. 버퍼의 크기를 지정하는 변수에 대한 포인터가 가리키는 [아웃, 선택에]

LONG WINAPI RegQueryValueEx( _In_ HKEY hKey, _In_opt_ LPCTSTR lpValueName, _Reserved_ LPDWORD lpReserved, _Out_opt_ LPDWORD lpType, _Out_opt_ LPBYTE lpData, _Inout_opt_ LPDWORD lpcbData );

lpcbData :

대충 눈에 at the documentation for RegQueryValueEx은 무슨 일을하는 것은 잘못이다 lpData 매개 변수에 의해 바이트. 함수가 반환되면이 변수는 lpData에 복사 된 데이터의 크기를 포함합니다.

실제로 20 *를 sizeof (TCHAR) 바이트가 아닌 0 일 때 당신은 당신의 버퍼 크기가 0입니다 기능을 말하고있다

하지 (20)

당신이 처리해야 할 때마다 슈퍼주의하시기 바랍니다 C 스타일 문자열. 코드에 보안 취약점이있는 것 같습니다.

관련 문제