wcsncpy_s 예제

Posted on

“두 개의 포인터와 하나의 정수”에 대한 예제 및 설명 텍스트를 더 잘 만들 수 있습니다. 다음은 몇 가지 생각입니다: 이 비준수 코드 예제에서 함수 f()는 fread()를 호출하여 각 크기의 크기인 wchar_t 형식의 nitems를 BUFFER_SIZE 요소의 배열로 읽습니다. 그러나 nitems값을 계산하는 데 사용되는 표현식은 char의 크기와 달리 wchar_t의 크기가 1보다 클 수 있다는 사실을 설명하지 못합니다. 따라서 fread()는 wbuf의 끝을 지나 포인터를 형성하고 이를 사용하여 배열의 존재하지 않는 요소에 값을 할당할 수 있습니다. 이러한 시도는 정의되지 않은 동작입니다. (정의되지 않은 동작 109 참조) 이 정의되지 않은 동작의 결과는 버퍼 오버플로입니다. 공통 약점 열거 데이터베이스에서 이 프로그래밍 오류에 대한 설명은 CWE-121, “스택 기반 버퍼 오버플로” 및 CWE-805,”잘못된 길이 값을 가진 버퍼 액세스”를 참조하십시오. 좋아, DDK에서 ntfsi.h 파일에서 올바른 정의를 발견하고 예제를 수정했습니다. 또한 심링크와 정션에 대한 지원을 추가 😉 다시 감사합니다! 당신은 우리의 예가 조금 너무 모순되는 것이 정확합니다. 나는 당신의 제안에 따라 예제를 업데이트했습니다, 감사합니다! _strncpy_s_l, _wcsncpy_s_l 및 _mbsncpy_s_l은 로캘 종속성을 가지지 않으며 _tcsncpy_s_l에 대해서만 제공되며 직접 호출되지 않습니다. 자동 변수의 레이아웃과 오류 감지 및 코드 보호 수준은 변경된 컴파일러 설정에 따라 다를 수 있습니다. 이 예제에서는 다른 컴파일 환경이나 다른 컴파일러 옵션에 내장된 경우 다른 결과를 가질 수 있습니다. 유효 크기의 예로 위의 를 사용합니다.

보장 언어가 너무 강하다. 가리키는 대 지역에서 작동하는 함수를 사용하는 경우 프로그래머는 함수에서 예상하는 요소 수측면에서 항상 정수 크기를 표현해야 합니다. 예를 들어 memcpy()는 void *로 표현된 요소 수를 기대하지만 wmemcpy()는 wchar_t*로 표현된 요소 수를 기대합니다. sizeof 연산자 대신 문자열의 요소 수를 반환하는 함수가 호출되어 복사 함수에 대한 예상 요소 수와 일치합니다. 이러한 규정 준수 솔루션의 경우, 인수가 T형 A의 배열, 식 sizeof(A) /sizeof(T) 또는 이에 상응하는 sizeof(A)/sizeof(*A)가 어레이의 엘리먼트 수를 계산하는데 사용될 수 있다. 이 비준수 코드 예제에서는 잘못된 요소 수가 wmemcpy()에 대한 호출에서 사용됩니다.