문제

최근 SO에 대한 질문이 있었습니다(도대체 왜 strcpy 대신 strncpy를 사용할까요?), 답변이 있었습니다(대답 1, 대답 2), 이로 인해 이름에 'n'이 포함된 다른 문자열 함수에 대해 불확실해졌습니다. snprintf (내가 광범위하게 사용하고 있는).snprintf를 사용해도 안전한가요?그리고 일반적으로 'n' 계열의 안전 기능은 무엇입니까?

도움이 되었습니까?

해결책

strncpy() 정말 이름이 잘못된 이상한 함수입니다. 원래 목적은 버퍼가 문자열 내용(대상을 오버플로하지 않고)으로 완전히 초기화되고 버퍼가 0임을 상기시키는 것입니다.내가 이해한 바로는 원래 목적은 파일 시스템 디렉터리 항목을 처리하는 것이었습니다. 대상 버퍼는 실제로 다른 버퍼와 같은 의미의 문자열이 아니었습니다. strxxx() C 라이브러리의 함수.주요 문제 strncpy() 즉, 소스 문자열이 대상 버퍼보다 ​​크면 결과가 null로 끝나지 않습니다.

문자열을 처리하는 대부분의 다른 'n' 함수는 문자열을 적절하게 종료하지만 Microsoft의 서투른 기능과 같은 예외도 있습니다. _snprintf().적절한 C99 snprintf() 항상 대상 문자열을 null로 종료합니다(대상 버퍼의 크기가 0보다 큰 경우).

문자열 및 메모리 버퍼를 처리하는 기능에 대한 일련의 경계 검사 대안을 제안하는 '기술 보고서' TR 24731이 있습니다.TR의 목표 중 하나는 함수의 매개변수, 결과 및 오류 동작을 함수 전체에서 더 유사하게 만드는 것입니다.TR은 다소 혼합된 수용을 보이는 것으로 보이며 Microsoft의 컴파일러 외에는 널리 구현되지 않은 것 같습니다(MS가 TR의 주요 드라이버라고 생각합니다).여기에서 더 많은 정보를 얻을 수 있습니다:

제안의 팬이 아니더라도 기존 기능의 문제에 대해 교육적으로 읽을 수 있다고 생각합니다.

다른 팁

하는 동안 snprintf 올바른 인수를 제공하는 경우 버퍼를 오버런하지 않습니다. 모든 형식 문자열 취약점을 다른 멤버와 공유한다는 점을 명심하십시오. *printf 가족. 예를 들어, %n 지정자는 임의의 메모리 위치에 임의의 바이트를 작성하는 데 공격자가 사용할 수 있기 때문에 불쾌합니다. 보다 fio30-c. 형식 문자열에서 사용자 입력을 제외하십시오 CERT C 코딩 표준에서 Wiki.

버퍼의 올바른 길이를 제공하는 한 안전합니다.

SNPRINTF는 버퍼를 덮어 쓰지 않도록 보장하지만 널 종결을 보장하지는 않습니다. 당신이 사용할 수있는 sprintf_s 비표준이 아닌 경우 MSVC에서.

보다 http://msdn.microsoft.com/en-us/library/2ts7cx93(vs.71).aspx

조심하십시오 : 플랫폼은 다른 플랫폼이 전달 된 문자열의 널 종료와 관련하여 다른 동작을 가지고 있습니다. snprintf.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top