mimalloc/test/test-wrong.c

92 lines
1.9 KiB
C
Raw Normal View History

2022-10-31 00:52:26 +03:00
/* ----------------------------------------------------------------------------
Copyright (c) 2018-2020, Microsoft Research, Daan Leijen
This is free software; you can redistribute it and/or modify it under the
terms of the MIT license. A copy of the license can be found in the file
"LICENSE" at the root of this distribution.
-----------------------------------------------------------------------------*/
2023-03-06 05:03:04 +03:00
/* test file for valgrind/asan support.
VALGRIND:
----------
2022-10-31 00:52:26 +03:00
Compile in an "out/debug" folder:
> cd out/debug
> cmake ../.. -DMI_TRACK_VALGRIND=1
2022-10-31 00:52:26 +03:00
> make -j8
and then compile this file as:
2022-10-31 00:52:26 +03:00
> gcc -g -o test-wrong -I../../include ../../test/test-wrong.c libmimalloc-valgrind-debug.a -lpthread
and test as:
> valgrind ./test-wrong
2023-03-06 05:03:04 +03:00
ASAN
----------
Compile in an "out/debug" folder:
> cd out/debug
> cmake ../.. -DMI_TRACK_ASAN=1
2023-03-06 05:03:04 +03:00
> make -j8
and then compile this file as:
> clang -g -o test-wrong -I../../include ../../test/test-wrong.c libmimalloc-asan-debug.a -lpthread -fsanitize=address -fsanitize-recover=address
and test as:
> ASAN_OPTIONS=verbosity=1:halt_on_error=0 ./test-wrong
2022-10-31 00:52:26 +03:00
*/
2022-10-29 06:07:31 +03:00
#include <stdio.h>
#include <stdlib.h>
#include "mimalloc.h"
#ifdef USE_STD_MALLOC
# define mi(x) x
#else
# define mi(x) mi_##x
#endif
int main(int argc, char** argv) {
2022-11-28 20:59:48 +03:00
int* p = (int*)mi(malloc)(3*sizeof(int));
2022-11-28 20:59:48 +03:00
int* r = (int*)mi_malloc_aligned(8,16);
2022-10-29 21:43:09 +03:00
mi_free(r);
// illegal byte wise read
char* c = (char*)mi(malloc)(3);
printf("invalid byte: over: %d, under: %d\n", c[4], c[-1]);
mi(free)(c);
2022-10-29 06:07:31 +03:00
// undefined access
2022-11-28 20:59:48 +03:00
int* q = (int*)mi(malloc)(sizeof(int));
printf("undefined: %d\n", *q);
// illegal int read
printf("invalid: over: %d, under: %d\n", q[1], q[-1]);
2022-10-29 06:07:31 +03:00
*q = 42;
// buffer overflow
q[1] = 43;
// buffer underflow
q[-1] = 44;
2022-10-29 06:07:31 +03:00
mi(free)(q);
// double free
mi(free)(q);
2022-10-29 06:07:31 +03:00
// use after free
printf("use-after-free: %d\n", *q);
// leak p
// mi_free(p)
return 0;
2022-10-29 06:07:31 +03:00
}