File tree 6 files changed +97
-0
lines changed
regression/cbmc/gcc_bswap1 6 files changed +97
-0
lines changed Original file line number Diff line number Diff line change
1
+ #include <assert.h>
2
+ #include <stdint.h>
3
+
4
+ #ifndef __GNUC__
5
+ uint16_t __builtin_bswap16 (uint16_t );
6
+ uint32_t __builtin_bswap32 (uint32_t );
7
+ uint64_t __builtin_bswap64 (uint64_t );
8
+ #endif
9
+
10
+ uint16_t __VERIFIER_nondet_u16 ();
11
+ uint32_t __VERIFIER_nondet_u32 ();
12
+ uint64_t __VERIFIER_nondet_u64 ();
13
+
14
+ int main ()
15
+ {
16
+ uint16_t sa = 0xabcd ;
17
+ assert (__builtin_bswap16 (sa ) == 0xcdab );
18
+ uint16_t sb = __VERIFIER_nondet_u16 ();
19
+ sb &= 0xff00 ;
20
+ // expected to fail, only MSB guaranteed to be 0
21
+ assert (__builtin_bswap16 (sb ) == 0 );
22
+ assert ((__builtin_bswap16 (sb ) & 0xff00 ) == 0 );
23
+
24
+ uint32_t a = 0xabcdef00 ;
25
+ assert (__builtin_bswap32 (a ) == 0x00efcdab );
26
+ uint32_t b = __VERIFIER_nondet_u32 ();
27
+ b &= 0xffffff00 ;
28
+ // expected to fail, only MSB guaranteed to be 0
29
+ assert (__builtin_bswap32 (b ) == 0 );
30
+ assert ((__builtin_bswap32 (b ) & 0xff000000 ) == 0 );
31
+
32
+ uint64_t al = 0xabcdef0001020304LL ;
33
+ assert (__builtin_bswap64 (al ) == 0x0403020100efcdabLL );
34
+ uint64_t bl = __VERIFIER_nondet_u64 ();
35
+ bl &= 0xffffffffffffff00LL ;
36
+ // expected to fail, only MSB guaranteed to be 0
37
+ assert (__builtin_bswap64 (bl ) == 0 );
38
+ assert ((__builtin_bswap64 (bl ) & 0xff00000000000000 ) == 0 );
39
+
40
+ return 0 ;
41
+ }
Original file line number Diff line number Diff line change
1
+ CORE
2
+ main.c
3
+
4
+ ^EXIT=10$
5
+ ^SIGNAL=0$
6
+ ^VERIFICATION FAILED$
7
+ \[main\.assertion\.[258]\] assertion __builtin_bswap(16|32|64)\((sb|b|bl)\) == 0: FAILURE$
8
+ ^\*\* 3 of 9 failed
9
+ --
10
+ ^warning: ignoring
11
+ \[main\.assertion\.[258]\] assertion __builtin_bswap(16|32|64)\((sb|b|bl)\) == 0: SUCCESS$
Original file line number Diff line number Diff line change @@ -106,6 +106,7 @@ SRC = $(BOOLEFORCE_SRC) \
106
106
flattening/boolbv_array.cpp \
107
107
flattening/boolbv_array_of.cpp \
108
108
flattening/boolbv_bitwise.cpp \
109
+ flattening/boolbv_bswap.cpp \
109
110
flattening/boolbv_bv_rel.cpp \
110
111
flattening/boolbv_byte_extract.cpp \
111
112
flattening/boolbv_byte_update.cpp \
Original file line number Diff line number Diff line change @@ -245,6 +245,8 @@ bvt boolbvt::convert_bitvector(const exprt &expr)
245
245
}
246
246
else if (expr.id ()==ID_abs)
247
247
return convert_abs (expr);
248
+ else if (expr.id () == ID_bswap)
249
+ return convert_bswap (to_bswap_expr (expr));
248
250
else if (expr.id ()==ID_byte_extract_little_endian ||
249
251
expr.id ()==ID_byte_extract_big_endian)
250
252
return convert_byte_extract (to_byte_extract_expr (expr));
Original file line number Diff line number Diff line change @@ -133,6 +133,7 @@ class boolbvt:public arrayst
133
133
134
134
virtual bvt convert_index (const exprt &array, const mp_integer &index);
135
135
virtual bvt convert_index (const index_exprt &expr);
136
+ virtual bvt convert_bswap (const bswap_exprt &expr);
136
137
virtual bvt convert_byte_extract (const byte_extract_exprt &expr);
137
138
virtual bvt convert_byte_update (const byte_update_exprt &expr);
138
139
virtual bvt convert_constraint_select_one (const exprt &expr);
Original file line number Diff line number Diff line change
1
+ /* ******************************************************************\
2
+
3
+ Module: Bit-blasting of bswap
4
+
5
+ Author: Michael Tautschnig
6
+
7
+ \*******************************************************************/
8
+
9
+ #include " boolbv.h"
10
+
11
+ #include < util/config.h>
12
+ #include < util/invariant.h>
13
+
14
+ bvt boolbvt::convert_bswap (const bswap_exprt &expr)
15
+ {
16
+ const std::size_t width = boolbv_width (expr.type ());
17
+
18
+ // width must be multiple of bytes
19
+ const std::size_t byte_bits = config.ansi_c .char_width ;
20
+ if (width % byte_bits != 0 )
21
+ return conversion_failed (expr);
22
+
23
+ bvt result = convert_bv (expr.op ());
24
+ CHECK_RETURN (result.size () == width);
25
+
26
+ std::size_t dest_base = width;
27
+
28
+ for (std::size_t src = 0 ; src < width; ++src)
29
+ {
30
+ std::size_t bit_offset = src % byte_bits;
31
+ if (bit_offset == 0 )
32
+ dest_base -= byte_bits;
33
+
34
+ if (src >= dest_base)
35
+ break ;
36
+
37
+ result[src].swap (result[dest_base + bit_offset]);
38
+ }
39
+
40
+ return result;
41
+ }
You can’t perform that action at this time.
0 commit comments