Issue 177353
Summary [BUG] Clang/llvm incorrectly optimized out a structure variable, causing OpenJDK crash
Labels clang
Assignees
Reporter sendaoYan
    Clang/llvm incorrectly eliminated structure variable `cdata` in function `handleMessage`, causing OpenJDK to crash. This seems like clang/llvm bug, so I create this issue.

Crash log:

```
# A fatal error has been detected by the Java Runtime Environment:
#
#  SIGSEGV (0xb) at pc=0x00007f3748088ace, pid=1476416, tid=1476448
#
# JRE version: OpenJDK Runtime Environment (27.0) (build 27-internal-adhoc.yansendao.jdk-ysd)
# Java VM: OpenJDK 64-Bit Server VM (27-internal-adhoc.yansendao.jdk-ysd, mixed mode, sharing, tiered, compressed oops, compressed class ptrs, g1 gc, linux-amd64)
# Problematic frame:
# C  [libsctp.so+0x3ace] handleMessage+0x4e
#
# No core dump will be written. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
#
# An error report file with more information is saved as:
# /data/yansendao/git/jdk-ysd/build/manual-run/jt-work/scratch/hs_err_pid1476416.log
```

The function `handleMessage` of a file from OpenJDK, localted at https://github.com/openjdk/jdk/blob/master/src/jdk.sctp/unix/native/libsctp/SctpChannelImpl.c#L388


Function `handleMessage` implementation:

getControlData will write all the files of cdata. But cdata has been optimized out by clang/llvm. So JVM crash at function handleMessage.

```c
void handleMessage
  (JNIEnv* env, jobject resultContainerObj, struct msghdr* msg,int read,
   jboolean isEOR, struct sockaddr* sap) {
    jobject isa, resultObj;
    struct controlData cdata[1];

    if (read == 0) {
        /* we reached EOF */
        read = -1;
    }

    isa = SockAddrToInetSocketAddress(env, sap);
 CHECK_NULL(isa);
    getControlData(msg, cdata);

    /* create MessageInfoImpl */
    resultObj = (*env)->NewObject(env, smi_class, smi_ctrID, cdata->assocId,
                                  isa, read, cdata->streamNumber,
                                  isEOR ? JNI_TRUE : JNI_FALSE,
                                  cdata->unordered, cdata->ppid);
    CHECK_NULL(resultObj);
    (*env)->SetObjectField(env, resultContainerObj, src_valueID, resultObj);
    (*env)->SetIntField(env, resultContainerObj, src_typeID,
 sun_nio_ch_sctp_ResultContainer_MESSAGE);
}
```

gdb shows that the struct variable cdate has been optimized out.

```gdb
Thread 32 "MainThread" hit Breakpoint 1, handleMessage (env=0x7ffff08cd578, resultContainerObj=0x7fff74c8ad98, msg=0x7fff74c8abf0, read=<optimized out>, isEOR=128 '\200', sap=0x7fff74c8abcc) at src/jdk.sctp/unix/native/libsctp/SctpChannelImpl.c:399
399         isa = SockAddrToInetSocketAddress(env, sap);
(gdb) n
400 CHECK_NULL(isa);
(gdb) 
401         getControlData(msg, cdata);
(gdb) s
0x00007ffff40a5aae in getControlData (msg=0x7fff74c8abf0, cdata=<optimized out>) at src/jdk.sctp/unix/native/libsctp/SctpChannelImpl.c:137
137 for (cmsg = CMSG_FIRSTHDR(msg); cmsg != NULL; cmsg = CMSG_NXTHDR(msg, cmsg)) {
```


SctpChannelImpl.c build command shows below:
```bash
/data/yansendao/JDK/binary/llvm/llvm-binary-23/bin/clang -MMD -MF /data/yansendao/git/jdk-ysd/build/clang/support/native/jdk.sctp/libsctp/SctpChannelImpl.d.tmp -pipe -fvisibility=hidden -fstack-protector -finput-charset=utf-8 -DLIBC=gnu -D_GNU_SOURCE -D_REENTRANT -D_FILE_OFFSET_BITS=64 -DLINUX -DNDEBUG -Wall -Wextra -Wformat=2 -Wpointer-arith -Wsign-compare -Wreorder -Wunused-function -Wundef -Wunused-value -Woverloaded-virtual -fmacro-prefix-map=/data/yansendao/git/jdk-ysd/= -std=c11 -fno-strict-aliasing -m64 -g -D_LITTLE_ENDIAN '-DARCH="amd64"' -Damd64 -D_LP64=1 -fno-omit-frame-pointer -fPIC -I/data/yansendao/git/jdk-ysd/src/jdk.sctp/unix/native/libsctp -I/data/yansendao/git/jdk-ysd/build/clang/support/headers/jdk.sctp -I/data/yansendao/git/jdk-ysd/build/clang/support/headers/java.base -I/data/yansendao/git/jdk-ysd/src/hotspot/share/include -I/data/yansendao/git/jdk-ysd/src/hotspot/os/posix/include -I/data/yansendao/git/jdk-ysd/src/java.base/linux/native/libnio -I/data/yansendao/git/jdk-ysd/src/java.base/unix/native/libnio -I/data/yansendao/git/jdk-ysd/src/java.base/share/native/libnio -I/data/yansendao/git/jdk-ysd/src/java.base/linux/native/libnio/ch -I/data/yansendao/git/jdk-ysd/src/java.base/unix/native/libnio/ch -I/data/yansendao/git/jdk-ysd/src/java.base/share/native/libnio/ch -I/data/yansendao/git/jdk-ysd/src/java.base/linux/native/libjava -I/data/yansendao/git/jdk-ysd/src/java.base/unix/native/libjava -I/data/yansendao/git/jdk-ysd/src/java.base/share/native/libjava -I/data/yansendao/git/jdk-ysd/src/java.base/unix/native/libnet -I/data/yansendao/git/jdk-ysd/src/java.base/share/native/libnet -I/data/yansendao/git/jdk-ysd/build/clang/support/modules_include/java.base -I/data/yansendao/git/jdk-ysd/src/java.base/unix/native/include -I/data/yansendao/git/jdk-ysd/src/java.base/share/native/include -gdwarf-4 -gdwarf-aranges -g -fdebug-prefix-map=/data/yansendao/git/jdk-ysd/= -Wno-unknown-warning-option -Wno-unused-parameter -Werror -O2 -c -o /data/yansendao/git/jdk-ysd/build/clang/support/native/jdk.sctp/libsctp/SctpChannelImpl.o /data/yansendao/git/jdk-ysd/src/jdk.sctp/unix/native/libsctp/SctpChannelImpl.c -frandom-seed=SctpChannelImpl.c
```

The files generated by --save-temps:

[SctpChannelImpl.zip](https://github.com/user-attachments/files/24794860/SctpChannelImpl.zip)

_______________________________________________
llvm-bugs mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/llvm-bugs

Reply via email to