On Mon, Oct 27, 2025 at 04:25:21PM -0700, Andrew Morton wrote: > On Mon, 27 Oct 2025 17:04:39 +0530 Ankit Khushwaha > <[email protected]> wrote: > > > Accessing 'reg.write_index' directly triggers a -Waddress-of-packed-member > > warning due to potential unaligned pointer access: > > > > perf_test.c:239:38: warning: taking address of packed member 'write_index' > > of class or structure 'user_reg' may result in an unaligned pointer value > > [-Waddress-of-packed-member] > > 239 | ASSERT_NE(-1, write(self->data_fd, ®.write_index, > > | ^~~~~~~~~~~~~~~ > > > > Use memcpy() instead to safely copy the value and avoid unaligned pointer > > access across architectures. > > > > ... > > > > --- a/tools/testing/selftests/user_events/perf_test.c > > +++ b/tools/testing/selftests/user_events/perf_test.c > > @@ -201,6 +201,7 @@ TEST_F(user, perf_empty_events) { > > struct perf_event_mmap_page *perf_page; > > int page_size = sysconf(_SC_PAGESIZE); > > int id, fd; > > + __u32 write_index; > > __u32 *val; > > > > reg.size = sizeof(reg); > > @@ -236,7 +237,8 @@ TEST_F(user, perf_empty_events) { > > ASSERT_EQ(1 << reg.enable_bit, self->check); > > > > /* Ensure write shows up at correct offset */ > > - ASSERT_NE(-1, write(self->data_fd, ®.write_index, > > + memcpy(&write_index, ®.write_index, sizeof(reg.write_index)); > > + ASSERT_NE(-1, write(self->data_fd, &write_index, > > sizeof(reg.write_index))); > > Simply casting &write_index to void* would fix this?
yes, this hides the type mismatch from the compiler. But i think casting to void * will not fix the alignment mismatch for packed struct. It works on x86, but might break on other platform. > > > val = (void *)(((char *)perf_page) + perf_page->data_offset); > > ASSERT_EQ(PERF_RECORD_SAMPLE, *val); Thanks Ankit

