From: Florian Krohm Date: Fri, 6 Feb 2015 20:32:15 +0000 (+0000) Subject: Fix undefined behaviours when shifting. X-Git-Tag: svn/VALGRIND_3_11_0~679 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=c29515885b23f169c1fd37bd20080b3e4d2da8d8;p=thirdparty%2Fvalgrind.git Fix undefined behaviours when shifting. Found by libubsan. git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14913 --- diff --git a/callgrind/sim.c b/callgrind/sim.c index fe1e81e5ba..7478a32edf 100644 --- a/callgrind/sim.c +++ b/callgrind/sim.c @@ -183,8 +183,8 @@ static void cachesim_initcache(cache_t config, cache_t2* c) 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<tag_shift)-1); + c->tag_shift = c->line_size_bits + VG_(log2)(c->sets); + c->tag_mask = ~((1u<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 @@ void cacheuse_initcache(cache_t2* c) else { int bytes_per_bit = c->line_size/32; start_mask = 1; - end_mask = 1 << 31; + end_mask = 1u << 31; for(i=0;iline_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 66ffd93751..d20748feee 100644 --- a/coregrind/m_debuginfo/readdwarf.c +++ b/coregrind/m_debuginfo/readdwarf.c @@ -2534,12 +2534,13 @@ static ULong step_le_u_encoded_literal ( DiCursor* data, UInt size ) 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 4a738d2b59..68a450c53c 100644 --- a/coregrind/m_gdbserver/target.c +++ b/coregrind/m_gdbserver/target.c @@ -554,7 +554,7 @@ static Bool getplatformoffset (SizeT *result) 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 db6f6f598d..2884331064 100644 --- a/memcheck/tests/vbit-test/Makefile.am +++ b/memcheck/tests/vbit-test/Makefile.am @@ -40,4 +40,4 @@ vbit_test_CPPFLAGS = $(AM_CPPFLAGS_PRI) \ 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 3182f8e44e..95c1adf2cb 100644 --- a/memcheck/tests/vbit-test/vbits.c +++ b/memcheck/tests/vbit-test/vbits.c @@ -408,9 +408,11 @@ concat_vbits(vbits_t v1, vbits_t v2) 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) {