memset, memset_explicit, memset_s
From cppreference.net
|
헤더 파일에 정의됨
<string.h>
|
||
|
void
*
memset
(
void
*
dest,
int
ch,
size_t
count
)
;
|
(1) | |
|
void
*
memset_explicit
(
void
*
dest,
int
ch,
size_t
count
)
;
|
(2) | (C23부터) |
|
errno_t memset_s
(
void
*
dest, rsize_t destsz,
int
ch, rsize_t count
)
;
|
(3) | (C11부터) |
1)
dest
가 가리키는 객체의 첫
count
개 문자 각각에
(
unsigned
char
)
ch
값을 복사합니다.
dest 배열의 끝을 넘어서 접근이 발생하면 동작은 정의되지 않습니다.
dest
가 널 포인터인 경우 동작은 정의되지 않습니다.
2)
(1)
과 동일하지만, 민감한 정보에 대해 안전합니다.
3)
(1)
과 동일하지만, 다음 오류들이 런타임에 감지되고 대상 범위
[
dest, dest
+
destsz
)
의 모든 위치에
ch
를 저장한 후 현재 설치된
constraint handler
함수를 호출합니다(
dest
와
destsz
가 자체적으로 유효한 경우):
-
-
dest가 null 포인터인 경우 -
destsz또는count가 RSIZE_MAX 보다 큰 경우 -
count가destsz보다 큰 경우 (버퍼 오버플로우가 발생할 경우)
-
dest
가 가리키는 문자 배열의 크기가
count
<=
destsz
보다 작은 경우 동작은 정의되지 않습니다. 다시 말해,
destsz
의 잘못된 값은 임박한 버퍼 오버플로우를 노출하지 않습니다.
-
모든 경계 검사 함수와 마찬가지로,
memset_s는 구현에 의해 __STDC_LIB_EXT1__ 가 정의되고 사용자가 __STDC_WANT_LIB_EXT1__ 를 정수 상수 1 으로 정의한 경우에만 사용 가능함이 보장됩니다. <string.h> 를 포함하기 전에 정의해야 합니다.
목차 |
매개변수
| dest | - | 채울 객체에 대한 포인터 |
| ch | - | 채우기 바이트 |
| count | - | 채울 바이트 수 |
| destsz | - | 대상 배열의 크기 |
반환값
1,2)
dest
의 복사본
3)
성공 시 0을 반환하고, 오류 시 0이 아닌 값을 반환합니다. 또한 오류 발생 시,
dest
가 null 포인터가 아니고
destsz
가 유효한 경우, 대상 배열에
destsz
개의 채우기 바이트
ch
를 기록합니다.
참고 사항
memset
는 이 함수로 수정된 객체가 수명 동안 다시 접근되지 않으면 (예:
as-if
규칙에 따라) 최적화되어 제거될 수 있습니다 (예:
gcc bug 8537
). 이러한 이유로 이 함수는 메모리를 소거하는 데 (예: 비밀번호를 저장했던 배열을 0으로 채우는 등) 사용할 수 없습니다.
이 최적화는
memset_explicit
와
memset_s
에 대해 금지됩니다: 이들은 메모리 쓰기를 수행한다는 것이 보장됩니다.
이를 위한 타사 솔루션으로는 FreeBSD의
explicit_bzero
또는 Microsoft의
SecureZeroMemory
가 있습니다.
예제
이 코드 실행
#define __STDC_WANT_LIB_EXT1__ 1 #include <stdio.h> #include <string.h> #include <stdlib.h> int main(void) { char str[] = "ghghghghghghghghghghgh"; puts(str); memset(str,'a',5); puts(str); #ifdef __STDC_LIB_EXT1__ set_constraint_handler_s(ignore_handler_s); int r = memset_s(str, sizeof str, 'b', 5); printf("str = \"%s\", r = %d\n", str, r); r = memset_s(str, 5, 'c', 10); // count is greater than destsz printf("str = \"%s\", r = %d\n", str, r); #endif }
가능한 출력:
ghghghghghghghghghghgh aaaaahghghghghghghghgh str = "bbbbbhghghghghghghghgh", r = 0 str = "ccccchghghghghghghghgh", r = 22
참고문헌
- C17 표준 (ISO/IEC 9899:2018):
-
- 7.24.6.1 memset 함수 (p: 270)
-
- K.3.7.4.1 memset_s 함수 (p: 451)
- C11 표준 (ISO/IEC 9899:2011):
-
- 7.24.6.1 memset 함수 (p: 371)
-
- K.3.7.4.1 memset_s 함수 (p: 621-622)
- C99 표준 (ISO/IEC 9899:1999):
-
- 7.21.6.1 memset 함수 (p: 333)
- C89/C90 표준 (ISO/IEC 9899:1990):
-
- 4.11.6.1 memset 함수
참고 항목
|
(C11)
|
버퍼를 다른 버퍼로 복사합니다
(함수) |
|
(C95)
|
주어진 와이드 문자를 와이드 문자 배열의 모든 위치에 복사합니다
(함수) |
|
C++ documentation
for
memset
|
|