programing

C에서 NULL 포인터를 strcmp()로 전달하면 정확히 어떻게 됩니까?

iphone6s 2023. 9. 19. 20:56
반응형

C에서 NULL 포인터를 strcmp()로 전달하면 정확히 어떻게 됩니까?

저는 다음과 같이 정의되지 않은 행동을 초래한다는 것을 읽었습니다.

strcmp(foo, NULL); 

하지만 후드 밑에서 정확히 무슨 일이 일어나는 걸까요?foo쓰레기 데이터와 비교하면?NULL직무유기?"정의되지 않은 행동"을 야기하는 세부사항은 무엇입니까?

이는 구현에 따라 달라지며, 매개 변수가 유효하다고 가정할 수 있습니다(이 경우 null이 아님).동작은 실행에서 실행으로, 또는 구현/플랫폼에서 다른 플랫폼으로 재현될 수도 있고 재현되지 않을 수도 있습니다.

C11은 7.1.4의 "도서관 기능 사용"에서 이를 매우 명확히 합니다.

다음의 각 문은 다음의 상세한 설명에 달리 명시적으로 언급되지 않는 한 적용됩니다.함수에 대한 인수의 값이 잘못된 경우(예: [...] null 포인터 [...] [...]) 동작이 정의되지 않습니다.

에 대한 설명strcmp7.24.4에서 달리 명시하지 않으므로 동작은 확실히 정의되지 않습니다.

이것은 glibc에서 strcmp의 현재 구현입니다.

/* Compare S1 and S2, returning less than, equal to or
   greater than zero if S1 is lexicographically less than,
   equal to or greater than S2.  */
int
strcmp (p1, p2)
     const char *p1;
     const char *p2;
{
  const unsigned char *s1 = (const unsigned char *) p1;
  const unsigned char *s2 = (const unsigned char *) p2;
  unsigned char c1, c2;

  do
    {
      c1 = (unsigned char) *s1++;
      c2 = (unsigned char) *s2++;
      if (c1 == '\0')
    return c1 - c2;
    }
  while (c1 == c2);

  return c1 - c2;
}

두 개의 포인터를 전달하면 strcmp는 해당 내용을 다시 참조하여 차이 또는 null 문자를 충족시킬 때까지 비교합니다.다른 추상화 수준에서 실패가 발생하고 strcmp는 자체적으로 실패가 없습니다.많은 시스템에서 SIGSEGV 기호를 역참조 NULL 포인터로 생성하지만, 이는 요구 사항이 아닙니다.

ISO 표준은 많은 것을 정의하지 않으며 구현 세부 사항은 구현에 맡깁니다.ISO C 수준에서는 예제에 문제가 없지만 결과가 예측 가능하다고 보장되는 것은 아닙니다. (그리고 기본 시스템의 규칙을 참조하고 달리 말하지 않는 한 어떤 실용적인 테스트도 정확하고 재현 가능하다고 보장되지 않습니다.)

추상화 수준에 대해 이야기할 때 규칙이 명확하고 "그러지 마십시오. 행동은 여기서 정의되지 않습니다."라고 말하기 때문에 "만약에"라고 물을 수 없습니다.

언급URL : https://stackoverflow.com/questions/21865041/in-c-what-exactly-happens-when-you-pass-a-null-pointer-to-strcmp

반응형