Skip to content

[asan] Implement address sanitizer on AIX: platform support #139587

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 2 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions compiler-rt/lib/asan/CMakeLists.txt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
# Build for the AddressSanitizer runtime support library.

set(ASAN_SOURCES
asan_aix.cpp
asan_allocator.cpp
asan_activation.cpp
asan_debugging.cpp
Expand Down
48 changes: 48 additions & 0 deletions compiler-rt/lib/asan/asan_aix.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
//===-- asan_aix.cpp ------------------------------------------------------===//
//
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
// See https://llvm.org/LICENSE.txt for license information.
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
//
//===----------------------------------------------------------------------===//
//
// This file is a part of AddressSanitizer, an address sanity checker.
//
// AIX-specific details.
//===----------------------------------------------------------------------===//

#include "sanitizer_common/sanitizer_platform.h"

#if SANITIZER_AIX
# include "asan_mapping.h"
# include "sanitizer_common/sanitizer_internal_defs.h"

namespace __asan {

void TryReExecWithoutASLR() {
// Allowed to fail and do nothing.
}

void AsanCheckIncompatibleRT() {}

void AsanCheckDynamicRTPrereqs() {}

void InitializePlatformExceptionHandlers() {}

void *AsanDoesNotSupportStaticLinkage() { return 0; }

void InitializePlatformInterceptors() {}
void AsanApplyToGlobals(globals_op_fptr op, const void *needle) {}

uptr FindDynamicShadowStart() {
UNREACHABLE("AIX does not use dynamic shadow offset!");
return 0;
}

void FlushUnneededASanShadowMemory(uptr p, uptr size) {
ReleaseMemoryPagesToOS(MemToShadow(p), MemToShadow(p + size));
}

} // namespace __asan

#endif // SANITIZER_AIX
6 changes: 5 additions & 1 deletion compiler-rt/lib/asan/asan_posix.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,11 @@
#include "sanitizer_common/sanitizer_platform.h"
#if SANITIZER_POSIX

// tid_t is also defined in AIX header /usr/include/sys/types.h which is
// included by system pthread.h
# define tid_t tid_t_temp
# include <pthread.h>
# undef tid_t
Comment on lines +19 to +21
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This seems to be a hack, and the comment does not establish how it is okay to allow other potential usages of tid_t in the AIX headers included later to pick up the "wrong" tid_t definition.

The use of tid_t by AIX is conforming according to POSIX (https://pubs.opengroup.org/onlinepubs/9799919799/functions/V2_chap02.html):

Implementations may add symbols to the headers shown in the following table [ ... ]

A separate PR to have the sanitizers rename its tid_t appears appropriate.

# include <signal.h>
# include <stdlib.h>
# include <sys/resource.h>
Expand Down Expand Up @@ -180,7 +184,7 @@ static void AfterFork(bool fork_child) {

void InstallAtForkHandler() {
# if SANITIZER_SOLARIS || SANITIZER_NETBSD || SANITIZER_APPLE || \
(SANITIZER_LINUX && SANITIZER_SPARC) || SANITIZER_HAIKU
(SANITIZER_LINUX && SANITIZER_SPARC) || SANITIZER_HAIKU || SANITIZER_AIX
// While other Linux targets use clone in internal_fork which doesn't
// trigger pthread_atfork handlers, Linux/sparc64 uses __fork, causing a
// hang.
Expand Down
10 changes: 9 additions & 1 deletion compiler-rt/lib/asan/scripts/asan_symbolize.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ def is_valid_arch(s):
"armv7s",
"armv7k",
"arm64",
"powerpc",
"powerpc64",
"powerpc64le",
"s390x",
Expand Down Expand Up @@ -449,7 +450,14 @@ def __init__(self, plugin_proxy=None, dsym_hint_producer=None):
# E.g. in Chrome several binaries may share a single .dSYM.
self.dsym_hint_producer = dsym_hint_producer
self.system = os.uname()[0]
if self.system not in ["Linux", "Darwin", "FreeBSD", "NetBSD", "SunOS"]:
if self.system not in [
"Linux",
"Darwin",
"FreeBSD",
"NetBSD",
"SunOS",
"AIX",
]:
raise Exception("Unknown system")
self.llvm_symbolizers = {}
self.last_llvm_symbolizer = None
Expand Down
Loading