Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
ASan allocates a global data initialization array at the tail end of …
…each compunit's .data section. This vector is not poisoned. Because of this the first symbol of the following section has no left red zone. As a result, ASan cannot detect underflow for such symbols. Poison ASan allocated metadata, it should not be accessible to user code. This fix does not eliminate the problem with missing left red zones but it reduces the set of vulnerable symbols from first symbols in each input data section to first symbols in the output section of the binary. Differential Revision: https://reviews.llvm.org/D38056 llvm-svn: 314365
- Loading branch information
Showing
3 changed files
with
22 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
int YYY[3]={1,2,3}; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,17 @@ | ||
// RUN: %clangxx_asan -O0 %s %p/Helpers/underflow.cc -o %t && not %run %t 2>&1 | FileCheck %s | ||
// RUN: %clangxx_asan -O1 %s %p/Helpers/underflow.cc -o %t && not %run %t 2>&1 | FileCheck %s | ||
// RUN: %clangxx_asan -O2 %s %p/Helpers/underflow.cc -o %t && not %run %t 2>&1 | FileCheck %s | ||
// RUN: %clangxx_asan -O3 %s %p/Helpers/underflow.cc -o %t && not %run %t 2>&1 | FileCheck %s | ||
|
||
int XXX[2] = {2, 3}; | ||
extern int YYY[]; | ||
#include <string.h> | ||
int main(int argc, char **argv) { | ||
memset(XXX, 0, 2*sizeof(int)); | ||
// CHECK: {{READ of size 4 at 0x.* thread T0}} | ||
// CHECK: {{ #0 0x.* in main .*global-underflow.cc:}}[[@LINE+3]] | ||
// CHECK: {{0x.* is located 4 bytes to the left of global variable}} | ||
// CHECK: {{.*YYY.* of size 12}} | ||
int res = YYY[-1]; | ||
return res; | ||
} |