Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions test/.gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,4 +41,7 @@ overflow_small_8_byte
uninitialized_read_large
uninitialized_read_small
realloc_init
realloc_c23_undefined_behaviour
realloc_c23_undefined_behaviour_double_free
realloc_c23_undefined_behaviour_use_after_free
__pycache__/
5 changes: 4 additions & 1 deletion test/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,10 @@ EXECUTABLES := \
invalid_malloc_object_size_small \
invalid_malloc_object_size_small_quarantine \
impossibly_large_malloc \
realloc_init
realloc_init \
realloc_c23_undefined_behaviour \
realloc_c23_undefined_behaviour_double_free \
realloc_c23_undefined_behaviour_use_after_free

all: $(EXECUTABLES)

Expand Down
19 changes: 19 additions & 0 deletions test/realloc_c23_undefined_behaviour.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#include <stdio.h>
#include <stdlib.h>

#include "test_util.h"

OPTNONE int main(void) {
char *p, *q, *r;

p = malloc(16);
if (!p) {
return 1;
}

q = realloc(p, 0);

free(q);

return 0;
}
19 changes: 19 additions & 0 deletions test/realloc_c23_undefined_behaviour_double_free.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
#include <stdio.h>
#include <stdlib.h>

#include "test_util.h"

OPTNONE int main(void) {
char *p, *q, *r;

p = malloc(16);
if (!p) {
return 1;
}

q = realloc(p, 0);

free(p);

return 0;
}
21 changes: 21 additions & 0 deletions test/realloc_c23_undefined_behaviour_use_after_free.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
#include <stdio.h>
#include <stdlib.h>

#include "test_util.h"

OPTNONE int main(void) {
char *p, *q, *r;

p = malloc(256 * 1024);
if (!p) {
return 1;
}

q = realloc(p, 0);

printf("%c\n", *p);

free(q);

return 0;
}
14 changes: 14 additions & 0 deletions test/test_smc.py
Original file line number Diff line number Diff line change
Expand Up @@ -169,6 +169,20 @@ def test_uninitialized_realloc(self):
self.assertEqual(stderr.decode("utf-8"),
"fatal allocator error: invalid realloc\n")

def test_realloc_c23_undefined_behaviour(self):
_stdout, stderr, returncode = self.run_test("realloc_c23_undefined_behaviour")
self.assertEqual(returncode, 0)

def test_realloc_c23_undefined_behaviour_double_free(self):
_stdout, stderr, returncode = self.run_test("realloc_c23_undefined_behaviour_double_free")
self.assertEqual(returncode, -6)
self.assertEqual(stderr.decode("utf-8"),
"fatal allocator error: double free (quarantine)\n")

def test_realloc_c23_undefined_behaviour_use_after_free(self):
_stdout, stderr, returncode = self.run_test("realloc_c23_undefined_behaviour_use_after_free")
self.assertEqual(returncode, -11)

def test_write_after_free_large_reuse(self):
_stdout, _stderr, returncode = self.run_test(
"write_after_free_large_reuse")
Expand Down