diff --git a/src/plugins/e-acsl/share/e-acsl/segment_model/e_acsl_segment_tracking.h b/src/plugins/e-acsl/share/e-acsl/segment_model/e_acsl_segment_tracking.h index 15424228e756192ce869fb6ac18fb4bbff094635..ae8d30bfa8bf158d55a5ec3279c764b55aee3aa7 100644 --- a/src/plugins/e-acsl/share/e-acsl/segment_model/e_acsl_segment_tracking.h +++ b/src/plugins/e-acsl/share/e-acsl/segment_model/e_acsl_segment_tracking.h @@ -139,7 +139,7 @@ static const char short_offsets[] = { * For instance, let `uintptr_t *p' point to the start of a heap segment * in the heap shadow, then 'p[1] | heap_init_mask` sets initialization bits. * NOTE: This approach cannot deal with segments larger than 64 bits. */ -const uint64_t heap_init_mask = ~(ONE << HEAP_SEGMENT); +static const uint64_t heap_init_mask = ~(ONE << HEAP_SEGMENT); /*! \brief Masks for checking of initialization of global/stack allocated blocks. * A byte allocated globally or on stack is deemed initialized if its @@ -156,16 +156,16 @@ const uint64_t heap_init_mask = ~(ONE << HEAP_SEGMENT); * * For instance, mark first X bytes of a number N as initialised: * N |= static_init_masks[X] */ -const uint64_t static_init_masks [] = { - 0, /* 0 bytes */ - 1, /* 1 byte */ - 257, /* 2 bytes */ - 65793, /* 3 bytes */ - 16843009, /* 4 bytes */ - 4311810305, /* 5 bytes */ - 1103823438081, /* 6 bytes */ - 282578800148737, /* 7 bytes */ - 72340172838076673 /* 8 bytes */ +static const uint64_t static_init_masks [] = { + 0UL, /* 0 bytes */ + 1UL, /* 1 byte */ + 257UL, /* 2 bytes */ + 65793UL, /* 3 bytes */ + 16843009UL, /* 4 bytes */ + 4311810305UL, /* 5 bytes */ + 1103823438081UL, /* 6 bytes */ + 282578800148737UL, /* 7 bytes */ + 72340172838076673UL /* 8 bytes */ }; /*! \brief Bit masks for setting read-only (second least significant) bits. @@ -181,16 +181,16 @@ const uint64_t static_init_masks [] = { * * For instance, mark first X bytes of a number N as read-only: * N |= static_readonly_masks[X] */ -const uint64_t static_readonly_masks [] = { - 0, /* 0 bytes */ - 2, /* 1 byte */ - 514, /* 2 bytes */ - 131586, /* 3 bytes */ - 33686018, /* 4 bytes */ - 8623620610, /* 5 bytes */ - 2207646876162, /* 6 bytes */ - 565157600297474, /* 7 bytes */ - 144680345676153346 /* 8 bytes */ +static const uint64_t static_readonly_masks [] = { + 0UL, /* 0 bytes */ + 2UL, /* 1 byte */ + 514UL, /* 2 bytes */ + 131586UL, /* 3 bytes */ + 33686018UL, /* 4 bytes */ + 8623620610UL, /* 5 bytes */ + 2207646876162UL, /* 6 bytes */ + 565157600297474UL, /* 7 bytes */ + 144680345676153346UL /* 8 bytes */ }; /* }}} */ @@ -410,16 +410,34 @@ static uintptr_t predicate(uintptr_t addr, char p) { * and then for a block of 5 bytes its base offset if 11 etc. */ static const char short_offsets_base [] = { 0, 1, 2, 4, 7, 11, 16, 22, 29 }; +/** Shadow masks for setting values of short blocks */ +static const uint64_t short_shadow_masks[] = { + 0UL, + 4UL, + 3080UL, + 1578000UL, + 673456156UL, + 258640982060UL, + 92703853921344UL, + 31644393008028760UL, + 10415850140873816180UL +}; + /*! \brief Record allocation of a given memory block and update shadows * using offset-based encoding. * * \param ptr - pointer to a base memory address of the stack memory block. * \param size - size of the stack memory block. */ static void shadow_alloca(void *ptr, size_t size) { + DVALIDATE_IS_ON_STATIC(ptr, size); unsigned char *prim_shadow = (unsigned char*)PRIMARY_SHADOW(ptr); uint64_t *prim_shadow_alt = (uint64_t *)PRIMARY_SHADOW(ptr); unsigned int *sec_shadow = (unsigned int*)SECONDARY_SHADOW(ptr); + /* Make sure static region is nullified */ + DVALIDATE_NULLIFIED(prim_shadow, size); + DVALIDATE_NULLIFIED(sec_shadow, size); + /* Flip read-only bit for zero-size blocks. That is, physically it exists * but one cannot write to it. Further, the flipped read-only bit will also * identify such block as allocated */ @@ -428,6 +446,7 @@ static void shadow_alloca(void *ptr, size_t size) { unsigned int i, j = 0, k = 0; if (IS_LONG_BLOCK(size)) { /* Long blocks */ + unsigned int i, j = 0, k = 0; int boundary = LONG_BLOCK_BOUNDARY(size); for (i = 0; i < boundary; i += LONG_BLOCK) { /* Set-up a secondary shadow segment */