My port of addresssanitizer is based on GCC 4.8.1. I modify "asan_emit_stack_protection" function in gcc/asan.c for the following reason: Sometimes, the stack variable size > 32 Bytes, and after asan generates code to poison the shadow buffer, it does clear some shadow buffer but not all before function return. So I use the way of poisoning to recover the shadow. Does any of you suffer the problem? It works fine for my platform now.
about line 1050: #if 0 // I find some false positive for those code for (l = length; l; l -= 2) { offset = base_offset + ((offsets[l - 1] - base_offset) & ~(ASAN_RED_ZONE_SIZE - HOST_WIDE_INT_1)); if (last_offset + last_size != offset) { shadow_mem = adjust_address (shadow_mem, VOIDmode, (last_offset - prev_offset) >> ASAN_SHADOW_SHIFT); prev_offset = last_offset; asan_clear_shadow (shadow_mem, last_size >> ASAN_SHADOW_SHIFT); last_offset = offset; last_size = 0; } last_size += base_offset + ((offsets[l - 2] - base_offset) & ~(ASAN_RED_ZONE_SIZE - HOST_WIDE_INT_1)) - offset; } if (last_size) { shadow_mem = adjust_address (shadow_mem, VOIDmode, (last_offset - prev_offset) >> ASAN_SHADOW_SHIFT); asan_clear_shadow (shadow_mem, last_size >> ASAN_SHADOW_SHIFT); } #else for (l = length; l; l -= 2) { if (l == 2) cur_shadow_byte = ASAN_STACK_MAGIC_RIGHT; offset = offsets[l - 1]; if ((offset - base_offset) & (ASAN_RED_ZONE_SIZE - 1)) { HOST_WIDE_INT aoff = base_offset + ((offset - base_offset) & ~(ASAN_RED_ZONE_SIZE - HOST_WIDE_INT_1)); shadow_mem = adjust_address (shadow_mem, VOIDmode, (aoff - prev_offset) >> ASAN_SHADOW_SHIFT); prev_offset = aoff; aoff += (1 << ASAN_SHADOW_SHIFT) << 2; asan_clear_shadow (shadow_mem, 4); offset = aoff; } while (offset <= offsets[l - 2] - ASAN_RED_ZONE_SIZE) { shadow_mem = adjust_address (shadow_mem, VOIDmode, (offset - prev_offset) >> ASAN_SHADOW_SHIFT); prev_offset = offset; asan_clear_shadow (shadow_mem, 4); offset += ASAN_RED_ZONE_SIZE; } } #endif