Skip to content

Commit cdea666

Browse files
authored
Merge pull request #7811 from tautschnig/bugfixes/big-endian
Fix big endian compatibility
2 parents b2900b9 + bdd42d3 commit cdea666

File tree

28 files changed

+213
-79
lines changed

28 files changed

+213
-79
lines changed

regression/cbmc-incr-smt2/bitvector-bitwise-operators/array-misalign-between.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ int main()
99
x[2] = 0;
1010
uint8_t *c = x;
1111
c[1] = 1;
12-
assert(x[0] == 256);
12+
assert(x[0] == 256 || x[0] == 1);
1313
assert(x[0] == 0);
1414
assert(x[1] == 0);
1515
assert(x[2] == 0);

regression/cbmc-incr-smt2/bitvector-bitwise-operators/array-misalign-between.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
CORE
22
array-misalign-between.c
33

4-
\[main\.assertion\.1\] line \d+ assertion x\[0\] == 256: SUCCESS
4+
\[main\.assertion\.1\] line \d+ assertion x\[0\] == 256 \|\| x\[0\] == 1: SUCCESS
55
\[main\.assertion\.2\] line \d+ assertion x\[0\] == 0: FAILURE
66
\[main\.assertion\.3\] line \d+ assertion x\[1\] == 0: SUCCESS
77
\[main\.assertion\.4\] line \d+ assertion x\[2\] == 0: SUCCESS

regression/cbmc-incr-smt2/bitvector-bitwise-operators/array-misalign.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ int main()
99
x[2] = 0;
1010
uint8_t *c = x;
1111
c[1] = 1;
12-
assert(x[0] == 256ul);
12+
assert(x[0] == 256ul || x[0] == 1ul);
1313
assert(x[0] == 0ul);
1414
assert(x[1] == 0ul);
1515
assert(x[2] == 0ul);

regression/cbmc-incr-smt2/bitvector-bitwise-operators/array-misalign.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
CORE
22
array-misalign.c
33

4-
\[main.assertion\.1\] line \d+ assertion x\[0\] == 256ul: SUCCESS
4+
\[main.assertion\.1\] line \d+ assertion x\[0\] == 256ul \|\| x\[0\] == 1ul: SUCCESS
55
\[main.assertion\.2\] line \d+ assertion x\[0\] == 0ul: FAILURE
66
\[main.assertion\.3\] line \d+ assertion x\[1\] == 0ul: SUCCESS
77
\[main.assertion\.4\] line \d+ assertion x\[2\] == 0ul: SUCCESS

regression/cbmc-incr-smt2/bitvector-bitwise-operators/byte-update-small.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ int main()
88
x[1] = 0;
99
uint16_t *y = x;
1010
*y = 258;
11-
assert(x[0] == 2);
12-
assert(x[1] == 1);
11+
assert(x[0] == 2 || x[1] == 2);
12+
assert(x[1] == 1 || x[0] == 1);
1313
}

regression/cbmc-incr-smt2/bitvector-bitwise-operators/byte-update-small.desc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
CORE
22
byte-update-small.c
33

4-
\[main\.assertion\.1\] line \d+ assertion x\[0\] == 2: SUCCESS
5-
\[main\.assertion\.2\] line \d+ assertion x\[1\] == 1: SUCCESS
4+
\[main\.assertion\.1\] line \d+ assertion x\[0\] == 2 \|\| x\[1\] == 2: SUCCESS
5+
\[main\.assertion\.2\] line \d+ assertion x\[1\] == 1 \|\| x\[0\] == 1: SUCCESS
66
^EXIT=0$
77
^SIGNAL=0$
88
--

regression/cbmc-incr-smt2/bitvector-bitwise-operators/byte-update.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,5 @@ int main()
66
uint16_t x = 0;
77
uint8_t *y = &x;
88
y[1] = 1;
9-
assert(x == 256);
9+
assert(x == 256 || x == 1);
1010
}

regression/cbmc-incr-smt2/bitvector-bitwise-operators/byte-update.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
CORE
22
byte-update.c
33

4-
\[main\.assertion\.1\] line \d+ assertion x == 256: SUCCESS
4+
\[main\.assertion\.1\] line \d+ assertion x == 256 \|\| x == 1: SUCCESS
55
^EXIT=0$
66
^SIGNAL=0$
77
--

regression/cbmc-incr-smt2/pointers-conversions/byte_extract.desc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@ Running incremental SMT2 solving via
55
Building error trace
66
\[main\.assertion\.\d+\] line \d+ assertion \*ptr != 42: FAILURE
77
\[main\.assertion\.\d+\] line \d+ assertion input != original: SUCCESS
8-
input=42ul? \(00000000 00000000 00000000 00101010\)
9-
original=42ul? \(00000000 00000000 00000000 00101010\)
8+
input=(42|704643072)ul? \((00000000|00101010) 00000000 00000000 (00101010|00000000)\)
9+
original=(42|704643072)ul? \((00000000|00101010) 00000000 00000000 (00101010|00000000)\)
1010
Violated property:
1111
file byte_extract.c function main line \d+ thread \d+
1212
assertion \*ptr != 42

regression/cbmc-incr-smt2/pointers-conversions/byte_update.desc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@ Running incremental SMT2 solving via
55
Building error trace
66
\[main\.assertion\.\d+\] line \d+ assertion x != 256u: FAILURE
77
State \d+ file byte_update\.c function main line \d+ thread \d
8-
offset=1ul? \(00000000 00000000 00000000 00000001\)
8+
offset=(1|2)ul? \(00000000 00000000 00000000 000000(01|10)\)
99
Assumption:
1010
file byte_update\.c line \d+ function main
1111
offset >= 0u && offset < 4u
1212
State \d+ file byte_update\.c function main line \d+ thread \d+
13-
byte_extract_little_endian\(x, \(.*\)offset, uint8_t\)=1 \(00000001\)
13+
byte_extract_(little|big)_endian\(x, \(.*\)offset, uint8_t\)=1 \(00000001\)
1414
Violated property:
1515
file byte_update.c function main line \d+ thread \d+
1616
assertion x != 256u

regression/cbmc/Array_Pointer7/main.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,12 @@ void f1()
77
for(unsigned i = 0; i < sizeof(array1); i++)
88
*(p + i) = i;
99

10-
assert(array1[0] == 0x03020100);
11-
assert(array1[1] == 0x07060504);
10+
assert(
11+
array1[0] == 0x03020100 /* little endian */ ||
12+
array1[0] == 0x00010203 /* big endian */);
13+
assert(
14+
array1[1] == 0x07060504 /* little endian */ ||
15+
array1[1] == 0x04050607 /* big endian */);
1216
}
1317

1418
void f2()
@@ -20,7 +24,9 @@ void f2()
2024
array2[1] = 0x0200;
2125
p[4] = 1;
2226

23-
assert(array2[1] == 0x0201);
27+
assert(
28+
array2[1] == 0x0201 /* little endian */ ||
29+
array2[1] == 0x01000200 /* big endian */);
2430
}
2531

2632
int main()

regression/cbmc/Pointer_array7/big-endian.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE new-smt-backend
22
main.c
3-
--big-endian -D__BIG_ENDIAN__
3+
--big-endian -DUSE_BIG_ENDIAN
44
^EXIT=0$
55
^SIGNAL=0$
66
^VERIFICATION SUCCESSFUL$

regression/cbmc/Pointer_array7/main.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,13 @@
11
#include <assert.h>
22
#include <stdint.h>
33

4-
#if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
4+
#if !defined(USE_LITTLE_ENDIAN) && !defined(USE_BIG_ENDIAN)
55

66
# if defined(__avr32__) || defined(__hppa__) || defined(__m68k__) || \
77
defined(__mips__) || defined(__powerpc__) || defined(__s390__) || \
88
defined(__s390x__) || defined(__sparc__)
99

10-
# define __BIG_ENDIAN__
10+
# define USE_BIG_ENDIAN
1111

1212
# endif
1313

@@ -21,7 +21,7 @@ int main()
2121
uint8_t *y = (uint8_t *)x;
2222
uint16_t z = *((uint16_t *)(y + 1));
2323

24-
#ifdef __BIG_ENDIAN__
24+
#ifdef USE_BIG_ENDIAN
2525
assert(z == 256u);
2626
#else
2727
assert(z == 512u);

regression/cbmc/Pointer_array7/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
CORE new-smt-backend
22
main.c
3-
--little-endian -D__LITTLE_ENDIAN__
3+
--little-endian -DUSE_LITTLE_ENDIAN
44
^EXIT=0$
55
^SIGNAL=0$
66
^VERIFICATION SUCCESSFUL$

regression/cbmc/Struct_Bytewise1/struct_bytewise.c

Lines changed: 1 addition & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,18 +1,3 @@
1-
// Determine endianness.
2-
// Follows http://wiki.debian.org/ArchitectureSpecificsMemo
3-
4-
#if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
5-
6-
#if defined(__avr32__) || defined(__hppa__) || defined(__m68k__) || \
7-
defined(__mips__) || defined(__powerpc__) || defined(__s390__) || \
8-
defined(__s390x__) || defined(__sparc__)
9-
10-
#define __BIG_ENDIAN__
11-
12-
#endif
13-
14-
#endif
15-
161
typedef struct my_struct
172
{
183
// We hope these are 32 bit each on all architectures,
@@ -37,7 +22,7 @@ int main()
3722
logAppl.b=0x01000002;
3823
CopyBuffer((unsigned char *)&logAppl);
3924

40-
#ifdef __BIG_ENDIAN__
25+
#if defined(__BYTE_ORDER__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
4126
assert(arrayTmp[0]==0);
4227
assert(arrayTmp[1]==0);
4328
assert(arrayTmp[2]==0);
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
CORE
2+
main.c
3+
--bounds-check --big-endian
4+
^\[main.bit_count.\d+\] line 61 count leading zeros is undefined for value zero in __builtin_clz\(0u\): FAILURE$
5+
^\*\* 1 of \d+ failed
6+
^VERIFICATION FAILED$
7+
^EXIT=10$
8+
^SIGNAL=0$
9+
--
10+
^warning: ignoring
Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
CORE
2+
main.c
3+
--bounds-check --big-endian
4+
^\[main.bit_count.\d+\] line 46 count trailing zeros is undefined for value zero in __builtin_ctz\(0u\): FAILURE$
5+
^\[main.assertion.2\] line 47 count trailing zeros of 0 is bit width: SUCCESS$
6+
^\*\* 1 of \d+ failed
7+
^VERIFICATION FAILED$
8+
^EXIT=10$
9+
^SIGNAL=0$
10+
--
11+
^warning: ignoring
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
CORE
2+
main.c
3+
--pointer-check --bounds-check --big-endian
4+
^EXIT=0$
5+
^SIGNAL=0$
6+
^VERIFICATION SUCCESSFUL$
7+
--
8+
^warning: ignoring

regression/cbmc/array-cell-sensitivity8/test.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ main::1::array!0@1#2\[\[6\]\] =
1010
main::1::array!0@1#2\[\[7\]\] =
1111
main::1::array!0@1#2\[\[8\]\] =
1212
main::1::array!0@1#2\[\[9\]\] =
13-
main::1::array!0@1#3 =.*byte_extract_little_endian
13+
main::1::array!0@1#3 =.*byte_extract_(big|little)_endian
1414
main::1::array!0@1#3\[\[0\]\] =
1515
main::1::array!0@1#3\[\[1\]\] =
1616
main::1::array!0@1#3\[\[2\]\] =

regression/cbmc/byte-op-metric/test.desc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@ main.c
55
^SIGNAL=0$
66
^Byte Extracts:$
77
^.*main\.c line 8 function main$
8-
^.* byte\_extract\_little\_endian\(.*\)$
8+
^.* byte\_extract\_(big|little)\_endian\(.*\)$
99
^Number of byte extracts: 1$
1010
^Byte Updates:$
1111
^.*main\.c line 8 function main$
12-
^.* byte\_update\_little\_endian\(.*\)$
12+
^.* byte\_update\_(big|little)\_endian\(.*\)$
1313
^Number of byte updates: 1$
1414
--
1515
--

regression/cbmc/byte-op-metric/test_json.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ main.c
44
activate-multi-line-match
55
^EXIT=0$
66
^SIGNAL=0$
7-
"byteOpsStats": \{\n\s*"byteExtractStats": \{\n\s*"byteExtractList": \[\n\s*\{\n\s*"sourceLocation": \{(\n.*)*\},\n\s*"ssaExpr": \{(\n.*)*\},\n\s*"ssaExprString": ".* .* byte\_extract\_little\_endian\(.*\)"\n\s*\}\n\s*\],\n\s*"numOfExtracts": 1\n\s*\},\n\s*"byteUpdateStats": \{\n\s*"byteUpdateList": \[\n\s*\{\n\s*"sourceLocation": \{(\n.*)*\},\n\s*"ssaExpr": \{(\n.*)*\},\n\s*"ssaExprString": ".* .* byte\_update\_little\_endian\(.*\)"\n\s*\}\n\s*\],\n\s*"numOfUpdates": 1\n\s*\}
7+
"byteOpsStats": \{\n\s*"byteExtractStats": \{\n\s*"byteExtractList": \[\n\s*\{\n\s*"sourceLocation": \{(\n.*)*\},\n\s*"ssaExpr": \{(\n.*)*\},\n\s*"ssaExprString": ".* .* byte\_extract\_(big|little)\_endian\(.*\)"\n\s*\}\n\s*\],\n\s*"numOfExtracts": 1\n\s*\},\n\s*"byteUpdateStats": \{\n\s*"byteUpdateList": \[\n\s*\{\n\s*"sourceLocation": \{(\n.*)*\},\n\s*"ssaExpr": \{(\n.*)*\},\n\s*"ssaExprString": ".* .* byte\_update\_(big|little)\_endian\(.*\)"\n\s*\}\n\s*\],\n\s*"numOfUpdates": 1\n\s*\}
88
--
99
--
1010
To test json output for --show-byte-ops option that displays byte extract and update metrics.

regression/cbmc/byte_update12/main.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,9 @@ int main()
1515
struct S s;
1616
s.j = 1;
1717
memcpy(&s, A, x);
18-
__CPROVER_assert((s.i & 0xFF) == 42, "lowest byte is 42");
18+
__CPROVER_assert(
19+
(s.i & 0xFF) == 42 /* little endian */ ||
20+
(s.i >> ((sizeof(int) - 1) * 8)) == 42 /* big endian */,
21+
"lowest byte is 42");
1922
__CPROVER_assert(s.j == 1, "s.j is unaffected by upate");
2023
}

regression/cbmc/float-nan-check/test.desc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,16 @@
11
CORE
22
main.c
33
--nan-check
4-
\[main.NaN.1\] line \d+ NaN on \+ in byte_extract_little_endian\(c, (0|0l|0ll), float\) \+ myzero: SUCCESS
4+
\[main.NaN.1\] line \d+ NaN on \+ in byte_extract_(big|little)_endian\(c, (0|0l|0ll), float\) \+ myzero: SUCCESS
55
\[main.NaN.2\] line \d+ NaN on / in myzero / myzero: FAILURE
66
\[main.NaN.3\] line \d+ NaN on / in \(float\)n / myinf: FAILURE
77
\[main.NaN.4\] line \d+ NaN on \* in myinf \* myzero: FAILURE
88
\[main.NaN.5\] line \d+ NaN on \+ in -myinf \+ myinf: FAILURE
99
\[main.NaN.6\] line \d+ NaN on \+ in myinf \+ -myinf: FAILURE
1010
\[main.NaN.7\] line \d+ NaN on - in myinf - myinf: FAILURE
1111
\[main.NaN.8\] line \d+ NaN on - in -myinf - -myinf: FAILURE
12-
\[main.NaN.9\] line \d+ NaN on \+ in byte_extract_little_endian\(c, (0|0l|0ll), float\) \+ byte_extract_little_endian\(c, (0|0l|0ll), float\): SUCCESS
13-
\[main.NaN.10\] line \d+ NaN on / in byte_extract_little_endian\(c, (0|0l|0ll), float\) / myzero: SUCCESS
12+
\[main.NaN.9\] line \d+ NaN on \+ in byte_extract_(big|little)_endian\(c, (0|0l|0ll), float\) \+ byte_extract_(big|little)_endian\(c, (0|0l|0ll), float\): SUCCESS
13+
\[main.NaN.10\] line \d+ NaN on / in byte_extract_(big|little)_endian\(c, (0|0l|0ll), float\) / myzero: SUCCESS
1414
\[main.NaN.11\] line \d+ NaN on \* in mynan \* mynan: SUCCESS
1515
\[main.NaN.12\] line \d+ NaN on \+ in mynan \+ mynan: SUCCESS
1616
\[main.NaN.13\] line \d+ NaN on - in mynan - mynan: SUCCESS

regression/cbmc/points-to-sets/test_json.desc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ main.c
44
activate-multi-line-match
55
^EXIT=0$
66
^SIGNAL=0$
7-
\{\n\s*"Pointer": "main::1::p!0@1",\n\s*"PointsToSet": \[ "object_descriptor\(integer_address, unknown\)" \],\n\s*"PointsToSetSize": 1,\n\s*"RetainedValuesSet": \[ "object_descriptor\(integer_address, unknown\)" \],\n\s*"RetainedValuesSetSize": 1,\n\s*"Value": "byte_extract_little_endian\(__CPROVER_memory, pointer_offset\(main::1::p!0@1\), signedbv\[32\]\)"\n\s*\},\n\s*\{\n\s*"Pointer": "main::1::p!0@1",\n\s*"PointsToSet": \[ "object_descriptor\(integer_address, unknown\)" \],\n\s*"PointsToSetSize": 1,\n\s*"RetainedValuesSet": \[ "object_descriptor\(integer_address, unknown\)" \],\n\s*"RetainedValuesSetSize": 1,\n\s*"Value": "byte_extract_little_endian\(__CPROVER_memory, pointer_offset\(main::1::p!0@1\), signedbv\[32\]\)"\n\s*\}
7+
\{\n\s*"Pointer": "main::1::p!0@1",\n\s*"PointsToSet": \[ "object_descriptor\(integer_address, unknown\)" \],\n\s*"PointsToSetSize": 1,\n\s*"RetainedValuesSet": \[ "object_descriptor\(integer_address, unknown\)" \],\n\s*"RetainedValuesSetSize": 1,\n\s*"Value": "byte_extract_(big|little)_endian\(__CPROVER_memory, pointer_offset\(main::1::p!0@1\), signedbv\[32\]\)"\n\s*\},\n\s*\{\n\s*"Pointer": "main::1::p!0@1",\n\s*"PointsToSet": \[ "object_descriptor\(integer_address, unknown\)" \],\n\s*"PointsToSetSize": 1,\n\s*"RetainedValuesSet": \[ "object_descriptor\(integer_address, unknown\)" \],\n\s*"RetainedValuesSetSize": 1,\n\s*"Value": "byte_extract_(big|little)_endian\(__CPROVER_memory, pointer_offset\(main::1::p!0@1\), signedbv\[32\]\)"\n\s*\}
88
--
99
--
1010
To test output for --show-points-to-sets option that displays the size and contents of points-to sets in json format.

regression/cbmc/union15/main.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,13 @@ int main()
5050
// following examples demonstrate.
5151
union B ub = {.c = 0xFF};
5252
ub.b = 0;
53-
assert(ub.c == 0xFE);
53+
assert(ub.c == 0xFE || ub.c == 0x7F);
5454

5555
union C uc = {.i = 0xFFFFFFFF};
5656
uc.c = 0;
57-
assert(uc.i == 0xFFFFFF00);
57+
assert(uc.i == 0xFFFFFF00 || uc.i == 0x00FFFFFF);
5858

5959
union A ua = {.i = 0xFFFFFFFF};
6060
ua.c = 0;
61-
assert(ua.i == 0xFFFFFF00);
61+
assert(ua.i == 0xFFFFFF00 || ua.i == 0x00FFFFFF);
6262
}

regression/goto-instrument/restrict-function-pointer-to-compatible-function/test.c

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,14 @@ typedef int (*fptr_t)(long long);
44

55
void use_f(fptr_t fptr)
66
{
7+
#if !defined(__BYTE_ORDER__) || __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__
78
assert(fptr(10) == 11);
9+
#else
10+
if(sizeof(int) == sizeof(long long))
11+
assert(fptr(10) == 11);
12+
else
13+
assert(fptr(10) == 1);
14+
#endif
815
}
916

1017
int f(int x)

0 commit comments

Comments
 (0)