Skip to content

Commit 23ac639

Browse files
committed
Remove progs/alias and rename alias2 to alias
1 parent 7b1b3d1 commit 23ac639

10 files changed

+70
-632
lines changed

.gitignore

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -66,10 +66,6 @@ progs/alias
6666
progs/alias.compcert.c
6767
progs/alias.i
6868
progs/alias.parsed.c
69-
progs/alias2
70-
progs/alias2.compcert.c
71-
progs/alias2.i
72-
progs/alias2.parsed.c
7369

7470
*.vo
7571
*.vos

Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -500,7 +500,7 @@ PROGS32_FILES= \
500500
printf.v stackframe_demo.v verif_stackframe_demo.v \
501501
rotate.v verif_rotate.v \
502502
verif_objectSelf.v verif_objectSelfFancy.v verif_objectSelfFancyOverriding.v \
503-
alias.v verif_alias.v alias2.v verif_alias2.v
503+
alias.v verif_alias.v
504504
# verif_insertion_sort.v
505505

506506
C64_ORDINARY = reverse.c revarray.c sumarray.c append.c bin_search.c \

progs/alias.c

Lines changed: 24 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,31 @@
1-
int foo(int *p, long *q) {
1+
int foo(int *p, void **q) {
22
*p = 1;
33
*q = 0;
44
return *p;
55
}
66
int main() {
7-
long x;
7+
int x;
88
return foo(&x, &x);
99
}
1010

1111
/*
12-
The usage in this example is essential systems programming but has undefined
13-
behavior according to ISO C due to the strict aliasing restriction.
12+
The usage in this canonical example is essential to systems programming but has
13+
undefined behavior according to ISO C due to the strict aliasing restriction.
1414
15-
It returns 0 in the following invocations of clang 14.0.6 and gcc 12.2.0:
15+
From the perspective that pointers are addresses and memory maps addresses to
16+
bytes, we have two writes and one read of the same 4-byte memory region, and
17+
main returns 0. Yet ISO C17 § 6.5.7 limits the lvalue types through which the
18+
value of a declared object can be accessed to a fixed list of variations on the
19+
declared type plus char. Here the declared type is int, so the modification
20+
through *p is consistent with these rules, but the modification through *q (of
21+
type void *) is not, even though int and void * have size and alignment. The
22+
ubiquitous compiler flag -fno-strict-aliasing lifts these restrictions.
23+
24+
To show that this complication is relevant in practice, the example was tested
25+
using clang 14.0.6, gcc 12.2.0, and CompCert a1f01c84 (3.11++).
26+
27+
It returns 0 in the following invocations:
1628
17-
clang -O0 -w alias.c -o alias && ./alias; echo $?
18-
gcc -O0 -w alias.c -o alias && ./alias; echo $?
19-
gcc -O1 -w alias.c -o alias && ./alias; echo $?
20-
clang -fno-strict-aliasing -O1 -w alias.c -o alias && ./alias; echo $?
21-
clang -fno-strict-aliasing -O2 -w alias.c -o alias && ./alias; echo $?
22-
clang -fno-strict-aliasing -O3 -w alias.c -o alias && ./alias; echo $?
23-
gcc -fno-strict-aliasing -O2 -w alias.c -o alias && ./alias; echo $?
24-
gcc -fno-strict-aliasing -O3 -w alias.c -o alias && ./alias; echo $?
2529
clang -m32 -O0 -w alias.c -o alias && ./alias; echo $?
2630
gcc -m32 -O0 -w alias.c -o alias && ./alias; echo $?
2731
gcc -m32 -O1 -w alias.c -o alias && ./alias; echo $?
@@ -31,17 +35,12 @@ clang -m32 -fno-strict-aliasing -O3 -w alias.c -o alias && ./alias; echo $?
3135
gcc -m32 -fno-strict-aliasing -O2 -w alias.c -o alias && ./alias; echo $?
3236
gcc -m32 -fno-strict-aliasing -O3 -w alias.c -o alias && ./alias; echo $?
3337
34-
It also returns 0 with CompCert a1f01c844aaa0ff41aa9095e9d5d01606a0e90c9 (3.11++):
38+
It also returns 0 with CompCert:
3539
3640
../../CompCert/ccomp alias.c -c alias.o && gcc -m32 alias.o -o alias && ./alias; echo $?
3741
38-
It returns 1 in the following invocations of clang 14.0.6 and gcc 12.2.0:
42+
It returns 1 in the following invocations:
3943
40-
clang -O1 -w alias.c -o alias && ./alias; echo $?
41-
clang -O2 -w alias.c -o alias && ./alias; echo $?
42-
clang -O3 -w alias.c -o alias && ./alias; echo $?
43-
gcc -O2 -w alias.c -o alias && ./alias; echo $?
44-
gcc -O3 -w alias.c -o alias && ./alias; echo $?
4544
clang -m32 -O1 -w alias.c -o alias && ./alias; echo $?
4645
clang -m32 -O2 -w alias.c -o alias && ./alias; echo $?
4746
clang -m32 -O3 -w alias.c -o alias && ./alias; echo $?
@@ -50,18 +49,10 @@ gcc -m32 -O3 -w alias.c -o alias && ./alias; echo $?
5049
5150
alias.v was generated using the following invocation:
5251
53-
../../CompCert/clightgen -dall -normalize -nostdinc -P -std=c11 alias.c
52+
../../CompCert/clightgen -dclight -normalize -nostdinc -P -std=c11 alias.c
5453
55-
The corresponding clight file returns 0 in all tested invocations:
54+
The corresponding clight file returns 0 in all invocations where the input file returned 0:
5655
57-
clang -O0 -w alias.light.c -o alias && ./alias; echo $?
58-
gcc -O0 -w alias.light.c -o alias && ./alias; echo $?
59-
gcc -O1 -w alias.light.c -o alias && ./alias; echo $?
60-
clang -fno-strict-aliasing -O1 -w alias.light.c -o alias && ./alias; echo $?
61-
clang -fno-strict-aliasing -O2 -w alias.light.c -o alias && ./alias; echo $?
62-
clang -fno-strict-aliasing -O3 -w alias.light.c -o alias && ./alias; echo $?
63-
gcc -fno-strict-aliasing -O2 -w alias.light.c -o alias && ./alias; echo $?
64-
gcc -fno-strict-aliasing -O3 -w alias.light.c -o alias && ./alias; echo $?
6556
clang -m32 -O0 -w alias.light.c -o alias && ./alias; echo $?
6657
gcc -m32 -O0 -w alias.light.c -o alias && ./alias; echo $?
6758
gcc -m32 -O1 -w alias.light.c -o alias && ./alias; echo $?
@@ -70,11 +61,9 @@ clang -m32 -fno-strict-aliasing -O2 -w alias.light.c -o alias && ./alias; echo $
7061
clang -m32 -fno-strict-aliasing -O3 -w alias.light.c -o alias && ./alias; echo $?
7162
gcc -m32 -fno-strict-aliasing -O2 -w alias.light.c -o alias && ./alias; echo $?
7263
gcc -m32 -fno-strict-aliasing -O3 -w alias.light.c -o alias && ./alias; echo $?
73-
clang -O1 -w alias.light.c -o alias && ./alias; echo $?
74-
clang -O2 -w alias.light.c -o alias && ./alias; echo $?
75-
clang -O3 -w alias.light.c -o alias && ./alias; echo $?
76-
gcc -O2 -w alias.light.c -o alias && ./alias; echo $?
77-
gcc -O3 -w alias.light.c -o alias && ./alias; echo $?
64+
65+
... and returns 1 in all invocations where the input file returned 1:
66+
7867
clang -m32 -O1 -w alias.light.c -o alias && ./alias; echo $?
7968
clang -m32 -O2 -w alias.light.c -o alias && ./alias; echo $?
8069
clang -m32 -O3 -w alias.light.c -o alias && ./alias; echo $?

progs/alias.light.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,9 +18,9 @@ extern long long __compcert_i64_sar(long long, int);
1818
extern long long __compcert_i64_smulh(long long, long long);
1919
extern unsigned long long __compcert_i64_umulh(unsigned long long, unsigned long long);
2020
extern void __builtin_debug(int, ...);
21-
int foo(int *, int *);
21+
int foo(int *, void **);
2222
int main(void);
23-
int foo(int *$p, int *$q)
23+
int foo(int *$p, void **$q)
2424
{
2525
register int $128;
2626
*$p = 1;

progs/alias.v

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,15 +85,15 @@ Definition _t'1 : ident := 128%positive.
8585
Definition f_foo := {|
8686
fn_return := tint;
8787
fn_callconv := cc_default;
88-
fn_params := ((_p, (tptr tint)) :: (_q, (tptr tint)) :: nil);
88+
fn_params := ((_p, (tptr tint)) :: (_q, (tptr (tptr tvoid))) :: nil);
8989
fn_vars := nil;
9090
fn_temps := ((_t'1, tint) :: nil);
9191
fn_body :=
9292
(Ssequence
9393
(Sassign (Ederef (Etempvar _p (tptr tint)) tint)
9494
(Econst_int (Int.repr 1) tint))
9595
(Ssequence
96-
(Sassign (Ederef (Etempvar _q (tptr tint)) tint)
96+
(Sassign (Ederef (Etempvar _q (tptr (tptr tvoid))) (tptr tvoid))
9797
(Econst_int (Int.repr 0) tint))
9898
(Ssequence
9999
(Sset _t'1 (Ederef (Etempvar _p (tptr tint)) tint))
@@ -110,7 +110,8 @@ Definition f_main := {|
110110
(Ssequence
111111
(Ssequence
112112
(Scall (Some _t'1)
113-
(Evar _foo (Tfunction (Tcons (tptr tint) (Tcons (tptr tint) Tnil)) tint
113+
(Evar _foo (Tfunction
114+
(Tcons (tptr tint) (Tcons (tptr (tptr tvoid)) Tnil)) tint
114115
cc_default))
115116
((Eaddrof (Evar _x tint) (tptr tint)) ::
116117
(Eaddrof (Evar _x tint) (tptr tint)) :: nil))

progs/alias2.c

Lines changed: 0 additions & 60 deletions
This file was deleted.

progs/alias2.light.c

Lines changed: 0 additions & 41 deletions
This file was deleted.

0 commit comments

Comments
 (0)