forked from OSchip/llvm-project
[asan] simplify the code that poisons global redzones, add some more tests
llvm-svn: 173251
This commit is contained in:
parent
390805731f
commit
7d2e4c0389
|
@ -36,22 +36,16 @@ static ListOfGlobals *list_of_all_globals;
|
|||
static ListOfGlobals *list_of_dynamic_init_globals;
|
||||
|
||||
void PoisonRedZones(const Global &g) {
|
||||
uptr shadow_rz_size = kGlobalAndStackRedzone >> SHADOW_SCALE;
|
||||
CHECK(shadow_rz_size == 1 || shadow_rz_size == 2 || shadow_rz_size == 4);
|
||||
// full right redzone
|
||||
uptr g_aligned_size = kGlobalAndStackRedzone *
|
||||
((g.size + kGlobalAndStackRedzone - 1) / kGlobalAndStackRedzone);
|
||||
PoisonShadow(g.beg + g_aligned_size,
|
||||
kGlobalAndStackRedzone, kAsanGlobalRedzoneMagic);
|
||||
if ((g.size % kGlobalAndStackRedzone) != 0) {
|
||||
uptr aligned_size = RoundUpTo(g.size, SHADOW_GRANULARITY);
|
||||
PoisonShadow(g.beg + aligned_size, g.size_with_redzone - aligned_size,
|
||||
kAsanGlobalRedzoneMagic);
|
||||
if (g.size != aligned_size) {
|
||||
// partial right redzone
|
||||
u64 g_aligned_down_size = kGlobalAndStackRedzone *
|
||||
(g.size / kGlobalAndStackRedzone);
|
||||
CHECK(g_aligned_down_size == g_aligned_size - kGlobalAndStackRedzone);
|
||||
PoisonShadowPartialRightRedzone(g.beg + g_aligned_down_size,
|
||||
g.size % kGlobalAndStackRedzone,
|
||||
kGlobalAndStackRedzone,
|
||||
kAsanGlobalRedzoneMagic);
|
||||
PoisonShadowPartialRightRedzone(
|
||||
g.beg + RoundDownTo(g.size, SHADOW_GRANULARITY),
|
||||
g.size % SHADOW_GRANULARITY,
|
||||
SHADOW_GRANULARITY,
|
||||
kAsanGlobalRedzoneMagic);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -76,9 +76,6 @@ extern SANITIZER_INTERFACE_ATTRIBUTE uptr __asan_mapping_offset;
|
|||
: kZeroBaseShadowStart)
|
||||
#define kShadowGapEnd (kHighShadowBeg - 1)
|
||||
|
||||
#define kGlobalAndStackRedzone \
|
||||
(SHADOW_GRANULARITY < 32 ? 32 : SHADOW_GRANULARITY)
|
||||
|
||||
namespace __asan {
|
||||
|
||||
static inline bool AddrIsInLowMem(uptr a) {
|
||||
|
|
|
@ -186,7 +186,8 @@ static void PrintGlobalNameIfASCII(const __asan_global &g) {
|
|||
}
|
||||
|
||||
bool DescribeAddressRelativeToGlobal(uptr addr, const __asan_global &g) {
|
||||
if (addr < g.beg - kGlobalAndStackRedzone) return false;
|
||||
static const uptr kMinimalDistanceFromAnotherGlobal = 64;
|
||||
if (addr <= g.beg - kMinimalDistanceFromAnotherGlobal) return false;
|
||||
if (addr >= g.beg + g.size_with_redzone) return false;
|
||||
Decorator d;
|
||||
Printf("%s", d.Location());
|
||||
|
|
|
@ -11,8 +11,26 @@
|
|||
//
|
||||
// Some globals in a separate file.
|
||||
//===----------------------------------------------------------------------===//
|
||||
#include "asan_test_utils.h"
|
||||
|
||||
char glob1[1];
|
||||
char glob2[2];
|
||||
char glob3[3];
|
||||
char glob4[4];
|
||||
char glob5[5];
|
||||
char glob6[6];
|
||||
char glob7[7];
|
||||
char glob8[8];
|
||||
char glob9[9];
|
||||
char glob10[10];
|
||||
char glob11[11];
|
||||
char glob12[12];
|
||||
char glob13[13];
|
||||
char glob14[14];
|
||||
char glob15[15];
|
||||
char glob16[16];
|
||||
char glob17[17];
|
||||
|
||||
extern char glob5[5];
|
||||
static char static10[10];
|
||||
|
||||
int GlobalsTest(int zero) {
|
||||
|
|
|
@ -632,6 +632,44 @@ TEST(AddressSanitizerInterface, PushAndPopWithPoisoningTest) {
|
|||
free(vec);
|
||||
}
|
||||
|
||||
TEST(AddressSanitizerInterface, GlobalRedzones) {
|
||||
GOOD_ACCESS(glob1, 1 - 1);
|
||||
GOOD_ACCESS(glob2, 2 - 1);
|
||||
GOOD_ACCESS(glob3, 3 - 1);
|
||||
GOOD_ACCESS(glob4, 4 - 1);
|
||||
GOOD_ACCESS(glob5, 5 - 1);
|
||||
GOOD_ACCESS(glob6, 6 - 1);
|
||||
GOOD_ACCESS(glob7, 7 - 1);
|
||||
GOOD_ACCESS(glob8, 8 - 1);
|
||||
GOOD_ACCESS(glob9, 9 - 1);
|
||||
GOOD_ACCESS(glob10, 10 - 1);
|
||||
GOOD_ACCESS(glob11, 11 - 1);
|
||||
GOOD_ACCESS(glob12, 12 - 1);
|
||||
GOOD_ACCESS(glob13, 13 - 1);
|
||||
GOOD_ACCESS(glob14, 14 - 1);
|
||||
GOOD_ACCESS(glob15, 15 - 1);
|
||||
GOOD_ACCESS(glob16, 16 - 1);
|
||||
GOOD_ACCESS(glob17, 17 - 1);
|
||||
|
||||
BAD_ACCESS(glob1, 1);
|
||||
BAD_ACCESS(glob2, 2);
|
||||
BAD_ACCESS(glob3, 3);
|
||||
BAD_ACCESS(glob4, 4);
|
||||
BAD_ACCESS(glob5, 5);
|
||||
BAD_ACCESS(glob6, 6);
|
||||
BAD_ACCESS(glob7, 7);
|
||||
BAD_ACCESS(glob8, 8);
|
||||
BAD_ACCESS(glob9, 9);
|
||||
BAD_ACCESS(glob10, 10);
|
||||
BAD_ACCESS(glob11, 11);
|
||||
BAD_ACCESS(glob12, 12);
|
||||
BAD_ACCESS(glob13, 13);
|
||||
BAD_ACCESS(glob14, 14);
|
||||
BAD_ACCESS(glob15, 15);
|
||||
BAD_ACCESS(glob16, 16);
|
||||
BAD_ACCESS(glob17, 17);
|
||||
}
|
||||
|
||||
// Make sure that each aligned block of size "2^granularity" doesn't have
|
||||
// "true" value before "false" value.
|
||||
static void MakeShadowValid(bool *shadow, int length, int granularity) {
|
||||
|
|
|
@ -900,11 +900,9 @@ TEST(AddressSanitizer, StrDupTest) {
|
|||
}
|
||||
|
||||
// Currently we create and poison redzone at right of global variables.
|
||||
char glob5[5];
|
||||
static char static110[110];
|
||||
const char ConstGlob[7] = {1, 2, 3, 4, 5, 6, 7};
|
||||
static const char StaticConstGlob[3] = {9, 8, 7};
|
||||
extern int GlobalsTest(int x);
|
||||
|
||||
TEST(AddressSanitizer, GlobalTest) {
|
||||
static char func_static15[15];
|
||||
|
|
|
@ -86,4 +86,23 @@ string LeftOOBAccessMessage(int oob_distance);
|
|||
char* MallocAndMemsetString(size_t size, char ch);
|
||||
char* MallocAndMemsetString(size_t size);
|
||||
|
||||
extern char glob1[1];
|
||||
extern char glob2[2];
|
||||
extern char glob3[3];
|
||||
extern char glob4[4];
|
||||
extern char glob5[5];
|
||||
extern char glob6[6];
|
||||
extern char glob7[7];
|
||||
extern char glob8[8];
|
||||
extern char glob9[9];
|
||||
extern char glob10[10];
|
||||
extern char glob11[11];
|
||||
extern char glob12[12];
|
||||
extern char glob13[13];
|
||||
extern char glob14[14];
|
||||
extern char glob15[15];
|
||||
extern char glob16[16];
|
||||
extern char glob17[17];
|
||||
extern int GlobalsTest(int x);
|
||||
|
||||
#endif // ASAN_TEST_UTILS_H
|
||||
|
|
Loading…
Reference in New Issue