사람들이 " strcpy()
위험하다, strncpy()
대신 사용"(또는 strcat()
기타에 대한 유사한 설명 을 사용하지만 strcpy()
여기에서 초점 으로 사용할 것 입니다) 이라고 말하면 체크인하는 경계가 없음을 의미합니다 strcpy()
. 따라서 문자열이 너무 길면 버퍼 오버런이 발생합니다. 정확합니다. strncpy()
이 경우 사용하면 버퍼 오버런을 방지 할 수 있습니다.
나는 그것이 strncpy()
정말로 버그를 고치지 않는다고 느낀다 . 그것은 좋은 프로그래머가 쉽게 피할 수있는 문제를 해결한다.
C 프로그래머로서, 당신은 해야한다 당신이 문자열을 복사하려고하기 전에 대상 크기를 알고있다. 그것은 가정 strncpy()
및 strlcpy()
의 마지막 매개 변수이기도합니다. 그 크기를 그들에게 제공합니다. 문자열을 복사하기 전에 소스 크기를 알 수도 있습니다. 그런 다음 목적지가 충분히 크지 않으면 전화하지 마십시오.strcpy()
. 버퍼를 재 할당하거나 다른 작업을 수행하십시오.
나는 왜 싫어 strncpy()
합니까?
strncpy()
대부분의 경우에 나쁜 솔루션입니다. 문자열이 예고없이 잘릴 것입니다.이 문제를 직접 파악하기 위해 추가 코드를 작성한 다음 일부 함수가 결정하도록하는 것보다 원하는 작업을 수행합니다. 나에게 무엇을 해야할지.
strncpy()
매우 비효율적입니다. 대상 버퍼의 모든 바이트에 기록합니다. 수천 개의'\0'
목적지 끝에 .
'\0'
목적지가 충분히 크지 않으면 종결을 쓰지 않습니다 . 그래서 어쨌든 당신은 그렇게해야합니다. 이 작업의 복잡성은 문제의 가치가 없습니다.
이제 strlcpy()
. 의 변화로 strncpy()
인해 더 strl*
나아졌지 만의 특정 행동이 그 존재 를 보장 하는지 확실하지 않습니다 . 너무 구체적입니다. 여전히 대상 크기를 알아야합니다. strncpy()
대상의 모든 바이트에 반드시 쓸 필요는 없기 때문에 보다 효율적 입니다. 그러나 다음을 수행하여 해결할 수있는 문제를 해결합니다 *((char *)mempcpy(dst, src, n)) = 0;
..
나는 누군가 가 보안 문제를 일으키 strlcpy()
거나 strlcat()
그로 이어질 수 있다고 생각하지 않습니다. 예를 들어 전체 문자열이 일부 대신 작성 될 것으로 예상 할 때 버그가 발생할 수 있다고 말하는 것입니다.
여기서 주요 문제는 복사 할 바이트 수입니다. 프로그래머는이를 알고 있어야 그가하지 않는 경우, strncpy()
또는 strlcpy()
그를 저장하지 않습니다.
strlcpy()
및 strlcat()
표준하지 아니하며 ISO C 나 POSIX. 따라서 휴대용 프로그램에서 사용하는 것은 불가능합니다. 사실, strlcat()
두 가지 변형이 있습니다. 솔라리스 구현은 길이 0을 포함하는 엣지 케이스에 대해 다른 구현과 다릅니다. 이것은 다른 것보다 훨씬 덜 유용합니다.
strlcpy
및strlcat
그들이 대상 버퍼 크기 한계에 부딪힌 경우 오류 조건의 일종을보고 할 것입니다. 이것을 테스트하기 위해 반환 된 길이를 확인할 수 있지만 명확하지 않습니다. 그러나 나는 그것이 사소한 비판이라고 생각합니다. '그들은 C 문자열 사용을 장려하므로 나쁘다'라는 주장은 어리 석습니다.