diff --git a/scope.go b/scope.go index b36ffba..f4e926e 100644 --- a/scope.go +++ b/scope.go @@ -79,7 +79,7 @@ func (s *Scope) FreeAll() { } if !s.freed.CompareAndSwap(false, true) { - return + panic("cgo.Scope.FreeAll: double-free detected") } s.lock.Lock() diff --git a/scope_test.go b/scope_test.go index f651616..9187118 100644 --- a/scope_test.go +++ b/scope_test.go @@ -17,7 +17,9 @@ func TestScopeFreesAllResources(t *testing.T) { } scope.FreeAll() - scope.FreeAll() // idempotent + assertPanics(t, "double-free", func() { + scope.FreeAll() + }) if !buffer.IsFreed() { t.Fatal("expected buffer to be freed") @@ -57,7 +59,7 @@ func TestScopeIsFreedTracksLifecycle(t *testing.T) { } } -func TestScopeCloseIsSafeAndIdempotent(t *testing.T) { +func TestScopeClosePanicsOnDoubleFree(t *testing.T) { t.Parallel() var nilScope *Scope @@ -79,7 +81,10 @@ func TestScopeCloseIsSafeAndIdempotent(t *testing.T) { t.Fatalf("expected close to return nil, got %v", err) } - scope.Close() + assertPanics(t, "double-free", func() { + scope.Close() + }) + if !buffer.IsFreed() { t.Fatal("expected buffer to be freed after close") }