2016-06-26 7 views
0

다음 코드는 lpSubKey를 해제하려고 시도 할 때 힙 손상을 발생시킵니다.주어진 코드가 힙 손상 오류를 발생시키는 이유는 무엇입니까?

정확히 무엇이 잘못 되었나요?

#define DRIVER_NAME L"TEST" 
#define SUB_KEY  L"System\\CurrentControlSet\\Services\\" 

size_t len = (wcslen(SUB_KEY) + wcslen(DRIVER_NAME) + 1) * sizeof(WCHAR); 
LPWSTR lpSubKey = calloc(1, len); 

wcscat_s(lpSubKey, len, SUB_KEY); 
wcscat_s(lpSubKey, len, DRIVER_NAME); 

free(lpSubKey); 

편집 :이 오류가 main()의 유일한 코드 일 때도 오류가 발생하므로 오류가 다른 곳에서 발생하지 않습니다.

EDIT2 : 허용 된 답변을 반영하도록 코드를 업데이트하면 문제가 해결되었습니다. 나는 아직도 왜 처음에는 오류가 있는지 보지 못합니다. len이 올바른 값이 아니기 때문에 wcscat_s가 보호를 제공하지 않더라도 내 버퍼는 두 문자열을 모두 수용 할 수있을 정도로 커야합니다.

#define DRIVER_NAME L"TEST" 
#define SUB_KEY  L"System\\CurrentControlSet\\Services\\" 

size_t len = wcslen(SUB_KEY) + wcslen(DRIVER_NAME) + 1; 
LPWSTR lpSubKey = calloc(len, sizeof(WCHAR)); 

wcscat_s(lpSubKey, len, SUB_KEY); 
wcscat_s(lpSubKey, len, DRIVER_NAME); 

free(lpSubKey); 

답변

1

가 여기에 특정 오류 (당신이 할당 문자열이 충분히 큰)의 증거는 없다, 그래서 문제는 아마 다른 곳에있다.

그러나, wcscat_s 요소, 버퍼없는 크기의 수를 필요로 기억, 그래서 여기에 C 함수의 _s 버전은 어떤 식 으로든 당신을 보호하지 않습니다. 작업의 더 일관된 방법 (len 문자수를 포함하지 바이트)가 될 수있다 :

size_t len = (wcslen(SUB_KEY) + wcslen(DRIVER_NAME) + 1); 
LPWSTR lpSubKey = calloc(len, sizeof(WCHAR)); 

wcscat_s(lpSubKey, len, SUB_KEY); 
wcscat_s(lpSubKey, len, DRIVER_NAME); 

free(lpSubKey); 

업데이트

이를 수정하는 문제를 해결 한 것을 감안할 때, I wcscat_s은 버퍼가 항상 NUL 종료되었는지 확인하고이 같은 잠재적 인 버그를 분명히하기 위해 항상 len 문자로 버퍼를 의도적으로 NUL 종료한다고 의심하십시오.