Upgrade to Pro — share decks privately, control downloads, hide ads and more …

deadcode超解剖

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.
Avatar for kuro kuro
June 08, 2024

 deadcode超解剖

Avatar for kuro

kuro

June 08, 2024
Tweet

More Decks by kuro

Other Decks in Programming

Transcript

  1. 実際にissueを見てみると。。。👀 - Add deadcode linter · Issue #4254 - Integrate

    new deadcode tool · Issue#4270 - Add golang.org/x/tools/cmd/deadcode support · Issue#4298 - Add official go deadcode linter · Issue#4383 →全てclosed
  2. なぜ採用されないのか? 理由: 1. unused との比較で、deadcodeの方がより false positive(偽陽性)があるから。 2. deadcodeはcommand lineでありlib(library)ではないか

    ら。 https://github.com/golangci/golangci-lint/issues/4254#issuecomment-1853840307 https://github.com/golangci/golangci-lint/issues/4254#issuecomment-1856231084
  3. deadcodeを使ってみて - $ deadcode -test ./... inference/inferred_value.go:52:25: unreachable func: DeterminedVal.isInferredVal

    inference/inferred_value.go:94:27: unreachable func: UndeterminedVal.isInferredVal - 「不要なメソッドだ!」とPR送ったけど、、、 type InferredVal interface { isInferredVal()👈ここと copy() InferredVal } func (e *DeterminedVal) isInferredVal() {}👈ここだけ func (e *DeterminedVal) copy() InferredVal { return &DeterminedVal{Bool: e.Bool} }
  4. deadcodeを使ってみて type InferredVal interface { isInferredVal()👈ここと copy() InferredVal } func

    (e *DeterminedVal) isInferredVal() {}👈ここだけ func (e *DeterminedVal) copy() InferredVal { return &DeterminedVal{Bool: e.Bool} } - 直接使用されていなくても、isInferredVal() メソッドをInferredVal interfaceに残 しておく。すると、意図した構造体(ここではDeterminedVal)だけが InferredVal interfaceを実装できる。 →意図しないバグを防ぐ。 - Goの実装でも使われている。👇 https://cs.opensource.google/go/go/+/refs/tags/go1.21.6:src/go/ast/ast.go;l=40
  5. 参考文献 - Finding unreachable functions with deadcode - The Go

    Programming Language - pkg.go.dev - rta - pkg.go.dev - deadcode - GitHub - golangci/golangci-lint: Fast linters runner for Go - GitHub - dominikh/go-tools/unused: Staticcheck  - The advanced Go linter