Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

goroutineresourceleak (81st linter): paren_unwrap_gap across lock/cancel/channel detection, day one

Abierto Apto para principiantes
#68,591 0 comentarios 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
72/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
go
Área
tooling

Línea de trabajo

Empieza con pkg/linters/goroutineresourceleak/goroutineresourceleak.go, donde la línea 75 ya llama correctamente a astutil.UnwrapParenExpr. Envuelve de la misma forma las aserciones sin envolver de las líneas 209, 216, 228, 322, 346, 355 y 379. Añade a testdata/src/a/a.go variantes entre paréntesis de los casos de cancel, mutex y channel. Está terminado cuando esos casos de testdata pasan y las pruebas existentes también pasan.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

cookie sergo

Problem

pkg/linters/goroutineresourceleak (registered today via PR #68502, the 81st analyzer, registry.go confirms the delta from 80 to 81) independently reimplements lock/unlock, context-cancel, and channel send/receive/close detection rather than reusing the shared resourcetracker framework. It reproduces the long-established paren_unwrap_gap class (already filed and fixed across astutil.go, nilctxpassed, errstringmatch, sprintfbool, tolowerequalfold, timenowsub, httpstatuscode, seenmapbool, closeerrorunchecked, typeassertionnil, walkdirignoredeerror, and resourcetracker.go in prior runs) at no fewer than six call sites in one new file, pkg/linters/goroutineresourceleak/goroutineresourceleak.go:

  • contextCancelAcquisition (line 322): bare rhs.(*ast.CallExpr).
  • isDeferredCancel (line 346): bare deferStmt.Call.Fun.(*ast.Ident).
  • mutexLockAcquisition (line 355): bare exprStmt.X.(*ast.CallExpr).
  • isDeferredUnlock (line 379): bare deferStmt.Call.Fun.(*ast.SelectorExpr).
  • markChannelUsage (lines 209, 216, 228): bare *ast.Ident assertions on SendStmt.Chan, the close() call argument, and the UnaryExpr.X receive operand.

Notably, the same file already imports astutil and correctly calls astutil.UnwrapParenExpr at line 75 (astutil.UnwrapParenExpr(call.Fun).(*ast.FuncLit)) for the goroutine literal itself, so the gap is an inconsistency within the file rather than a missing dependency.

Impact

Parenthesized forms are valid Go and compile identically to unparenthesized ones, for example ctx, cancel := (context.WithCancel(ctx)), defer (cancel()), (mu.Lock()), defer (mu.Unlock()), (ch) <- v, <-(ch), close((ch)). For the acquisition/defer sites, a parenthesized acquisition or deferred cleanup call means the whole per-goroutine check never engages, so a goroutine with a genuine unguarded leak using one of these forms is never reported. For the channel usage sites, a genuinely-used channel referenced once through a parenthesized identifier is treated as never sent/received/closed, producing a false-positive leak report on otherwise-correct code.

Not yet wired into .github/workflows/cgo.yml LINTER_FLAGS, so currently latent rather than CI-breaking, matching the filing bar used for prior day-one findings on new linters such as typeassertionnil and closeerrorunchecked.

Recommendation

Wrap each of the six bare type assertions with astutil.UnwrapParenExpr(...) first, consistent with the correct usage already present at line 75 of the same file.

Validation

Add parenthesized-form variants to testdata/src/a/a.go for each of the three checks (cancel, mutex, channel) to lock in the fix and prevent regression.

Effort: Medium — six call-site fixes in one file plus matching testdata.

Generated by 🤖 Sergo - Serena Go Expert · claude · agent · 375.9 AIC · ⊞ 5.2K · ◷

  • expires on Oct 20, 2026, 8:01 PM UTC-08:00
Lenguaje dominante
Go
Estrellas
5.4k
Forks
584
Merge medio
3 h 56 min
PR fusionados (30 d)
810

Preparar el entorno

Abrir en Codespaces

Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de github/gh-aw

Todos los issues de github/gh-aw

Issues similares

Más issues de Go

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.