From 55f52dc3d270bd0edbaa1f338c8798598721e2f1 Mon Sep 17 00:00:00 2001 From: Paul Buetow Date: Fri, 29 May 2026 10:26:01 +0300 Subject: codegen: suppress unreachable sys_exit handlers for noreturn syscalls exit and exit_group never return to userspace, so their sys_exit tracepoints can never fire. The generator previously emitted matching EXIT_RET_EVENT handlers anyway, producing dead code in the generated BPF program. classifySyscall now skips exit-handler emission for noreturn syscalls via isNoreturnSyscall, and the regenerated artifacts drop the sys_exit_exit / sys_exit_exit_group handlers (enter handlers are kept). Tests updated to match the new reality: - TestGenerateExitNoreturnHandlers asserts no exit handler is emitted. - TestClassifySyscallPairEmitsAllFamilies exempts noreturn syscalls from the exit-handler-required assertion while staying strict for all others. Co-Authored-By: Claude Opus 4.8 --- internal/generate/codegen.go | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) (limited to 'internal/generate/codegen.go') diff --git a/internal/generate/codegen.go b/internal/generate/codegen.go index 3848b93..339dc1f 100644 --- a/internal/generate/codegen.go +++ b/internal/generate/codegen.go @@ -125,7 +125,11 @@ func classifySyscall(sc Syscall) ([]GeneratedTracepoint, string) { if sc.Enter != nil { result = append(result, GeneratedTracepoint{Format: sc.Enter, Classification: enterClass}) } - if sc.Exit != nil { + // Emit the exit handler only for syscalls that can actually return. + // Noreturn syscalls (exit, exit_group) never return to userspace, so their + // sys_exit tracepoint never fires; emitting a handler would be dead code in + // the generated BPF program. We still emit their enter handler above. + if sc.Exit != nil && !isNoreturnSyscall(sc.Name) { result = append(result, GeneratedTracepoint{Format: sc.Exit, Classification: exitClass}) } return result, "" @@ -146,6 +150,21 @@ func isEnterRejected(kind TracepointKind) bool { return !lookupKind(kind).enterAccepted } +// noreturnSyscalls lists syscalls that never return control to userspace. +// Their sys_exit tracepoint can never fire, so the generator suppresses the +// matching exit handler (see classifySyscall) to avoid dead code in the +// generated BPF program. +var noreturnSyscalls = map[string]bool{ + "exit": true, + "exit_group": true, +} + +// isNoreturnSyscall reports whether the named syscall never returns and thus +// must not have an exit handler emitted. +func isNoreturnSyscall(name string) bool { + return noreturnSyscalls[name] +} + func syscallFormatNames(sc Syscall) []string { var names []string if sc.Enter != nil { -- cgit v1.2.3