2017-12-12 25 views
-1

C에서 포인터와 메모리가 작동하는 방식에 대해 자세히 알아보기 위해 malloc()과 다양한 문자열 함수 간의 상호 작용을 테스트했지만 다음 상호 작용에 대해서는 약간 혼란 스럽습니다.malloc 및 strcpy 상호 작용

char *myString = malloc(5); // enough space for 5 characters (no '\0') 
strcpy(myString, "Hello"); // shouldn't work since there isn't enough heap memory 
printf(%s, %zd\n", myString, strlen(myString)); // also shouldn't work without '\0' 
free(myString); 

위의 모든 사항이 제대로 작동하는 것으로 보입니다. 각 문자에 대해 null 종결자가 있는지 확인하기 위해 printf()를 사용해 보았지만 '\ 0'이 공백으로 인쇄하는 것처럼 보입니다.

  • 문자열 리터럴은 항상 암시 널 종료가됩니다

    내 혼란에있다.

  • 의 strcpy는 MyString의에 null 종결을 복사해야하지만, 충분히 할당 된 힙 메모리가없는
  • mystring에 터미네이터를하지 않는 한
  • 의 printf/strlen 함수가 작동하지해야
  • mystring에 분명히 널 (NULL) 종료를 가지고 있기 때문에

, 어디 있니? 임의의 메모리 위치에 배치 되었습니까? 위의 코드가 발생하기를 기다리고있는 오류입니까?

+4

버퍼 오버런. – jxh

+8

나를 따라 반복 : "정의되지 않은 동작"은 "정의되지 않음"을 의미합니다. "실패 보장", "경고 발생"또는 예측 가능한 다른 의미는 아닙니다. 그것이 효과가 있기 때문에, 그것이 잘못된 것은 아무것도 없다는 것을 의미하지는 않습니다. –

+5

버퍼를 오버런하여 정의되지 않은 동작을 호출합니다. "위의 모든 것이 제대로 작동하는 것"이라는 것이 당신에게 운이 좋은 것입니다. 정말로 _un_lucky라고 말해야합니다. 문제가 생길 때 프로그램이 충돌하여 프로그램을 고칠 수 있기를 바랍니다. 그렇지 않으면, 그들은 가장 부적절한 때에 나타납니다 ... – yano

답변

3

주소 당신의 세 점 :

  • 문자열 리터럴은 항상 암시 널 종료가됩니다.

수정.

  • 의 strcpy는 MyString의에 null 종결을 복사해야하지만, 거기에 충분히 할당 된 힙 메모리

strcpy가 아닌 대상 버퍼가 얼마나 큰 알 수있는 방법이 없습니다 행복하게 과거 쓸 것 (버퍼 오버런이나 버퍼 오버 플로우)에 대한 정보는 일반적인 보안 취약점을 참조하십시오. 더 안전한 버전을 얻으려면 대상 버퍼 길이를 인수로 취하여 끝에 도달하지 않도록 strncpy을 사용하십시오. mystring에가 '작동 안'터미네이터

prhase을 가지고 있지 않는

  • 의 printf/strlen 함수가 작동하지 말아야 여기에 조금 모호합니다. printf/strlen/etc는 널 터미네이터가 발견 될 때까지 메모리를 통해 계속 읽습니다.이 문자열은 문자열 바로 뒤에 있거나 수천 바이트 떨어져있을 수 있습니다 (예를 들어 myString 바로 뒤에 null 종결자가 메모리에 작성되어 있으므로 printf/strlen/etc가 멈출 것입니다.)

    마지막으로 : - 위의 코드는 대기중인 오류입니까?

    예. 덮어 쓰게 된 것에 따라 문제의 장이 발생할 수있는 할당되지 않은 메모리를 덮어 씁니다. strcpy 사람 페이지에서 하십시오의 strcpy()의 목적지 문자 충분하지 않은 경우

    , 다음 , 어떠한 일이 발생할 수있다. 오버플로되는 고정 길이 문자열 버퍼는 기계를 완전히 제어하기 위해 자주 사용되는 크래커 기법입니다. 프로그램이 버퍼에 데이터를 읽거나 복사 할 때마다 프로그램은 먼저 충분한 공간이 있는지 확인해야합니다. 오버 플로우가 불가능하다는 것을 보여줄 수 있다면 이것은 불필요 할 수 있지만주의해야합니다. 프로그램이 시간이 지남에 따라 불가능해질 수있는 방법으로 변경 될 수 있습니다.

+0

'strncpy()'는 지정된 제한을 초과하여 쓰지는 않지만, 복사 된 데이터가 문자열 일 필요는 없다는 단점이 있습니다. 끝에 null 바이트가 없을 수도 있습니다. –