디버그 모드 용으로 컴파일 될 때 다양한 비트의 소유되지 않은 / 초기화되지 않은 메모리에 Microsoft 컴파일러가 사용하는 내용에 대한 간략한 요약 (지원은 컴파일러 버전에 따라 다름) :
Value Name Description
------ -------- -------------------------
0xCD Clean Memory Allocated memory via malloc or new but never
written by the application.
0xDD Dead Memory Memory that has been released with delete or free.
It is used to detect writing through dangling pointers.
0xED or Aligned Fence 'No man's land' for aligned allocations. Using a
0xBD different value here than 0xFD allows the runtime
to detect not only writing outside the allocation,
but to also identify mixing alignment-specific
allocation/deallocation routines with the regular
ones.
0xFD Fence Memory Also known as "no mans land." This is used to wrap
the allocated memory (surrounding it with a fence)
and is used to detect indexing arrays out of
bounds or other accesses (especially writes) past
the end (or start) of an allocated block.
0xFD or Buffer slack Used to fill slack space in some memory buffers
0xFE (unused parts of `std::string` or the user buffer
passed to `fread()`). 0xFD is used in VS 2005 (maybe
some prior versions, too), 0xFE is used in VS 2008
and later.
0xCC When the code is compiled with the /GZ option,
uninitialized variables are automatically assigned
to this value (at byte level).
// the following magic values are done by the OS, not the C runtime:
0xAB (Allocated Block?) Memory allocated by LocalAlloc().
0xBAADF00D Bad Food Memory allocated by LocalAlloc() with LMEM_FIXED,but
not yet written to.
0xFEEEFEEE OS fill heap memory, which was marked for usage,
but wasn't allocated by HeapAlloc() or LocalAlloc().
Or that memory just has been freed by HeapFree().
면책 조항 : 테이블은 내가 누워있는 메모 중 일부입니다 .100 % 정확하지 않거나 일관성이 없을 수 있습니다.
이러한 값 중 다수는 vc / crt / src / dbgheap.c에 정의되어 있습니다.
/*
* The following values are non-zero, constant, odd, large, and atypical
* Non-zero values help find bugs assuming zero filled data.
* Constant values are good, so that memory filling is deterministic
* (to help make bugs reproducible). Of course, it is bad if
* the constant filling of weird values masks a bug.
* Mathematically odd numbers are good for finding bugs assuming a cleared
* lower bit.
* Large numbers (byte values at least) are less typical and are good
* at finding bad addresses.
* Atypical values (i.e. not too often) are good since they typically
* cause early detection in code.
* For the case of no man's land and free blocks, if you store to any
* of these locations, the memory integrity checker will detect it.
*
* _bAlignLandFill has been changed from 0xBD to 0xED, to ensure that
* 4 bytes of that (0xEDEDEDED) would give an inaccessible address under 3gb.
*/
static unsigned char _bNoMansLandFill = 0xFD; /* fill no-man's land with this */
static unsigned char _bAlignLandFill = 0xED; /* fill no-man's land for aligned routines */
static unsigned char _bDeadLandFill = 0xDD; /* fill free objects with this */
static unsigned char _bCleanLandFill = 0xCD; /* fill new objects with this */
또한 디버그 런타임이 알려진 값으로 버퍼 (또는 버퍼의 일부)를 채울 때도 있습니다 (예 : std::string
할당시 '느슨한'공간 또는에 전달 된 버퍼) fread()
. 이러한 경우 이름에 지정된 값 _SECURECRT_FILL_BUFFER_PATTERN
(에서 정의 됨 crtdefs.h
)을 사용합니다. 정확히 언제 도입되었는지는 확실하지 않지만 적어도 VS 2005 (VC ++ 8)에 의해 디버그 런타임에있었습니다.
처음에이 완충재를 채우는 데 사용 된 값은 0xFD
사람의 땅이없는 경우와 동일한 값 이었습니다 . 그러나 VS 2008 (VC ++ 9)에서는 값이로 변경되었습니다 0xFE
. 필자가 호출자가 너무 큰 버퍼 크기를 전달한 경우와 같이 채우기 작업이 버퍼 끝을지나 실행되는 상황이있을 수 있다고 가정합니다 fread()
. 이 경우 0xFD
버퍼 크기가 1만큼 너무 클 경우 채우기 값은 해당 카나리아를 초기화하는 데 사용 된 사람이없는 토지 값과 동일하므로이 오버런 감지를 트리거하지 않을 수 있습니다. 사람의 토지가 변하지 않으면 오버런이 감지되지 않습니다.
따라서 VS 2008에서는 채우기 값이 변경되어 무인 토지 카나리아가 변경되어 런타임에 의해 문제가 감지되었습니다.
다른 사람들이 지적했듯이, 이러한 값의 주요 속성 중 하나는 이러한 값 중 하나를 가진 포인터 변수가 역 참조되면 표준 32 비트 Windows 구성에서 사용자 모드 주소 때문에 액세스 위반이 발생한다는 것입니다 0x7fffffff보다 높지 않습니다.