Commit 7a934724 by Thomas Lively

Subzero: removed loops from ASan access checking

parent eec5621d
...@@ -58,7 +58,7 @@ ...@@ -58,7 +58,7 @@
static char *shadow_offset = NULL; static char *shadow_offset = NULL;
static void __asan_error(char *, int); static void __asan_error(char *, int);
static void __asan_check(char *, int, bool); static void __asan_check(char *, int);
static void __asan_get_redzones(char *, char **, char **); static void __asan_get_redzones(char *, char **, char **);
void __asan_init(int, void **, int *); void __asan_init(int, void **, int *);
...@@ -77,19 +77,18 @@ static void __asan_error(char *ptr, int size) { ...@@ -77,19 +77,18 @@ static void __asan_error(char *ptr, int size) {
} }
// check only the first byte of each word unless strict // check only the first byte of each word unless strict
static void __asan_check(char *ptr, int size, bool strict) { static void __asan_check(char *ptr, int size) {
assert(strict || (uintptr_t)ptr % WORD_SIZE == 0); assert(size == 1 || size == 2 || size == 4 || size == 8);
DUMP("%s check %d bytes at %p\n", (strict) ? "strict" : "loose", size, ptr); char *shadow_addr = (char *)MEM2SHADOW(ptr);
char *end = ptr + size; DUMP("check %d bytes at %p: %p + %d (%d)\n", size, ptr, shadow_addr,
int step = (strict) ? 1 : WORD_SIZE; (uintptr_t)ptr % SHADOW_SCALE, *shadow_addr);
for (char *cur = ptr; cur < end; cur += step) { if (size == SHADOW_SCALE) {
char shadow = *(char *)MEM2SHADOW(cur); if (*shadow_addr != 0)
DUMP("checking %p against %p with shadow %d\n", cur, MEM2SHADOW(cur),
shadow);
if (shadow != 0 && (shadow < 0 || SHADOW_OFFSET(cur) >= shadow)) {
__asan_error(ptr, size); __asan_error(ptr, size);
} return;
} }
if (*shadow_addr != 0 && (char)SHADOW_OFFSET(ptr) + size > *shadow_addr)
__asan_error(ptr, size);
} }
static void __asan_get_redzones(char *ptr, char **left, char **right) { static void __asan_get_redzones(char *ptr, char **left, char **right) {
...@@ -104,14 +103,15 @@ static void __asan_get_redzones(char *ptr, char **left, char **right) { ...@@ -104,14 +103,15 @@ static void __asan_get_redzones(char *ptr, char **left, char **right) {
void __asan_check_load(char *ptr, int size) { void __asan_check_load(char *ptr, int size) {
// aligned single word accesses may be widened single byte accesses, but for // aligned single word accesses may be widened single byte accesses, but for
// all else use strict check // all else use strict check
bool strict = !((uintptr_t)ptr % WORD_SIZE == 0 && size == WORD_SIZE); if (size == WORD_SIZE && (uintptr_t)ptr % WORD_SIZE == 0)
__asan_check(ptr, size, strict); size = 1;
__asan_check(ptr, size);
} }
void __asan_check_store(char *ptr, int size) { void __asan_check_store(char *ptr, int size) {
// stores may never be partially out of bounds so use strict check // stores may never be partially out of bounds so use strict check
bool strict = true; bool strict = true;
__asan_check(ptr, size, strict); __asan_check(ptr, size);
} }
void __asan_init(int n_rzs, void **rzs, int *rz_sizes) { void __asan_init(int n_rzs, void **rzs, int *rz_sizes) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment