Changeset 1875 for src/Clight/test
- Timestamp:
- Apr 4, 2012, 6:48:25 PM (9 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
src/Clight/test/memorymodel.ma
r1634 r1875 20 20 access, preventing you reading back more information than the memory can 21 21 store. *) 22 definition store0 := empty .23 definition store1block : mem × block ≝ allocstore0 0 4 Any.22 definition store0 := empty becontentT. 23 definition store1block : mem × Σb:block.? ≝ alloc ? store0 0 4 Any. 24 24 definition store1 : mem ≝ fst ?? store1block. 25 definition block : = snd ?? store1block.25 definition block :block := pi1 … (snd ?? store1block). 26 26 27 27 (* write a value *) 28 28 definition store2 : mem. 29 letin r ≝ (store Mint16unsigned store1 Any block 0(Vint I16 (repr ? 1)));29 letin r ≝ (store (ASTint I16 Unsigned) store1 (mk_pointer Any block (same_compat …) zero_offset) (Vint I16 (repr ? 1))); 30 30 31 31 lapply (refl ? r); elim r in ⊢ (???% → ?); [ whd in ⊢ (??%? → ?); #H destruct … … 34 34 (* overwrite the first byte of the value *) 35 35 definition store3 : mem. 36 letin r ≝ (store Mint8unsigned store1 Any block 0(Vint I8 (repr ? 1)));36 letin r ≝ (store (ASTint I8 Unsigned) store2 (mk_pointer Any block (same_compat …) zero_offset) (Vint I8 (repr ? 1))); 37 37 38 38 lapply (refl ? r) elim r in ⊢ (???% → ?); [ whd in ⊢ (??%? → ?); #H destruct 39 39 | #rr #_ @ rr ] qed. 40 40 41 (* The size checking rejects the read and gives us Some Vundef. *) 42 example vl_undef: load Mint16signed store3 Any block 0 = Some ? Vundef. @refl qed. 41 (* This is what happened under the original CompCert 1.6 ported memory model: 42 The size checking rejects the read and gives us Some Vundef. 43 example vl_undef: load (ASTint I16 Signed) store3 (mk_pointer Any block (same_compat …) zero_offset) = Some ? Vundef. @refl qed. 44 *) 45 (* Now we do byte-wise values and get to see the altered integer. *) 46 example vl_changed: load (ASTint I16 Signed) store3 (mk_pointer Any block (same_compat …) zero_offset) = Some ? (Vint I16 (repr ? 257)). @refl qed. 43 47 44 48 (* The read is successful and returns the value. *) 45 example vl_ok': load Mint8unsigned store3 Any block 0= Some ? (Vint I8 (repr ? 1)). // qed.49 example vl_ok': load (ASTint I8 Unsigned) store3 (mk_pointer Any block (same_compat …) zero_offset) = Some ? (Vint I8 (repr ? 1)). // qed. 46 50 47 51 (* NB: Double frees are allowed by the memory model (although not necessarily 48 52 by the language). *) 49 definition store4 := free store3 block.50 definition store5 : mem. letin r ≝ (free store3 block); whd in r; @r qed.53 definition store4 := free ? store3 block. 54 definition store5 : mem. letin r ≝ (free ? store3 block); whd in r; @r qed. 51 55 52 56 (* No ordering is imposed on deallocation (even though alloc and free are only used for 53 57 stack memory in the semantics. *) 54 definition storeA := empty .55 definition storeBblkB := alloc storeA 0 4 Any.56 definition storeCblkC := alloc (fst ?? storeBblkB) 0 8 Any.57 definition storeD := free (fst ?? storeCblkC) (snd ?? storeBblkB).58 definition storeE : mem. letin r ≝ (free storeD (snd ?? storeCblkC)).58 definition storeA := empty becontentT. 59 definition storeBblkB := alloc ? storeA 0 4 Any. 60 definition storeCblkC := alloc ? (fst ?? storeBblkB) 0 8 Any. 61 definition storeD := free ? (fst ?? storeCblkC) (snd ?? storeBblkB). 62 definition storeE : mem. letin r ≝ (free ? storeD (snd ?? storeCblkC)). 59 63 whd in r; @r qed. 60 64 61 (* Access to the "object representation" (as the C standard puts it) is not specified. *) 62 definition storeI := empty. 63 definition storeIIblk := alloc storeA 0 4 Any. 65 (* Access to the "object representation" (as the C standard puts it) was not specified, 66 but can now split up integer values into bytes. The front-end interface 67 doesn't currently expose parts of pointers. *) 68 definition storeI := empty becontentT. 69 definition storeIIblk := alloc ? storeA 0 4 Any. 64 70 definition storeIII : mem. 65 letin r ≝ (store Mint32 (fst ?? storeIIblk) Any (snd ?? storeIIblk) 0(Vint I32 (repr ? 1)));71 letin r ≝ (store (ASTint I32 Unsigned) (fst ?? storeIIblk) (mk_pointer Any (snd ?? storeIIblk) (same_compat …) zero_offset) (Vint I32 (repr ? 1))); 66 72 lapply (refl ? r) elim r in ⊢ (???% → ?); [ whd in ⊢ (??%? → ?); #H destruct 67 73 | #rr #_ @rr ] qed. 68 definition byte := load Mint8unsigned storeIII Any (snd ?? storeIIblk) 0.69 example byteundef: byte = Some ? Vundef. // qed. (* :(*)74 definition byte := load (ASTint I8 Unsigned) storeIII (mk_pointer Any (snd ?? storeIIblk) (same_compat …) zero_offset). 75 example byteundef: byte = Some ? (Vint I8 (repr ? 0)). // qed. (* :) *)
Note: See TracChangeset
for help on using the changeset viewer.