Changelog

Recent changes to marmot that you can see from the command line, grouped by day and by the part of marmot they touch. Changes to the compiler’s internals are not listed. RSS feed.

check

  • human output wraps notes and finding lines at word boundaries to the terminal width 592726e7
  • -staged checks what git has staged, for a pre-commit hook b672a754
  • -watch runs again after every change and reports only new and resolved findings 9ac9f702
  • an unchanged tree answers in 0.06 s; a one line edit in a 35 file package in 0.4 s d7bce69a
  • marmot fix leaves files someone else is editing alone bed9060b
  • marmot fix runs gofmt over the files it fixes when they were formatted before cb785d85
  • fmt formats the files go fmt would: those of the patterns' directories, without testdata, _ and . directories 87c766a9
  • exhaustive is opt in: -only exhaustive, or enabled in .golangci.yml ea68462a
  • a soft heap limit of 1.5 GiB unless GOMEMLIMIT is set 3949e6a5
  • dead code from per-package summaries 7ac97453
  • vuln scans imports first and loads the program only when it imports a vulnerable package 7ed07ae5
  • the dead code reuse test edits only a comment e924de2e
  • test for the dead code reuse f61c8db6
  • dead code reused while no package's references change; facts hashed canonically 3bbd551e
  • an importer's key covers its dependencies' export data and facts, not their inputs 3242f273
  • vuln beside cross and deadcode, and reused across body edits while no vulnerable package is imported 9b50c22c
  • gopls prints what gopls check prints 6f73fb2b
  • test for -changed 2b4f094b
  • use the user cache directory when the marmot build cache cannot be created da2f9642
  • marmot-check fix applies analyzer fixes in rounds and keeps only those that verify f76749cf
  • exhaustive and nil checks (report only) on the shared analysis pass 18e090f8
  • vuln runs govulncheck in process for every module and reports the vulnerabilities the code calls 1ed62313
  • deadcode, rapid type analysis from every main and test of the workspace 95387a5f
  • cross type checks every target of the platforms file through the cached engine cd07d790
  • fmt without the go command for files whose imports are complete, job slots weighted by package size fb7df391
  • gofmt the unused copy 140f48c5
  • cached go list graph, fmt keyed by file stat, unused with one object path encoder per package 78ffed88

cgo

  • _Bool parameters convert to bool before widening (cgo's named bool type) 77ca2be1
  • builds that generate the same cgo output at once (one program at several -O levels) share it instead of failing the rename or removing a directory in use 75ec36ab
  • fast path wrappers read the M once (rt_cgo_fast_enter returns it for rt_cgo_fast_exit) d108a61c
  • cross builds (clang --target and MARMOT_SYSROOT for cgo's probes and the C compiles; #cgo LDFLAGS in the bundle's link.sh) a35060ed
  • C functions that call nothing (after inlining, read from clang's IR of the wrappers) take the fast path d659b733
  • the pointer check covers unsafe.Pointer arguments through the heap's pointer bits of the object (rt_heap_object_span, rt_heap_ptr_word) 2f4c64c5
  • the pointer passing check (GODEBUG=cgocheck=1 by default): a typed pointer argument into the Go heap may point at no unpinned Go heap pointer; runtime.Pinner records its pins for it 4bd90723
  • errcheck: report written files and the removal of an unused export file; say why temporary cleanups are ignored bdee0686
  • marmot test of cgo packages (the test variant keeps its _test.go files; the external test package and the test main are left alone; go list's imports are kept) 2ff5d100
  • //export, the generator side 85a0cc6f
  • import "C" packages build, with C calls as direct native calls b03a4309

diag

  • errcheck: say why the wrapped line's write error is ignored 0a793047
  • wrapping keeps unquoted type names whole (struct { ... }, func(...) with its result type) 770de924
  • human output wraps messages, labels, notes and help at word boundaries to the terminal width (at most 100), continuations aligned under their text; backticked spans stay whole; source lines unwrapped; goldens at widths 60, 80, 120 b5ed280e
  • type mismatches point at the declarations the operand types come from 1ddfedc0
  • check and analyzer fields, codes M0100 to M0108 for marmot check findings, warning summaries 8a411d24
  • suggestions across files and packages; tests/diag/hard aa0ed217
  • rustc style anatomy, applicability, rendered text, interface and constraint explanations 73c0808f
  • one diagnostic model with human and JSON output, marmot fix and marmot explain b130621d

incremental

  • the API hash is a text of the package's own declarations, not its export data ca8412dc
  • main packages keep every name in their export data; the entry module fails without main dc008ec7
  • API module keys off by default again (an edit adding an instantiation of a dependency's generic function linked a broken program); tests/incremental: new instantiation and runtime edit cases 1d80f39b
  • runtime loads from export data; the generic pre-pass sees the cache 4af3a2d2
  • API module keys on by default (MARMOT_API_KEYS=0 turns them off) c30470f1
  • API module keys behind MARMOT_API_KEYS=1 until the conformance matrix and fuzz pass with them (rule 11); the default stays the dependencies' source c1cc883d
  • a module depends on its dependencies' API, not their source ed60919e

nilcheck

  • bound the guard search (boolean guards recursed through loop phis without end on real code) c2b4a3ec
  • a boolean guard cleared in a loop still guards (cyclic phis hold if their other edges do) 287400ab
  • a nil check reaches the use through a boolean (ok := p != nil && ...; if ok), negations, && and || chains 60edae6d
  • analyzer for dereferences and map writes of values that can be nil 5fa9a8dc

bind

  • count parameters named ...Count make an array a slice 5d25cf2e
  • C structs as Go structs of the same layout (passed and returned by value, size checked at compile time), struct literal macros as Go vars, arrays with a count as slices, [rename], same-line comments as docs, free functions called with their own parameter type 944acc91
  • no double unsafe.Pointer conversion for void buffers 27d5b7b6

marmot test

  • patterns with ... test every matching package, as go test does 3d31b687
  • failures first with source and log, a pass/fail tree with times, and -watch 11369c2e
  • JSON mode reports one line per test, failures as diagnostics with source context, and a result line eea465a4

marmot

  • MARMOT_MEMPROFILE writes an allocation profile of the compiler at exit 8b658524
  • command line on cobra with styled help (trimmed fang), completions and a man page d688ec16
  • list every error in JSON mode, JSON panics for marmot run under JSON mode, go get help for missing modules 1c9eebff

exhaustive

  • report only switches that handle more than half of the cases 8fa208d8
  • only types of the module, only switches that handle at least half of the cases a36f45cc
  • analyzer for switches that miss enum constants or sealed interface types d3c988bf

mcp

  • the test counts the check tool 738b7113
  • a check tool, and the check fix options of fix 7b2c5780

lint

  • remove unused code; an ineffectual assignment, an empty branch, an error string 9bc412b5
  • apply staticcheck's suggested fixes in cmd and internal (marmot fix -all -only lint) 89b59c5b

fmt

  • format the files the modernize commit left unformatted (import order, spacing) 55b9d090
  • goimports grouping and gofmt in codegen and fang (marmot fix -only fmt) c64ec2d2

repl

  • show fmt.Sprint results and a trailing expression after statements; end output without a newline before the prompt 930ddde8

allocs

  • place sites without a position at their use, a box at its argument; reasons name builtins and follow stores into locals b0d4a417

marmot test

  • build the go list -test main of a package and run it in the package dir, -test.* flags passed through 9712f409