Format
#include <string.h> void *_debug_memcpy(void *dest, const void *src, size_t count, const char *file, size_t line);
Language Level: Extension
_debug_memcpy is the debug version of memcpy. Like memcpy, it copies count bytes of src to dest, where the behavior is undefined if copying takes place between objects that overlap.
_debug_memcpy validates the heap after copying the bytes to the target location, and performs this check only when the target is within a heap. _debug_memcpy makes an implicit call to _heap_check. If _debug_memcpy detects a corrupted heap when it makes a call to _heap_check, _debug_memcpy will report the file name file and line number line in a message.
Note: _debug_memcpy checks only the current default heap. Therefore, this debug support will not check all heaps within applications that have multiple user heaps.
To use _debug_memcpy, you must compile with the debug memory -qheapdebug compiler option. This option maps all memcpy calls to _debug_memcpy. You do not have to change your source code, in order for _debug_memcpy to verify the heap.
Note: The -qheapdebug option maps all calls to other string functions and all calls to memory management functions (including a heap-specific version), to their debug counterparts. To prevent a call from being mapped, parenthesize the function name.
Return Value
_debug_memcpy returns a pointer to dest.
Example
This example contains a programming error. On the memcpy
used to initialize the target location, the count is more than
the size of the target object, and the memcpy
operation copies bytes past the end of the allocated object.
#include <stdlib.h> #include <string.h> #include <stdio.h>
#define MAX_LEN 10
int main(void) { char *source, *target;
target = (char*)malloc(MAX_LEN); memcpy(target, "This is the target string", 11);
printf("Target is \"%s\"\n", target); return 0;
/**************************************************************************** The output should be similar to:
End of allocated object 0x00073c80 was overwritten at 0x00073c8a. The first eight bytes of the memory block (in hex) are: 5468697320697320. This memory block was (re)allocated at line number 11 in memcpy.c. Heap state was valid at line 11 of memcpy.c. Memory error detected at line 12 of memcpy.c. ****************************************************************************/ }
Debugging Memory Heaps
Memory Management Functions
Managing Memory with Multiple
Memory Heaps
Debugging Problems with Heap
Memory
-qheapdebug Compiler
Option
_debug_calloc - Allocate and Initialize
Memory
_debug_free - Free Allocated Memory
_debug_heapmin - Free Unused Memory in the
Default Heap
_debug_malloc - Allocate Memory
_debug_memmove - Copy Bytes
_debug_memset - Set Bytes to Value
_debug_realloc - Reallocate Memory Block
_debug_strcat - Concatenate Strings
_debug_strcpy - Copy Strings
_debug_strncat - Concatenate Strings
_debug_strncpy - Copy Strings
_debug_strnset - Set Characters in String
_debug_strset - Set Characters in String
_debug_ucalloc - Reserve and Initialize
Memory from User Heap
_debug_uheapmin - Free Unused Memory in
User Heap
_debug_umalloc - Reserve Memory Block from
User Heap