문제

여러분 중 일부는 알 수 있듯이 Microsoft가 금지되었습니다 memcpy() 그들의 보안 개발 수명주기에서, 그것을 대체합니다 memcpy_s().

void *memcpy(void *dest, const void *src, size_t n);

/* simplified signature */
errno_t memcpy_s(void *dst, size_t dstsize, const void *src, size_t n);

따라서 코드가 예전 인 경우 :

if (in_len > dst_len) {
    /* error */
}
memcpy(dst, src, in_len);

그것은 :

if (memcpy_s(dst, dst_len, src, src_len)) {
    /* error */
}

또는 잘린 상태로

memcpy(dst, src, min(in_len, dst_len));

vs

(void)memcpy_s(dst, dst_len, src, src_len);

질문 : 추가 길이 매개 변수는 어떻게 코드를 더 안전하게 만드는가? 사용 memcpy(), 나는 이미 네 가지 매개 변수를 모두 가지고 있어야하고 적절한 길이를 세 번째 인수로 전달해야합니다. 내가 목적지 버퍼 크기를 잘못 계산하고 잘못된 밸러스를 통과시키는 것과 같은 실수를 막는 것을 막는 것 dst_size? 왜 다른지 알 수 없습니다 memcpy() 그리고 왜 그것이 더 이상 사용되지 않는지. 내가 볼 수없는 공통 사용 사례가 있습니까? 내가 여기서 무엇을 놓치고 있습니까?

도움이 되었습니까?

해결책

"Secure"버전에서 매개 변수를 잘못받지 못하게하는 것은 없습니다. Microsoft는 항상 다음과 같은 것을 사용할 것이라고 생각하는 것 같습니다.

errno_t e = memcpy_s (&dstbuff, sizeof(dstbuff), &srcbuff, sizeof(srcbuff));

오류를 확인하십시오.

그러나 이것은 언어로 무엇을하고 있는지 모르는 사람들만을 돕습니다. 제 생각에는 해당 그룹의 사람들이 언어를 사용해서는 안됩니다. 또는 언어가 제대로 작동하는 방식을 배워야합니다.

이런 종류의 목발은 코드가 휴대용이되지 않기 때문에 장기적으로 호의를 보이지 않습니다.

이제 Microsoft가 약간의 분석을 수행 한 결과 사람들이 오용하는 사람들로 인한 많은 문제가 있음을 발견했습니다. memcpy() 그리고 그들은 이것이 고칠 것이라고 생각했습니다. 그러나 그렇다면, 더 나은 솔루션은 개발자가 표준 컴파일러에서 사용할 수없는 비표준 기능을 사용하도록 강요하는 것보다 교육하는 것입니다.

다른 팁

정보의 복제는 항상 나쁜 디자인입니다. 그것은 당신에게 무언가 잘못 될 수있는 더 많은 기회를 제공합니다. Microsoft는 API 디자인과 관련하여 Appaling Record를 가지고 있으며 과거에 문서의 우수성에 의해서만 저장되었습니다. 편안한 것은 원래 memcpy () 함수를 제거 할 수 없다는 것입니다.

당신은 절대적으로 맞습니다. 두 버퍼의 길이를 모두 추적하는 경우 Memcpy가 안전합니다. 그렇지 않다면 Memcpy_S는 당신을 구할 수 없습니다.

당신은 아무것도 놓치지 않습니다. 나는 당신이 링크 한 기사 에서이 스 니펫이 거의 그것을 다루고 있다고 생각합니다.

다른 것이 없다면, memcpy_s는 대상 버퍼의 크기에 대해 생각하게 만듭니다.

Microsoft에 따르면, 코드 품질 검사를 조금 더 쉽게 작성할 수 있습니다. 프로그래머가 두 크기 매개 변수에 동일한 값을 전달하지 않도록 확인할 수 있습니다 (많은 사람들이 여전히 게으름에서 벗어날 수있는). 다른 것 (실제로 코드 보안과 관련이없는 것은)은 코드에 할 수있는 수표가 적기 때문에이 방법을 사용하여 코드를 약간 정리할 수 있다는 것입니다. memcpy_s 기능은 대상 버퍼에 충분한 공간이 있는지 확인하여 수표 중 하나를 제거합니다.

무엇보다도 가장 중요합니다. memcpy_s 전체 사본이 성공했는지 여부를 나타내는 오류 코드를 반환하지만 memcpy 이것을 확신 할 방법이 없습니다. 이것 Microsoft가 느끼는 것입니다 memcpy_s 보다 안전합니다 memcpy.

C처럼 어셈블리는 자신이하고있는 일을 아는 사람들을위한 것입니다. K & R의 Direcly와 같은 것을 읽은 것을 기억합니다.

나는 실제로 때때로 이의를 제기합니다. 실제로 우리의 실제 프로그래머가 더 이상 남아있는 사람이 많지 않습니다. 내가 아는 주제는 조금 벗어나지 만, 나는 무슨 일이 일어나고 있는지 정확히 알고 싶고, 절름발이 엉덩이 쓰레기 수집가가 배경을 주위를 돌아 다니는 것을 원하지 않는다. 내 말은, Malloc ()/strdup ()에 대한 호출과 함께 무료 ()에 대한 통화를 일치시키는 것이 얼마나 어렵다는 것을 의미합니다. memcpy () saefly를 호출 할 수 있다는 것을 알기 위해 충분한 버퍼 공간을 할당했는지 확인하기가 얼마나 어렵습니까? 답변 : 그다지는 아니지만 프로그래머의 99.9%는 그들이 돈을 위해 단지 돈을 위해하고있는 일을 신경 쓰지 않기 때문에 실제로 자신이하고있는 일을 신경 쓰지 않습니다.

끝 rant.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top