Skip to content

Commit

Permalink
Merge pull request #393 from kaisoz/add-safeptr
Browse files Browse the repository at this point in the history
Add SafePtr wrapper
  • Loading branch information
k8s-ci-robot committed Nov 17, 2023
2 parents 8dd3f2e + 881fa0b commit 2086216
Show file tree
Hide file tree
Showing 2 changed files with 75 additions and 0 deletions.
34 changes: 34 additions & 0 deletions 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 {

Check failure on line 29 in safeptr.go

View workflow job for this annotation

GitHub Actions / test (1.19, ubuntu-latest)

type parameter requires go1.18 or later (-lang was set to go1.13; check go.mod)

Check failure on line 29 in safeptr.go

View workflow job for this annotation

GitHub Actions / test (1.19, ubuntu-latest)

predeclared any requires go1.18 or later (-lang was set to go1.13; check go.mod)

Check failure on line 29 in safeptr.go

View workflow job for this annotation

GitHub Actions / test (1.18, ubuntu-latest)

type parameter requires go1.18 or later (-lang was set to go1.13; check go.mod)

Check failure on line 29 in safeptr.go

View workflow job for this annotation

GitHub Actions / test (1.18, ubuntu-latest)

undeclared name: any (requires version go1.18 or later)

Check failure on line 29 in safeptr.go

View workflow job for this annotation

GitHub Actions / test (1.19, macos-latest)

type parameter requires go1.18 or later (-lang was set to go1.13; check go.mod)

Check failure on line 29 in safeptr.go

View workflow job for this annotation

GitHub Actions / test (1.19, macos-latest)

predeclared any requires go1.18 or later (-lang was set to go1.13; check go.mod)
if p == nil {
return nil
}
return p
}
41 changes: 41 additions & 0 deletions 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)
}
}

0 comments on commit 2086216

Please sign in to comment.