aboutsummaryrefslogtreecommitdiff
path: root/tests/i/memory-allocation
diff options
context:
space:
mode:
Diffstat (limited to 'tests/i/memory-allocation')
-rw-r--r--tests/i/memory-allocation/case.json1
-rw-r--r--tests/i/memory-allocation/expected.txt14
-rw-r--r--tests/i/memory-allocation/notes.md5
-rw-r--r--tests/i/memory-allocation/program.cps63
4 files changed, 83 insertions, 0 deletions
diff --git a/tests/i/memory-allocation/case.json b/tests/i/memory-allocation/case.json
new file mode 100644
index 0000000..0967ef4
--- /dev/null
+++ b/tests/i/memory-allocation/case.json
@@ -0,0 +1 @@
+{}
diff --git a/tests/i/memory-allocation/expected.txt b/tests/i/memory-allocation/expected.txt
new file mode 100644
index 0000000..330c9ba
--- /dev/null
+++ b/tests/i/memory-allocation/expected.txt
@@ -0,0 +1,14 @@
+TRUE
+TRUE
+42
+11:22
+TRUE
+[Fatal] line 34: Invalid memory address (not an active allocation)
+double free caught
+[Fatal] line 40: Invalid memory address (not an active allocation)
+stack address caught
+[Fatal] line 48: Invalid memory address (not an active allocation)
+interior address caught
+[Fatal] line 54: Memory allocation failed
+allocation failure caught
+99
diff --git a/tests/i/memory-allocation/notes.md b/tests/i/memory-allocation/notes.md
new file mode 100644
index 0000000..c0d4286
--- /dev/null
+++ b/tests/i/memory-allocation/notes.md
@@ -0,0 +1,5 @@
+# Trace notes
+
+Human review: pending.
+
+Explicit memory allocation is a compiler extension. Zero size and FREE(null) return null. An INTEGER allocation stores 42; a two-INTEGER record stores 11 and 22. FREE returns the input address. Freeing the middle, head and tail nodes empties the allocation list. Repeated free, a stack address and a record field's interior address are caught before libc is called. The negative size converts to SIZE_MAX, whose allocation fails. A final allocation still stores 99. Sizes 8 and 16 cover the fixed i64 representation.
diff --git a/tests/i/memory-allocation/program.cps b/tests/i/memory-allocation/program.cps
new file mode 100644
index 0000000..85a24dc
--- /dev/null
+++ b/tests/i/memory-allocation/program.cps
@@ -0,0 +1,63 @@
+TYPE Raw = C_TYPE("void*")
+TYPE IntPointer = ^INTEGER
+TYPE Pair
+ DECLARE First : INTEGER
+ DECLARE Second : INTEGER
+ENDTYPE
+TYPE PairPointer = ^Pair
+DECLARE Empty : Raw
+DECLARE P : Raw
+DECLARE Q : Raw
+DECLARE R : Raw
+DECLARE Number : INTEGER
+DECLARE Pointer : IntPointer
+DECLARE PairAddress : PairPointer
+DECLARE Result : Raw
+OUTPUT MALLOC(0) = Empty
+OUTPUT FREE(Empty) = Empty
+P <- malloc(8)
+Pointer <- (IntPointer)P
+Pointer^ <- 42
+OUTPUT Pointer^
+Q <- MALLOC((C_INT)16)
+PairAddress <- (PairPointer)Q
+PairAddress^.First <- 11
+PairAddress^.Second <- 22
+OUTPUT PairAddress^.First, ":", PairAddress^.Second
+R <- MALLOC(1)
+// Remove a middle node, then the head, then the tail.
+Result <- FREE(Q)
+OUTPUT Result = Q
+FREE(R)
+FREE(P)
+TRY
+ FREE(P)
+CATCH
+ OUTPUT "double free caught"
+ENDTRY
+Pointer <- ^Number
+TRY
+ FREE((Raw)Pointer)
+CATCH
+ OUTPUT "stack address caught"
+ENDTRY
+Q <- MALLOC(16)
+PairAddress <- (PairPointer)Q
+Pointer <- ^PairAddress^.Second
+TRY
+ FREE((Raw)Pointer)
+CATCH
+ OUTPUT "interior address caught"
+ENDTRY
+FREE(Q)
+TRY
+ MALLOC(-1)
+CATCH
+ OUTPUT "allocation failure caught"
+ENDTRY
+// Allocation still works after all caught failures.
+P <- MALLOC(8)
+Pointer <- (IntPointer)P
+Pointer^ <- 99
+OUTPUT Pointer^
+FREE(P)