[asan] Do not unset DYLD_ROOT_PATH before calling atos on Darwin

We were unsetting DYLD_ROOT_PATH before calling atos on Darwin in order to
address it not working for symbolicating 32 bit binaries. (atos essentiall
tries to respawn as a 32 bit binary and it's disallowed to respawn if
DYLD_ROOT_PATH is set ... ) However, processes rely on having DYLD_ROOT_PATH
set under certain conditions, so this is not the right fix. In particular, this
always crashes when running ASanified process under the debugger in Xcode with
iOS simulator, which is a very important workflow for us to support.

This patch reverts the unsetting of the DYLD_ROOT_PATH. The correct fix to the
misbehavior on 32-bit binaries should happen inside atos.

http://reviews.llvm.org/D10722

llvm-svn: 240724
This commit is contained in:
Anna Zaks 2015-06-25 23:36:21 +00:00
parent 785c075786
commit a16075cfc9
3 changed files with 26 additions and 7 deletions

View File

@ -53,9 +53,6 @@ class AtosSymbolizerProcess : public SymbolizerProcess {
}
void ExecuteWithDefaultArgs(const char *path_to_binary) const override {
// The `atos` binary has some issues with DYLD_ROOT_PATH on i386.
unsetenv("DYLD_ROOT_PATH");
char pid_str[16];
internal_snprintf(pid_str, sizeof(pid_str), "%d", parent_pid_);
if (GetMacosVersion() == MACOS_VERSION_MAVERICKS) {

View File

@ -0,0 +1,26 @@
// Check that when having a DYLD_ROOT_PATH set, the symbolizer still works.
// RUN: env DYLD_ROOT_PATH="/" ASAN_OPTIONS=$ASAN_OPTIONS:verbosity=2 ASAN_SYMBOLIZER_PATH=$(which atos) \
// RUN: not %run %t 2>&1 | FileCheck %s
//
// Due to a bug in atos, this only works on x86_64.
// REQUIRES: x86_64
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv) {
char *x = (char*)malloc(10 * sizeof(char));
memset(x, 0, 10);
int res = x[argc];
free(x);
free(x + argc - 1); // BOOM
// CHECK: AddressSanitizer: attempting double-free{{.*}}in thread T0
// CHECK: Using atos at user-specified path:
// CHECK: #0 0x{{.*}} in {{.*}}free
// CHECK: #1 0x{{.*}} in main {{.*}}atos-symbolizer.cc:[[@LINE-4]]
// CHECK: freed by thread T0 here:
// CHECK: #0 0x{{.*}} in {{.*}}free
// CHECK: #1 0x{{.*}} in main {{.*}}atos-symbolizer.cc:[[@LINE-8]]
// CHECK: allocated by thread T0 here:
// CHECK: atos-symbolizer.cc:[[@LINE-13]]
return res;
}

View File

@ -3,10 +3,6 @@
// RUN: %clangxx_asan -O0 %s -o %t
// RUN: env ASAN_OPTIONS=$ASAN_OPTIONS:verbosity=2 ASAN_SYMBOLIZER_PATH=$(which atos) not %run %t 2>&1 | FileCheck %s
// Check that when having a DYLD_ROOT_PATH set, the symbolizer still works.
// RUN: env DYLD_ROOT_PATH="/" ASAN_OPTIONS=$ASAN_OPTIONS:verbosity=2 ASAN_SYMBOLIZER_PATH=$(which atos) \
// RUN: not %run %t 2>&1 | FileCheck %s
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv) {