RFR: 8346193: Test runtime/ErrorHandling/TestDwarf.java fails build with clang17
David Holmes
dholmes at openjdk.org
Tue Dec 17 07:09:39 UTC 2024
On Mon, 16 Dec 2024 09:53:08 GMT, SendaoYan <syan at openjdk.org> wrote:
> Hi all,
> Function `frame::oops_do_internal` in src/hotspot/share/runtime/frame.cpp assign value to a nullptr `char *t` and intended to cause jvm crash. But after the assignment the nullptr do not use anymore, so clang17 consider the `char *t` initialization and assignment is "dead code". This PR add `volatile` modifier to `char *t`, to make avoid clang do the "dead code" elimination. Risk is low.
>
> Here is the example explain the "dead code" elimination.
>
> 1. Without volatile modifier, clang will delete the "dead code" and cause no more Segmentation fault error by -O1.
>
>
>> cat demo.c
> int main() { char *t = 0; *t = 'c'; return 0; }
>> clang -O0 demo.c && ./a.out ; echo $?
> Segmentation fault (core dumped)
> 139
>> clang -O1 demo.c && ./a.out ; echo $?
> 0
>
>
> 2. With volatile modifier, clang do not delete the "dead code" again and and the expected Segmentation fault occur by -O1.
>
>> cat demo.c
> int main() { volatile char *t = 0; *t = 'c'; return 0; }
>> clang -O0 demo.c && ./a.out ; echo $?
> Segmentation fault (core dumped)
> 139
>> clang -O1 demo.c && ./a.out ; echo $?
> Segmentation fault (core dumped)
> 139
src/hotspot/share/runtime/frame.cpp line 1166:
> 1164: // simulate GC crash here to dump java thread in error report
> 1165: if (CrashGCForDumpingJavaThread) {
> 1166: volatile char *t = nullptr; // Use volatile modifier to make clang avoid 'dead code' elimination
Suggestion:
volatile char* t = nullptr; // Use volatile to prevent compiler from optimising away the store
-------------
PR Review Comment: https://git.openjdk.org/jdk/pull/22757#discussion_r1887999830
More information about the hotspot-dev
mailing list