From: Huang Rui <vowstar@gmail.com>
Date: Wed, 11 Dec 2025 00:00:00 +0000
Subject: [PATCH] Fix uninitialized variable warning in drsyscall_linux.c

GCC 15 reports arg_val as used uninitialized due to the pointer aliasing
through *(union semun *) &arg_val. Use memcpy instead of type punning
for standard-compliant type conversion. Also zero-initialize the union
to ensure no uninitialized memory is accessed if union semun is larger
than ptr_int_t.

--- a/drsyscall/drsyscall_linux.c
+++ b/drsyscall/drsyscall_linux.c
@@ -972,11 +972,12 @@ handle_semctl(void *drcontext, cls_syscall_t *pt, sysarg_iter_info_t *ii,
 {
     /* int semctl(int semid, int semnum, int cmd, union semun arg) */
     uint cmd;
-    ptr_int_t arg_val;
-    union semun arg;
+    ptr_int_t arg_val = 0;
+    union semun arg = {0};
     int semid;
     ASSERT(argnum_semid + 3 < SYSCALL_NUM_ARG_STORE, "index too high");
     cmd = (uint) pt->sysarg[argnum_semid + 2];
     arg_val = (ptr_int_t) pt->sysarg[argnum_semid + 3];
-    arg = *(union semun *) &arg_val;
+    /* Use memcpy instead of type punning to avoid GCC 15 warnings */
+    memcpy(&arg, &arg_val, sizeof(arg_val));
     semid = (int) pt->sysarg[argnum_semid];
