mirror of
https://github.com/capstone-engine/llvm-capstone.git
synced 2024-12-22 23:39:24 +00:00
Revert "Revert "[compiler-rt][asan] Make wild-pointer crash error more useful""
This reverts commit c578508b5b
.
Reland now that unrelated crash has been resolved.
This commit is contained in:
parent
731b3d7664
commit
ab08c3865b
@ -77,7 +77,6 @@ static bool GetShadowKind(uptr addr, ShadowKind *shadow_kind) {
|
||||
} else if (AddrIsInLowShadow(addr)) {
|
||||
*shadow_kind = kShadowKindLow;
|
||||
} else {
|
||||
CHECK(0 && "Address is not in memory and not in shadow?");
|
||||
return false;
|
||||
}
|
||||
return true;
|
||||
@ -464,7 +463,13 @@ AddressDescription::AddressDescription(uptr addr, uptr access_size,
|
||||
return;
|
||||
}
|
||||
data.kind = kAddressKindWild;
|
||||
addr = 0;
|
||||
data.wild.addr = addr;
|
||||
data.wild.access_size = access_size;
|
||||
}
|
||||
|
||||
void WildAddressDescription::Print() const {
|
||||
Printf("Address %p is a wild pointer inside of access range of size %p.\n",
|
||||
addr, access_size);
|
||||
}
|
||||
|
||||
void PrintAddressDescription(uptr addr, uptr access_size,
|
||||
|
@ -146,6 +146,13 @@ struct StackAddressDescription {
|
||||
bool GetStackAddressInformation(uptr addr, uptr access_size,
|
||||
StackAddressDescription *descr);
|
||||
|
||||
struct WildAddressDescription {
|
||||
uptr addr;
|
||||
uptr access_size;
|
||||
|
||||
void Print() const;
|
||||
};
|
||||
|
||||
struct GlobalAddressDescription {
|
||||
uptr addr;
|
||||
// Assume address is close to at most four globals.
|
||||
@ -193,7 +200,7 @@ class AddressDescription {
|
||||
HeapAddressDescription heap;
|
||||
StackAddressDescription stack;
|
||||
GlobalAddressDescription global;
|
||||
uptr addr;
|
||||
WildAddressDescription wild;
|
||||
};
|
||||
};
|
||||
|
||||
@ -211,7 +218,7 @@ class AddressDescription {
|
||||
uptr Address() const {
|
||||
switch (data.kind) {
|
||||
case kAddressKindWild:
|
||||
return data.addr;
|
||||
return data.wild.addr;
|
||||
case kAddressKindShadow:
|
||||
return data.shadow.addr;
|
||||
case kAddressKindHeap:
|
||||
@ -226,7 +233,7 @@ class AddressDescription {
|
||||
void Print(const char *bug_descr = nullptr) const {
|
||||
switch (data.kind) {
|
||||
case kAddressKindWild:
|
||||
Printf("Address %p is a wild pointer.\n", data.addr);
|
||||
data.wild.Print();
|
||||
return;
|
||||
case kAddressKindShadow:
|
||||
return data.shadow.Print();
|
||||
|
22
compiler-rt/test/asan/TestCases/wild_pointer.cpp
Normal file
22
compiler-rt/test/asan/TestCases/wild_pointer.cpp
Normal file
@ -0,0 +1,22 @@
|
||||
// RUN: %clangxx_asan %s -o %t
|
||||
// RUN: not %run %t 2>&1 | FileCheck %s
|
||||
// REQUIRES: asan-64-bits
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
int main() {
|
||||
char *p = new char;
|
||||
char *dest = new char;
|
||||
const size_t offset = 0x4567890123456789;
|
||||
// Flush it so the output came out before the asan report.
|
||||
fprintf(stderr, "Expected bad addr: %p\n", p + offset);
|
||||
fflush(stderr);
|
||||
memmove(dest, p, offset);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// CHECK: Expected bad addr: [[ADDR:0x[0-9,a-f]+]]
|
||||
// CHECK: AddressSanitizer: unknown-crash on address [[ADDR]]
|
||||
// CHECK: Address [[ADDR]] is a wild pointer inside of access range of size 0x4567890123456789
|
Loading…
Reference in New Issue
Block a user