Skip to content

field/error: Handle panic in Error()#867

Merged
abhinav merged 4 commits into
uber-go:masterfrom
FMLS:master
Nov 24, 2020
Merged

field/error: Handle panic in Error()#867
abhinav merged 4 commits into
uber-go:masterfrom
FMLS:master

Conversation

@FMLS
Copy link
Copy Markdown
Contributor

@FMLS FMLS commented Sep 24, 2020

We shouldn't panic if the Error() method of an error panics.

type T struct{ msg string }

func (t *T) Error() string { return t.msg }

// The following panics.
var n *T = nil
log.Info("panic", zap.Error(n))

@CLAassistant
Copy link
Copy Markdown

CLAassistant commented Sep 24, 2020

CLA assistant check
All committers have signed the CLA.

@codecov
Copy link
Copy Markdown

codecov Bot commented Sep 24, 2020

Codecov Report

Merging #867 (421e615) into master (404189c) will decrease coverage by 0.14%.
The diff coverage is 100.00%.

Impacted file tree graph

@@            Coverage Diff             @@
##           master     #867      +/-   ##
==========================================
- Coverage   98.36%   98.21%   -0.15%     
==========================================
  Files          43       43              
  Lines        2390     1910     -480     
==========================================
- Hits         2351     1876     -475     
+ Misses         32       27       -5     
  Partials        7        7              
Impacted Files Coverage Δ
zapcore/error.go 96.77% <100.00%> (+3.02%) ⬆️
zapcore/field.go 100.00% <100.00%> (ø)
internal/ztest/timeout.go 81.81% <0.00%> (-4.85%) ⬇️
zapcore/write_syncer.go 87.50% <0.00%> (-2.98%) ⬇️
internal/exit/exit.go 90.90% <0.00%> (-2.85%) ⬇️
zapcore/encoder.go 87.09% <0.00%> (-1.14%) ⬇️
zapcore/core.go 93.54% <0.00%> (-1.05%) ⬇️
zapcore/entry.go 93.82% <0.00%> (-0.80%) ⬇️
stacktrace.go 96.00% <0.00%> (-0.56%) ⬇️
global.go 96.66% <0.00%> (-0.48%) ⬇️
... and 35 more

Continue to review full report at Codecov.

Legend - Click here to learn more
Δ = absolute <relative> (impact), ø = not affected, ? = missing data
Powered by Codecov. Last update 404189c...421e615. Read the comment docs.

Copy link
Copy Markdown
Collaborator

@prashantv prashantv left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thank you for the contribution @FMLS

Using reflect check for nil isn't always right, as it's possible to have a nil value that implements the error interface,
https://play.golang.org/p/5T8S35zdGsH

To handle nil in this case, please follow the same logic used by Stringer to detect a nil panic (which uses recover, similar to the standard library).

Comment thread zapcore/field.go Outdated
Comment thread zapcore/field.go Outdated
Comment thread zapcore/error.go Outdated
Comment thread zapcore/error.go Outdated
Comment thread zapcore/error.go Outdated
Comment thread error.go Outdated
@abhinav abhinav changed the title BUGFIX: judge nil pointer stored in error interface field/error: Handle panic in Error() Nov 24, 2020
@abhinav abhinav requested a review from prashantv November 24, 2020 18:41
@abhinav abhinav merged commit 4b2b07c into uber-go:master Nov 24, 2020
RenovZ pushed a commit to RenovZ/zap that referenced this pull request Mar 25, 2022
We shouldn't panic if the `Error()` method of an `error` panics.

```
type T struct{ msg string }

func (t *T) Error() string { return t.msg }

// The following panics.
var n *T = nil
log.Info("panic", zap.Error(n))
```

Co-authored-by: Abhinav Gupta <mail@abhinavg.net>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

4 participants