]> git.ipfire.org Git - thirdparty/valgrind.git/commitdiff
Fix undefined behaviours when shifting.
authorFlorian Krohm <florian@eich-krohm.de>
Fri, 6 Feb 2015 20:32:15 +0000 (20:32 +0000)
committerFlorian Krohm <florian@eich-krohm.de>
Fri, 6 Feb 2015 20:32:15 +0000 (20:32 +0000)
Found by libubsan.

git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14913

callgrind/sim.c
coregrind/m_debuginfo/readdwarf.c
coregrind/m_gdbserver/target.c
memcheck/tests/vbit-test/Makefile.am
memcheck/tests/vbit-test/vbits.c

index fe1e81e5ba37c13a089d50bb0242a7834af12e00..7478a32edfc240fbc7cc67d8362df7a52d8732af 100644 (file)
@@ -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<<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 @@ 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;i<c->line_size;i++) {
            c->line_start_mask[i] = start_val;
            c->line_end_mask[c->line_size-i-1] = end_val;
index 66ffd93751decdb11b26dd25dc00870f5b708357..d20748feee8372ef1b240a876e0e9f7f33fb3a43 100644 (file)
@@ -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;
index 4a738d2b5994ff1a5cbce329002780bbc7336f48..68a450c53c5199dfd07f8f8a6731d86ec5e713a4 100644 (file)
@@ -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) {
index db6f6f598dd0d388a0d3dfef19ade87c0a91670e..2884331064fb037e32dde1f5b51af4588277238f 100644 (file)
@@ -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
index 3182f8e44e411dd0490fda3ade680884734f0986..95c1adf2cba25b4e76c033bf0d58c691aa20a29c 100644 (file)
@@ -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) {