STINNER Victor <vstin...@python.org> added the comment:
On my Fedora 31, epoll_event structure is defined in sys/epoll.h as: typedef union epoll_data { void *ptr; int fd; uint32_t u32; uint64_t u64; } epoll_data_t; struct epoll_event { uint32_t events; /* Epoll events */ epoll_data_t data; /* User data variable */ } __EPOLL_PACKED; I can reproduce the issue using this Python script: import select p = select.epoll() p.register(1, select.EPOLLIN) p.poll(0) The Linux syscall is defined as: asmlinkage long sys_epoll_ctl(int epfd, int op, int fd, struct epoll_event __user *event); It's implemented in fs/eventpoll.c: https://github.com/torvalds/linux/blob/c79f46a282390e0f5b306007bf7b11a46d529538/fs/eventpoll.c#L2077-L2083 Valgrind complains that ev.data is only partially initialized: it's a 64-bit structure, but we only set ev.data.fd. I guess that the glibc implements epoll_ctl() as a raw system call: Valgrind is unable to know if it's ok to only partially initialize the epoll_data union. Benjamin: "I suspect Valgrind is being too conservative. union epoll_data is 64 bits wide but the file descriptor only occupies the first 32 bits. The last 32 bits don't need to be initialized by the application." Right. But Valgrind is not smart enough. I see 2 options: * Initialize ev.data to 0 * Use Misc/valgrind-python.supp to ignore this *false alarm* ---------- nosy: +vstinner _______________________________________ Python tracker <rep...@bugs.python.org> <https://bugs.python.org/issue35561> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com