#include <assert.h>
#include <errno.h>
#include <stdint.h>
+#include <stdio.h>
#include "../../memcheck.h"
int main(void)
{
int *pi = NULL;
+ int *newpi;
VALGRIND_DO_LEAK_CHECK;
+ /* should succeed */
pi = reallocarray(pi, 10U, sizeof(int));
+ assert(pi);
+ fprintf(stderr, "Added leak check, expect 40 bytes still reachable\n");
VALGRIND_DO_ADDED_LEAK_CHECK;
+ /* on FreeBSD this does not free pi */
pi = reallocarray(pi, 0U, sizeof(int));
+ assert(pi);
+ fprintf(stderr, "Added leak check, expect 1 byte still reachable\n");
VALGRIND_DO_ADDED_LEAK_CHECK;
pi = reallocarray(pi, 10U, 0U);
+ assert(pi);
free(pi);
+ fprintf(stderr, "Added leak check, expect all blocks freed\n");
VALGRIND_DO_CHANGED_LEAK_CHECK;
pi = NULL;
pi = reallocarray(pi, 10U, sizeof(int));
+ assert(pi);
+ fprintf(stderr, "Added leak check, expect 40 bytes still reachable\n");
VALGRIND_DO_ADDED_LEAK_CHECK;
errno = 0;
- pi = reallocarray(pi, 1UL << 49, 1U);
- assert(!pi);
+ /* this will fail in the mallloc lib, not enough memory */
+ newpi = reallocarray(pi, 1UL << 49, 1U);
+ assert(!newpi);
assert(errno == ENOMEM);
+ fprintf(stderr, "Added leak check, expect 40 bytes still reachable\n");
VALGRIND_DO_CHANGED_LEAK_CHECK;
- pi = reallocarray(pi, SIZE_MAX/1000U, SIZE_MAX/1000U);
- assert(!pi);
+ /* this will fail the reallocarray precondition */
+ newpi = reallocarray(pi, SIZE_MAX/1000U, SIZE_MAX/1000U);
+ assert(!newpi);
assert(errno == ENOMEM);
+ free(pi);
+ fprintf(stderr, "Added leak check, expect all blocks freed\n");
VALGRIND_DO_CHANGED_LEAK_CHECK;
}
All heap blocks were freed -- no leaks are possible
+Added leak check, expect 40 bytes still reachable
LEAK SUMMARY:
definitely lost: 0 (+0) bytes in 0 (+0) blocks
indirectly lost: 0 (+0) bytes in 0 (+0) blocks
realloc() with size 0
at 0x........: reallocarray (vg_replace_malloc.c:...)
- by 0x........: main (reallocarray.c:13)
+ by 0x........: main (reallocarray.c:19)
Address 0x........ is 0 bytes inside a block of size 40 alloc'd
at 0x........: reallocarray (vg_replace_malloc.c:...)
- by 0x........: main (reallocarray.c:11)
+ by 0x........: main (reallocarray.c:14)
+Added leak check, expect 1 byte still reachable
LEAK SUMMARY:
definitely lost: 0 (+0) bytes in 0 (+0) blocks
indirectly lost: 0 (+0) bytes in 0 (+0) blocks
realloc() with size 0
at 0x........: reallocarray (vg_replace_malloc.c:...)
- by 0x........: main (reallocarray.c:15)
+ by 0x........: main (reallocarray.c:23)
Address 0x........ is 0 bytes inside a block of size 1 alloc'd
at 0x........: reallocarray (vg_replace_malloc.c:...)
- by 0x........: main (reallocarray.c:13)
+ by 0x........: main (reallocarray.c:19)
+Added leak check, expect all blocks freed
All heap blocks were freed -- no leaks are possible
+Added leak check, expect 40 bytes still reachable
LEAK SUMMARY:
definitely lost: 0 (+0) bytes in 0 (+0) blocks
indirectly lost: 0 (+0) bytes in 0 (+0) blocks
Reachable blocks (those to which a pointer was found) are not shown.
To see them, rerun with: --leak-check=full --show-leak-kinds=all
-All heap blocks were freed -- no leaks are possible
+Added leak check, expect 40 bytes still reachable
+LEAK SUMMARY:
+ definitely lost: 0 (+0) bytes in 0 (+0) blocks
+ indirectly lost: 0 (+0) bytes in 0 (+0) blocks
+ possibly lost: 0 (+0) bytes in 0 (+0) blocks
+ still reachable: 40 (+0) bytes in 1 (+0) blocks
+ suppressed: 0 (+0) bytes in 0 (+0) blocks
+Reachable blocks (those to which a pointer was found) are not shown.
+To see them, rerun with: --leak-check=full --show-leak-kinds=all
+Added leak check, expect all blocks freed
All heap blocks were freed -- no leaks are possible