Skip to content

test: add tests for zero sized realloc(3) #255

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
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