2014-04-08 1 views
4

나는이 주제에 대해 이미 많은 게시물이 있지만 만족스러운 것을 찾지 못했다고 알고있다. 심지어 구글은 내 친구가 아니었다.char 배열의 경계를 덮어 쓰는 경우 왜 strcat_s가 충돌합니까?

그래서 먼저 내 코드 :

void secureCat() { 
     const int BUFFERSIZE = 5; 
     char buffer[BUFFERSIZE]; 

     strcpy_s (buffer, BUFFERSIZE, "01"); 
     cout << "1, buffer=" << buffer << endl; 

     errno_t rc = 0; 

     // still works 
     rc = strcat_s(buffer, BUFFERSIZE, "2"); 

     cout << (rc == 0 ? "yippee" : "oh noooo") << endl; 
     cout << "2, buffer=" << buffer << endl; 

     // and now the crashing line 
     rc = strcat_s(buffer, BUFFERSIZE, "345"); 

     cout << (rc == 0 ? "yippee" : "oh noooo") << endl; 
     cout << "3, buffer=" << buffer << endl; 
    } 

나는 MS VS 2010 Windows에서이 코드를 연주 다음과 같은 경험 :

strcat_s의 전화가 잘 작동, 분명 어떤을 왜냐하면 새로운 문자열 ("01" + "2" + NUL 문자)의 크기가 버퍼 크기보다 작기 때문입니다.

하지만 왜 버퍼 크기가 초과되면 두 번째 호출 충돌이 발생합니까? 내가 MSDN을 이해하는 한, 오류 코드를 다시 받아야하며 버퍼에는 NUL 문자 만 있어야합니다. 예제의 동작은 strcat의 동작과 비슷합니다. 코드를 덮어 쓰므로 충돌합니다.

BTW : 문자열을 연결하는 다른 방법이 있으며 그 전에 검사를 수행하는 것이 더 나은 스타일이라는 것을 알고 있습니다. 따라서 이것은 순수한 관심을 배경으로 보일 때 더 중요합니다.

감사합니다, 로버트

답변

7

MSDN documentation for strcat_s() 읽기 :

[...] 대상 문자열이 너무 작은 경우 Parameter Validation에 설명 된대로 잘못된 매개 변수 처리기 가 호출됩니다. 당신이 Parameter Validation link를 수행하면

, 당신이 읽을 수있는 (강조 광산) : 루틴

잘못된 매개 변수 처리기

[...] 기본 유효하지 않은 매개 변수는 Watson 크래시를 호출 보고로 인해 응용 프로그램이 손상되어이 발생하고 사용자가 분석을 위해 Microsoft에 크래시 덤프를로드할지 묻습니다. 디버그 모드에서는 잘못된 매개 변수로 인해 어설 션이 실패합니다.

이 동작은 _set_invalid_parameter_handler 함수를 사용하여 잘못된 매개 변수 처리기를 사용자 고유의 함수로 설정하여 변경할 수 있습니다. [...] 대안으로


, 당신은 반환 StringCchCat() function을 고려할 수있는 너무 작은 대상 버퍼의 경우 STRSAFE_E_INSUFFICIENT_BUFFER 동일 HRESULT.

+0

StringCchCat()에 대해 알아두면 좋습니다. [strcat] (https://msdn.microsoft.com/en-us/library/d45bbxx4(v=vs.100) .aspx)에서 이에 대한 의견을 말했습니다. –