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

deadcode超解剖

kuro
June 08, 2024

 deadcode超解剖

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