Always validate bounds, nil pointers, and other potentially unsafe conditions before accessing values to prevent runtime panics and undefined behavior. This includes checking array/slice bounds, validating pointer references, and ensuring data structures are in expected states before use.
Always validate bounds, nil pointers, and other potentially unsafe conditions before accessing values to prevent runtime panics and undefined behavior. This includes checking array/slice bounds, validating pointer references, and ensuring data structures are in expected states before use.
Key validation patterns:
Example from bounds checking:
size := ts.Size()
for i := start; i <= stop && i >= 0 && i < size; i++ {
if tok := ts.Get(i); tok != nil && tok.GetTokenType() != antlr.TokenEOF {
b.WriteString(tok.GetText())
}
}
Example from pointer validation:
func ValidatePointer(dest any, caller string) error {
rv := reflect.ValueOf(dest)
if rv.Kind() != reflect.Pointer || rv.IsNil() {
return WrapCacheableErrors(reflect.TypeOf(dest), caller)
}
return nil
}
This proactive validation approach prevents common sources of runtime errors and makes code more robust by catching potential issues before they cause panics or undefined behavior.
Enter the URL of a public GitHub repository