RFR: 8334763: --enable-asan: assert(_thread->is_in_live_stack((address)this)) failed: not on stack?

Jan Kratochvil jkratochvil at openjdk.org
Sun Jun 23 03:30:25 UTC 2024


On Sun, 23 Jun 2024 03:18:30 GMT, Kim Barrett <kbarrett at openjdk.org> wrote:

>> fastdebug:
>> 
>> 
>> # A fatal error has been detected by the Java Runtime Environment:
>> #
>> #  Internal Error (/home/azul/azul/openjdk-git/src/hotspot/share/runtime/handles.inline.hpp:77), pid=878152, tid=878158
>> #  assert(_thread->is_in_live_stack((address)this)) failed: not on stack?
>> #
>> # JRE version:  (24.0) (fastdebug build )
>> # Java VM: OpenJDK 64-Bit Server VM (fastdebug 24-internal-adhoc.azul.openjdk-git, mixed mode, tiered, compressed oops, compressed class ptrs, g1 gc, linux-amd64)
>> # Problematic frame:
>> # V  [libjvm.so+0x1d20658]  constantPoolHandle::constantPoolHandle(Thread*, ConstantPool*)+0x268
>
> make/autoconf/jdk-options.m4 line 448:
> 
>> 446:           if test "x$TOOLCHAIN_TYPE" = "xclang"; then
>> 447:             ASAN_CFLAGS="$ASAN_CFLAGS -fsanitize-address-use-after-return=never"
>> 448:           fi
> 
> I don't think this change should be made.  Globally disabling some otherwise
> likely useful asan warnings to address what looks like a localized problem
> doesn't seem like a good approach to me.
> 
> Also, suppression seems inappropriate since this has the look of a possible
> JVM bug. It's hard to tell without more context for the failure, like the full
> stack trace and how to reproduce.

I understand the problem. You are right there are multiple (2?) ways how to fix it. A reproducer simulating what JDK does:

#include <cstdio>
struct C { C() {
    printf("C this=%p sp=%p\n",this,__builtin_frame_address(0));
    puts(this>=__builtin_frame_address(0)?"PASS":"FAIL");
} };
int main() { C c;
  puts("exit"); }

The result is:

$ gcc -o asan asan.C -Wall -g -fsanitize=address;ASAN_OPTIONS=detect_stack_use_after_return=0 ./asan
C this=0x7fffd9dfb720 sp=0x7fffd9dfb6f0
PASS
$ gcc -o asan asan.C -Wall -g -fsanitize=address;ASAN_OPTIONS=detect_stack_use_after_return=1 ./asan
C this=0x7f08f6009020 sp=0x7ffef58196a0
FAIL

The compiler options in this patch just moves the `ASAN_OPTIONS=detect_stack_use_after_return=X` runtime configuration to compile time.

https://github.com/google/sanitizers/wiki/AddressSanitizerUseAfterReturn

The other option is to disable the `is_in_live_stack` assertion in the case of `#ifdef ADDRESS_SANITIZER` (or even detect somehow whether the ASAN option `detect_stack_use_after_return` is active, I did not investigate that).

-------------

PR Review Comment: https://git.openjdk.org/jdk/pull/19843#discussion_r1649878117


More information about the build-dev mailing list