문제

32 비트 시스템의 C ++ 개발 (Linux, 맥 OS 또는 창문, PowerPC 또는 x86) 그렇지 않으면 정의되지 않은 포인터를 초기화했습니다 (예 : 즉시 적절한 값을 얻을 수 없음).

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

(타이핑과 존재를 저장하기 위해 마른 오른쪽은 일반적으로 일정한 일이 될 것입니다 (예 : bad_ptr.)

파인트가 적절한 값을 얻기 전에 파인트가 불필요하면 대부분의 시스템에서 즉시 충돌합니다 (일부 메모리가 덮어 쓰거나 매우 긴 루프로 들어가는 경우 훨씬 나중에 충돌하는 대신).

물론 동작은 기본 하드웨어에 따라 다릅니다 (홀수 주소에서 4 바이트 정수를 사용하여 사용자 프로세스에서 0xdeadbeef를 완벽하게 유효 할 수 있음). 충돌은 지금까지 개발 한 모든 시스템에 대해 100% 신뢰할 수 있습니다. 맥 OS 68xxx, Mac OS PowerPC, Linux Redhat Pentium, Windows Gui Pentium, Windows 콘솔 Pentium). 예를 들어 PowerPC에서는 홀수 주소에서 4 바이트 정수를 가져 오는 것이 불법 (버스 오류)입니다.

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

도움이 되었습니까?

해결책

일반적으로 중요하지 않습니다 바로 그거죠 어떤 패턴을 쓰는지, 문제가 발생하는 위치를 결정하기 위해 패턴을 식별 할 수 있어야합니다. Linux 커널에서 주소가 해석되면 갇힐 수 있도록 종종 선택됩니다.

Linux 커널을 살펴보십시오 포함/Linux/Poison.h. 이 파일에는 여러 다른 커널 서브 시스템에 대해 다른 독 값이 포함되어 있습니다. 적절한 독이있는 사람은 없습니다.

또한 특정 아키텍처에서 사용되는 내용에 대한 정보를 위해 Linux 커널 소스 트리에 파일이 포함되어있는 자금마다 확인할 수 있습니다.

다른 팁

0xBADC0FFEE0DDF00D

Wikipedia에 따르면, BADC0FFEE0DDF00D는 IBM RS/6000 64 비트 시스템에서 사용되지 않은 CPU 레지스터를 나타냅니다.

대부분의 현재 64 비트 시스템 시스템은 최저 2 만 사용할 수 있습니다.48–252 주소 공간의 비트; 주소의 더 높은 비트는 모두 0이어야합니다. 일부 칩 (예 : AMD64)도 제일 높은 248–252. 이 범위 외부의 주소는 액세스 가능한 메모리에 매핑 될 수 없습니다. 하드웨어는 단순히 허용하지 않습니다.

따라서 2에 가까운 값을 사용하는 것이 좋습니다.63, 아마도 가능한 공간에 가까운 곳은 없습니다. 선행 4 개의 16 진수 숫자가 7ff8 인 경우 값은 이중 정밀 부동 소수점 NAN이되며 편리합니다. 그래서 나의 제안 된 귀여운 16 진수 문구는 0x7ff8badfbadfbadf입니다.

그건 그렇고, 당신은 실제로 0에 가까운 값을 사용하고 싶지 않습니다. 오프셋 독 패턴의 피로에서 NULL (예 : 구조 부재 액세스)의 불쾌감.

나는 당신이 이미 null을 할인했다고 가정합니다 (즉, typecast가없는 0). 이론적으로 유효한 포인터와 같이 가장 안전한 선택입니다. ~할 수 있었다 메모리 주소 0xdeadbeef (또는 다른 비 널 메모리 주소)를 가리 킵니다.

0xDEADBEEFBAADF00D 작동 할 수도 있습니다.

나는 당신에게 좋은 선택이 없지만 여기에 있습니다. 16 진 단어 목록 문구를 만드는 데 사용할 수 있습니다.

두 개의 0xdeadbeefs가 충분해야한다고 생각합니다 ..

나는 null이 좋은 선택이라고 주장하는 몇 가지 답변을 보았지만 동의하지 않습니다.

NULL은 종종 함수에서 유효한 반환 값으로 사용됩니다. 실패 리턴 또는 알 수없는 값을 나타냅니다. 이것은 "비 초기의 포인터"와는 다른 의미입니다.

코드에서 디버거를 사용하고 NULL을 보는 것은 두 가지 가능성을 남길 것입니다. 포인터는 초기화되지 않았거나 메모리 할당에 실패했습니다.

비 초기 포인터를 0xdeadbeef 또는 64 비트 등가로 설정하면 널 포인터가 의도적 인 값을 나타내는 것을 의미합니다.

물론 OS와 환경에 따라 다릅니다. 0xdeadbeef가 임의의 32 비트 시스템에서도 반드시 나쁜 포인터라고 생각하지 않습니다.

현실적으로 모든 최신 OS는 프로세스 메모리의 처음 몇 페이지를 액세스 보호해야하므로 NULL은 유효하지 않은 포인터 값이어야합니다. 편리하게 충분히, 그것은 이미 당신을 위해 사전 정의되어 있습니다.

0x42 32 비트와 64 비트 모두에서 작동 할 수 있습니까? (널 포인터에 충분히 가까이 있기 때문에 충돌이 계속 발생해야하며, 다소 크다는 점을 감안할 때 구조 포인터가 널이면 구조 필드의 정기적 인 피로 내에 없을 가능성이 높습니다).

내가 작업 한 시스템은 기본적으로 X86_64 플랫폼에서 실행되므로 사용하는 값은 다음과 같습니다.

0xDEADBEEFDEADBEEF

이유는 다음과 같습니다.

  • X86_64 플랫폼에서는 현재 구현에서 가상 메모리 주소에 저격자 48 비트 만 사용되므로 모든 값이 2^48이 작동해야합니다. https://en.wikipedia.org/wiki/x86-64
  • 처럼 0xDEADBEEF 32 비트 에서이 목적으로 이미 잘 알려져 있습니다. 0xDEADBEEFDEADBEEF 64 비트에서 더 '후진 호환'입니다.
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top