나는이 주제에 대해 이미 많은 게시물이 있지만 만족스러운 것을 찾지 못했다고 알고있다. 심지어 구글은 내 친구가 아니었다.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 : 문자열을 연결하는 다른 방법이 있으며 그 전에 검사를 수행하는 것이 더 나은 스타일이라는 것을 알고 있습니다. 따라서 이것은 순수한 관심을 배경으로 보일 때 더 중요합니다.
감사합니다, 로버트
StringCchCat()에 대해 알아두면 좋습니다. [strcat] (https://msdn.microsoft.com/en-us/library/d45bbxx4(v=vs.100) .aspx)에서 이에 대한 의견을 말했습니다. –