다음 코드는 오류를 발생시키고 응용 프로그램을 종료합니다. 버퍼는 단지 10 바이트 길이이고 텍스트는 22 바이트 길이 (버퍼 오버 플로우)이므로 의미가 있습니다.버퍼가 너무 작은 sprintf_s
char buffer[10];
int length = sprintf_s(buffer, 10, "1234567890.1234567890.");
이 오류를 어떻게 잡아 내 애플리케이션을 중단시키지 않고보고 할 수 있습니까?
편집 :
내가 _snprintf_s 갔다 아래 주석을 읽은 후. -1 값을 반환하면 버퍼가 업데이트되지 않습니다. MSDN에서
length = _snprintf_s(buffer, 10, 9, "123456789");
printf("1) Length=%d\n", length); // Length == 9
length = _snprintf_s(buffer, 10, 9, "1234567890.1234567890.");
printf("2) Length=%d\n", length); // Length == -1
length = _snprintf_s(buffer, 10, 10, "1234567890.1234567890.");
printf("3) Length=%d\n", length); // Crash, it needs room for the NULL char
버퍼 크기 및 버퍼 크기에서 1을 뺀 값은 오르지 만 오류가 발생하기 쉽습니다. 아래에서 설명하는 변형을 선호해야합니다. 길이 = _snprintf_s (버퍼, _TRUNCATE, "1234567890.1234567890."); 첫 번째 크기 매개 변수가 생략되었으므로 컴파일러는 크기를 유추하는 템플릿 오버로드를 사용합니다. _TRUNCATE는 그것이 말하는 것을 수행하는 특별한 값입니다. 매직 넘버는 없으며 이제 코드는 안전하고 유지 보수가 잘되며 좋은 예입니다. 이 주석과 _snprintf_s가 마음에 들면 위험한 snprintf/_snprintf 대답 대신 내 대답을 선택해야합니다. –