wcsncpy_s 예제

  • 0

wcsncpy_s 예제

유효 크기의 예로 위의 를 사용합니다. 보장 언어가 너무 강하다. „두 개의 포인터와 하나의 정수”에 대한 예제 및 설명 텍스트를 더 잘 만들 수 있습니다. 다음은 자동 변수의 레이아웃과 오류 감지 및 코드 보호 수준이 변경된 컴파일러 설정에 따라 다를 수 있습니다. 이 예제에서는 다른 컴파일 환경이나 다른 컴파일러 옵션에 내장된 경우 다른 결과를 가질 수 있습니다. 다음 예제에서는 strncpy의 사용 및 프로그램 버그 및 보안 문제를 일으키는 데 오용될 수 있는 방법을 보여 줍니다. 컴파일러는 crt_strncpy_x86.c(15)와 유사한 strncpy에 대한 각 호출에 대한 경고를 생성합니다: 경고 C4996: `strncpy`: 이 함수 또는 변수는 안전하지 않을 수 있습니다. 대신 strncpy_s를 사용하는 것이 좋습니다. 사용 중단을 사용하지 않으려면 _CRT_SECURE_NO_WARNINGS를 사용합니다.

자세한 내용은 온라인 도움말을 참조하십시오. 이 비준수 코드 예제에서는 잘못된 요소 수가 wmemcpy()에 대한 호출에서 사용됩니다. sizeof 연산자는 바이트로 표현된 크기를 반환하지만 wmemcpy()는 wchar_t *를 기반으로 하는 요소 수를 사용합니다. 당신은 우리의 예가 조금 너무 모순되는 것이 정확합니다. 나는 당신의 제안에 따라 예제를 업데이트했습니다, 감사합니다! 이 비준수 코드 예제에서는 배열 a의 요소 수가 ARR_SIZE 요소입니다. memset()은 바이트 수를 예상하기 때문에 배열의 크기는 sizeof(long) 대신 sizeof(int) 대신 sizeof(int)에 의해 잘못 조정되며, 이는 sizeof(int) != sizeof(long)가 있는 아키텍처에서 잘못된 포인터를 형성할 수 있습니다. 이 비준수 코드 예제에서는 n값이 잘못 계산되어 q에서 참조하는 개체의 끝을 지나 읽기를 허용합니다. 또한 심링크와 정션에 대한 지원을 추가 😉 다시 감사합니다! 비준수 코드 조각은 실제로 문제가 아니라 ARR01-C 문제를 보여 줍니다. 함수 매개 변수 형식 char[]는 실제로 함수 본문에서 char*이므로 sizeof(p)는 배열이 아닌 포인터의 크기입니다.

이 예제를 유지하려면 문제에 대한 설명이 이 문제를 강조 표시할 수 있습니다. 이 비준수 코드 예제에서 함수 f()는 fread()를 호출하여 각 크기의 크기인 wchar_t 형식의 항목을 BUFFER_SIZE 요소의 배열인 wbuf로 읽습니다. 그러나 nitems값을 계산하는 데 사용되는 표현식은 char의 크기와 달리 wchar_t의 크기가 1보다 클 수 있다는 사실을 설명하지 못합니다. 따라서 fread()는 wbuf의 끝을 지나 포인터를 형성하고 이를 사용하여 배열의 존재하지 않는 요소에 값을 할당할 수 있습니다. 이러한 시도는 정의되지 않은 동작입니다. (정의되지 않은 동작 109 참조) 이 정의되지 않은 동작의 결과는 버퍼 오버플로입니다. 공통 약점 열거 데이터베이스에서 이 프로그래밍 오류에 대한 설명은 CWE-121, „스택 기반 버퍼 오버플로” 및 CWE-805,”잘못된 길이 값을 가진 버퍼 액세스”를 참조하십시오. 이 비준수 코드 예제는 n에 사용 가능한 메모리의 바이트 수보다 큰 값을 할당한 다음 memset()으로 전달됩니다: TS 17961에서 수행한 마지막 일 중 하나는 이 것에서 부족한 메모리 [insufmem]를 할당하는 것이었습니다. 이 규칙은 달리 표현하기가 너무 어려웠기 때문에 규칙입니다.