Fix undefined behaviours when shifting.
Found by libubsan.
git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14913 a5019735-40e9-0310-863c-91ae7b9d1cf9
diff --git a/callgrind/sim.c b/callgrind/sim.c
index fe1e81e..7478a32 100644
--- a/callgrind/sim.c
+++ b/callgrind/sim.c
@@ -183,8 +183,8 @@
c->sets = (c->size / c->line_size) / c->assoc;
c->sets_min_1 = c->sets - 1;
c->line_size_bits = VG_(log2)(c->line_size);
- c->tag_shift = c->line_size_bits + VG_(log2)(c->sets);
- c->tag_mask = ~((1<<c->tag_shift)-1);
+ c->tag_shift = c->line_size_bits + VG_(log2)(c->sets);
+ c->tag_mask = ~((1u<<c->tag_shift)-1);
/* Can bits in tag entries be used for flags?
* Should be always true as MIN_LINE_SIZE >= 16 */
@@ -650,7 +650,7 @@
else {
int bytes_per_bit = c->line_size/32;
start_mask = 1;
- end_mask = 1 << 31;
+ end_mask = 1u << 31;
for(i=0;i<c->line_size;i++) {
c->line_start_mask[i] = start_val;
c->line_end_mask[c->line_size-i-1] = end_val;
diff --git a/coregrind/m_debuginfo/readdwarf.c b/coregrind/m_debuginfo/readdwarf.c
index 66ffd93..d20748f 100644
--- a/coregrind/m_debuginfo/readdwarf.c
+++ b/coregrind/m_debuginfo/readdwarf.c
@@ -2534,12 +2534,13 @@
static Long step_le_s_encoded_literal ( DiCursor* data, UInt size )
{
- Long s64 = step_le_u_encoded_literal( data, size );
+ ULong u64 = step_le_u_encoded_literal( data, size );
+ Long s64;
switch (size) {
case 8: break;
- case 4: s64 <<= 32; s64 >>= 32; break;
- case 2: s64 <<= 48; s64 >>= 48; break;
- case 1: s64 <<= 56; s64 >>= 56; break;
+ case 4: s64 = u64 << 32; s64 >>= 32; break;
+ case 2: s64 = u64 << 48; s64 >>= 48; break;
+ case 1: s64 = u64 << 56; s64 >>= 56; break;
default: vg_assert(0); /*NOTREACHED*/ return 0;
}
return s64;
diff --git a/coregrind/m_gdbserver/target.c b/coregrind/m_gdbserver/target.c
index 4a738d2..68a450c 100644
--- a/coregrind/m_gdbserver/target.c
+++ b/coregrind/m_gdbserver/target.c
@@ -554,7 +554,7 @@
static Bool getplatformoffset_called = False;
static Bool lm_modid_offset_found = False;
- static SizeT lm_modid_offset = 1<<31; // Rubbish initial value.
+ static SizeT lm_modid_offset = 1u << 31; // Rubbish initial value.
// lm_modid_offset is a magic offset, retrieved using an external program.
if (!getplatformoffset_called) {
diff --git a/memcheck/tests/vbit-test/Makefile.am b/memcheck/tests/vbit-test/Makefile.am
index db6f6f5..2884331 100644
--- a/memcheck/tests/vbit-test/Makefile.am
+++ b/memcheck/tests/vbit-test/Makefile.am
@@ -40,4 +40,4 @@
vbit_test_CFLAGS = $(AM_CFLAGS_PRI) -std=c99
vbit_test_DEPENDENCIES =
vbit_test_LDADD =
-vbit_test_LDFLAGS = $(AM_CFLAGS_PRI) -std=c99
+vbit_test_LDFLAGS = $(AM_CFLAGS_PRI) -std=c99 -static-libubsan
diff --git a/memcheck/tests/vbit-test/vbits.c b/memcheck/tests/vbit-test/vbits.c
index 3182f8e..95c1adf 100644
--- a/memcheck/tests/vbit-test/vbits.c
+++ b/memcheck/tests/vbit-test/vbits.c
@@ -408,9 +408,11 @@
vbits_t new = { .num_bits = v1.num_bits * 2 };
switch (v1.num_bits) {
- case 8: new.bits.u16 = (v1.bits.u8 << 8) | v2.bits.u8; break;
- case 16: new.bits.u32 = (v1.bits.u16 << 16) | v2.bits.u16; break;
- case 32: new.bits.u64 = v1.bits.u32;
+ case 8: new.bits.u16 = v1.bits.u8;
+ new.bits.u16 = (new.bits.u16 << 8) | v2.bits.u8; break;
+ case 16: new.bits.u32 = v1.bits.u16;
+ new.bits.u32 = (new.bits.u32 << 16) | v2.bits.u16; break;
+ case 32: new.bits.u64 = v1.bits.u32;
new.bits.u64 = (new.bits.u64 << 32) | v2.bits.u32; break;
case 64:
if (__BYTE_ORDER == __LITTLE_ENDIAN) {