2017-03-13 4 views
-2
반면
memcpy(buf, buf + (pos - offset), len); 

, memcpy를 사용하는 것이 안전합니까?

0<=pos<=strlen(buf), 0<=offset<=strlen(buf) 

는이 시나리오에 memcpy()을 사용하는 것이 안전합니까? 그렇지 않다면 무엇이 잘못 될 수 있습니까? 최선의 방법을 제안하십시오.

+2

[documentation] (http://en.cppreference.com/w/c/string/byte/memcpy)에서 : * "객체가 겹치면 (이는 'restrict'계약 위반 임) (이후 C99), 동작은 정의되지 않았습니다. "* – UnholySheep

+2

여기서 물어보기 전에'memcpy'에 대한 매뉴얼을 읽을 수 있습니다. – i486

+1

충고 된대로 'memmove'를 사용하더라도'pos-offset'을 지정하는 한계는'<0' 일 수 있습니다. –

답변

2

는 C99 때문에, 방어 적이기는 다음과 같은 선언이

,536,
void* memcpy(void *restrict dest, const void *restrict src, size_t count); 

restrict은 포인터 개체가 포인터 자체를 통해서만 액세스된다는 것을 컴파일러에 알리는 키워드입니다. 기본적으로 이것은 컴파일러 (및 구현 자 memcpy)가 두 영역이 겹치지 않는다고 가정 할 수 있음을 의미합니다.

예를 들어 memcpy이 처음부터 바이트를 복사하는 간단한 반복으로 구현되는 경우 영역이 겹치지 않는 한 모든 것이 잘되며 실제로 소스 영역이 대상 지역. 그러나 영역이 겹치고 소스 영역이 대상 영역보다 낮은 주소에있는 경우 소스 영역의 끝 부분이 복사되기 전에 복사본에 의해 닫힙니다. 경우에 따라 가능합니다. pos - offset < 0offset - pos < len 오류가 발생할 수 있다고 가정 할 수도 없으며, 일부 컴퓨터 아키텍처에서는 상단에서 복사를 시작하고 해당 작업을 아래쪽으로 작업 할 수있는 지침을 제공합니다 memcpy은 대상이 대상 아래에 있고 겹치지 만 대상 위에 있지 않고 겹치는 경우 안전합니다. 귀하의 경우에 해당됩니다. len > pos - offset

따라서 중복 될 가능성이있는 경우 항상 memmove을 사용하십시오. 그러나 두 영역이 겹치지 않기 때문에 len <= pos - offset이면 안전합니다.

관련 문제