Readit News logoReadit News
hydroxideOH- · 2 years ago
For those interested in this topic, I worked on improving dead code elimination in js_of_ocaml [1], a compiler from OCaml to JavaScript. The problem is more difficult in that case because of the indirection of OCaml's higher-order modules (functors).

[1]: https://www.micahcantor.com/blog/js-of-ocaml-dead-code/

hoten · 2 years ago
Finds unreachable functions but does not seem to find dead code in sense of unused writes to a variable (unless I misread the article). Guess there's something else that already catches that in Go?
nickcw · 2 years ago
One of the checkers in golangci-lint does this. I forget which one.

golangci-lint rolls up lot of linters and checkers into a single binary.

There is a config file too.

https://github.com/golangci/golangci-lint

mcdee · 2 years ago
It's called ineffassign
jstanley · 2 years ago
Cool but please don't make it a compile error!
codeflo · 2 years ago
I still find Go too tolerant on this. It should scan your Git history and stash as well, and fail to compile if it finds any unused code there.
SuperCuber · 2 years ago
That'd still be a bit too tolerant for my tastes. It should also scan your future commits.
jerf · 2 years ago
Ah, I know the programming language for you: https://news.ycombinator.com/item?id=5002597
mseepgood · 2 years ago
Could you please expand on this? Why would local Git stashes relate to code quality?
dewey · 2 years ago
Why not? What do you gain by keeping unused code in the codebase?
1zq · 2 years ago
I definitely don't want to keep unused code in version control, but for debugging or for working on things iteratively as the sibling comment said, my Go code usually ends up peppered with

  if 1==2 { ...some code to temporarily disable ... }
"Just comment it out" is not always enough because when I want to quickly toggle the code on and off multiple times in a single session, it's not possible to do by only commenting/uncommenting that single block.

Sometimes the code that's commented out contains the only reference to an imported package, and by commenting it out the autoformatter helpfully removes the import from the top of the file, so then uncommenting the line is not enough -- I need to go back and re-add the import.

Or I may want to comment out this line

  x = f(a, b)
but that makes a and b in turn become unused as well, and I need to travel up to wherever they're defined and comment them out too, and so on with anything else that became thus unused in that chain.

And this is all suboptimal because the warning is also important when debugging. I do want to get warned about the unused code! Just let me compile.

lynndotpy · 2 years ago
When I was doing Genuary in Rust, I started with a template that I would add some helper functions too that I could anticipate I would need for the art. Easy ones like "xy_to_polar".

I would do the first-time compile on this template and then add things iteratively.

Go would be a nonstarter for this experimental/artistic code, because I would usually have dead code in my "toolbox" to iterate and experiment with until I liked the end product.

AnimalMuppet · 2 years ago
Well, unused imports are a compile error, so there's precedent.
jstanley · 2 years ago
Yes, unreachable code after a "return" in a function is also a compile error. Very frustrating when I just want to nop out part of a function for debugging something else and have to keep fighting the compiler until I find a way that is acceptable.
radicalbyte · 2 years ago
It would break reflection surely? It's nice to have as a configuration / flag though as many project will be able to require it.
erik_seaberg · 2 years ago
Last I looked, reflection was missing a lot of things like looking up a function by name.
klodolph · 2 years ago
Sweet. For some reason, this has been an ongoing problem with Go’s tooling. I’m sure that there’s some underlying reason why the dead code finding tools have kept getting deprecated or had various problems.
starttoaster · 2 years ago
I'm somewhat confused about this because I've had gopls installed with vscode for years now, and as far back as I can remember, it always gave me a little yellow underlining warning when I had unused functions or unreachable blocks of code inside `if` or `switch-case` statements. It would seem to me that this has existed for a long time, or maybe it just builds on top of what was already there?
icholy · 2 years ago
I believe the checks you're referring are local to a package. It doesn't do whole program analysis like deadcode does.
superjared · 2 years ago
I inherited a go project that has two different commands under `cmd`, and it seems when I run this against one of those `main`s, it incorrectly detects what it thinks as dead code that is used in the other command.

Does anyone know how to work around this?

icholy · 2 years ago

    deadcode ./cmd/...

superjared · 2 years ago
Thanks. That doesn't work for me (for some reason _nothing_ is reported even though I know there's dead code) but it at least gives me a lead.
linuxftw · 2 years ago
The given example is a poor choice. Capitalized elements are public, and it's not safe to assume this code isn't being used as a library by other code outside the immediate repo.
duskwuff · 2 years ago
The paragraph titled "Tests" addresses this.

TL;DR: if your project is a library and an exported function looks like dead code, that means it isn't covered by any tests, and you should probably fix that.

v7n · 2 years ago
I will definitely use this! Also eager to see if it's fast enough to just run every time I save a bigger project.