>

32 비트 시스템 용 C ++ 개발의 경우 (Linux이면 Mac OS 또는 Windows, PowerPC 또는 x86) 포인터를 초기화했습니다. 그렇지 않으면 정의되지 않을 것입니다 (예 : 즉시 정의 할 수 없음) 적절한 값을 얻으십시오) :

int *pInt = reinterpret_cast<int *>(0xDEADBEEF);

(타이핑을 저장하고 건조 하려면 일반적으로 오른쪽 일정해야합니다 (예 : BAD_PTR.)

pInt가 적절한 값을 얻기 전에 역 참조 된 경우 대신 대부분의 시스템에서 즉시 충돌합니다. 일부 메모리를 덮어 쓰거나 쓸 때 훨씬 나중에 충돌 매우 긴 루프로).

물론 행동은 기본에 의존합니다 하드웨어 (홀수에서 4 바이트 정수 가져 오기) 사용자 프로세스의 주소 0xDEADBEEF는 완벽 할 수 있습니다. 유효), 그러나 충돌은 모든 지금까지 개발 한 시스템 (Mac OS 68xxx , Mac OS PowerPC, Linux Redhat Pentium, Windows GUI 펜티엄, Windows 콘솔 펜티엄). 예를 들어 PowerPC에서는 불법입니다 (버스 홀수 주소에서 4 바이트 정수를 가져옵니다.

64 비트 시스템에서 이것의 좋은 가치는 무엇입니까?


  • 답변 # 1

    일반적으로 어떤 패턴을 작성하든정확하게중요하지 않으며, 문제가 발생한 위치를 파악하기 위해 패턴을 식별 할 수 있어야합니다. Linux 커널에서는 주소가 역 참조 될 경우 트랩 될 수 있도록 종종 선택됩니다.

    include/linux/poison.h에서 Linux 커널을 살펴보십시오. 이 파일에는 다양한 커널 하위 시스템에 대한 다른 포이즌 값이 포함되어 있습니다. 적절한 독 값은 없습니다.

    또한 특정 아키텍처에서 사용되는 것에 대한 정보는 Linux 커널 소스 트리에서 아키텍처 별 포함 파일을 확인할 수 있습니다.

  • 답변 # 2

    0xBADC0FFEE0DDF00D

  • 답변 # 3

    Wikipedia에 따르면 BADC0FFEE0DDF00D는 IBM RS/6000 64 비트 시스템에서 초기화되지 않은 CPU 레지스터를 나타 내기 위해 사용됩니다.

  • 답변 # 4

    현재 64 비트 시스템 중 가장 낮은 것만 사용할 수 있습니다 어드레스 공간의 2<48>-2<52>. 주소의 상위 비트는 모두 0이어야합니다. 일부 칩 (예 : amd64)에서도highest248–252을 사용할 수 있습니다. 이 범위 밖의 주소는 액세스 가능한 메모리에 매핑 할 수 없습니다. 하드웨어는 단순히 그것을 허용하지 않습니다.

    따라서 263에 가까운 값을 사용하는 것이 좋습니다.이 값은 사용 가능한 공간 중 어디에도 없습니다. 선행 4 자리 16 진수가 7ff8이면이 값은 배정 밀도 부동 소수점 NaN이되므로 편리합니다. 그래서 내 제안 된 귀여운 16 진수 문구는 0x7FF8BADFBADFBADF입니다.

    그러면 실제로 0에 가까운 값을 사용하고 싶지 않습니다. 왜냐하면offset역 참조 (예 : 구조 멤버 액세스)를 알리기 어렵 기 때문입니다. 포이즌 패턴의 역 참조.

  • 답변 # 5

    Null을 이미 할인했다고 가정합니다 (예 : typecast가없는 0). 이론적으로 유효한 포인터는메모리 주소 0xDEADBEEF (또는 NULL이 아닌 다른 메모리 주소)를 가리킬 수 있으므로 가장 안전한 선택입니다

    .

  • 이전 MySQL date_format () 함수 대 SQL Like 연산자
  • 다음 php - 하나의 열로 하위 배열을 그룹화하고 그룹 내의 다른 열에서 쉼표로 구분 된 값을 만듭니다