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/classify_test.go | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) (limited to 'internal/generate/classify_test.go') diff --git a/internal/generate/classify_test.go b/internal/generate/classify_test.go index 28b4137..904a7ff 100644 --- a/internal/generate/classify_test.go +++ b/internal/generate/classify_test.go @@ -1522,7 +1522,17 @@ func TestClassifySyscallPairEmitsAllFamilies(t *testing.T) { if !strings.Contains(output, `SEC("tracepoint/syscalls/sys_enter_`+tt.name+`")`) { t.Errorf("syscall %s missing enter handler", tt.name) } - if !strings.Contains(output, `SEC("tracepoint/syscalls/sys_exit_`+tt.name+`")`) { + // Noreturn syscalls (exit, exit_group) are deliberately exempt from + // the exit-handler requirement: their sys_exit handler can never + // fire because the syscall never returns, so codegen suppresses it + // via isNoreturnSyscall (see TestGenerateExitNoreturnHandlers). For + // every other syscall the exit handler is still required. + hasExitHandler := strings.Contains(output, `SEC("tracepoint/syscalls/sys_exit_`+tt.name+`")`) + if isNoreturnSyscall(tt.name) { + if hasExitHandler { + t.Errorf("noreturn syscall %s must not emit an exit handler", tt.name) + } + } else if !hasExitHandler { t.Errorf("syscall %s missing exit handler", tt.name) } }) -- cgit v1.2.3