diff --git a/safeptr.go b/safeptr.go new file mode 100644 index 00000000..f9cda760 --- /dev/null +++ b/safeptr.go @@ -0,0 +1,32 @@ +//go:build go1.18 +// +build go1.18 + +/* +Copyright 2023 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package klog + +// SafePtr is a function that takes a pointer of any type (T) as an argument. +// If the provided pointer is not nil, it returns the same pointer. If it is nil, it returns nil instead. +// This function is particularly useful to prevent nil pointer dereferencing when: +// a) The type implements interfaces that are called by the logger, such as `fmt.Stringer` +// b) And these interface implementations do not perform nil checks themselves +func SafePtr[T any](p *T) any { + if p == nil { + return nil + } + return p +} diff --git a/safeptr_test.go b/safeptr_test.go new file mode 100644 index 00000000..29e03c39 --- /dev/null +++ b/safeptr_test.go @@ -0,0 +1,41 @@ +//go:build go1.18 +// +build go1.18 + +/* +Copyright 2023 The Kubernetes Authors. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package klog_test + +import ( + "testing" + + "k8s.io/klog/v2" +) + +func TestSafePtr(t *testing.T) { + // Test with nil pointer + var stringPtr *string = nil + if result := klog.SafePtr(stringPtr); result != nil { + t.Errorf("Expected nil, got %p", result) + } + + // Test with non-nil pointer + expected := "foo" + stringPtr = &expected + if result := klog.SafePtr(stringPtr); result != stringPtr { + t.Errorf("Expected %v, got %v", stringPtr, result) + } +}