From 881fa0b2b0720e0182654a2f0bc79c238e968c30 Mon Sep 17 00:00:00 2001 From: Tomas Tormo Date: Sun, 12 Nov 2023 22:09:45 +0000 Subject: [PATCH] Add SafePtr wrapper --- safeptr.go | 34 ++++++++++++++++++++++++++++++++++ safeptr_test.go | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 75 insertions(+) create mode 100644 safeptr.go create mode 100644 safeptr_test.go diff --git a/safeptr.go b/safeptr.go new file mode 100644 index 00000000..bbe24c2e --- /dev/null +++ b/safeptr.go @@ -0,0 +1,34 @@ +//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: +// +// - The type implements interfaces that are called by the logger, such as `fmt.Stringer`. +// - 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..4c38b9d8 --- /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 + 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) + } +}