Skip to content

Go: fix CFG bug - no control flow beyond go panic() - #22671

Open
owen-mc wants to merge 3 commits into
github:mainfrom
owen-mc:go/fix/go-panic-abrupt-completion
Open

owen-mc wants to merge 3 commits into
github:mainfrom
owen-mc:go/fix/go-panic-abrupt-completion

Conversation

@owen-mc

@owen-mc owen-mc commented Sep 23, 2026

Copy link
Copy Markdown
Contributor

This fixes a bug where control flow stops at go panic(). This bug was introduced when migrating Go to the new shared CFG library. It caused FPs in go/unreachable-statement. A test has been added to demonstrate the bug and show that it is fixed.

This does not need a change note as it is fixing an FP that hasn't been in any release.

@owen-mc
owen-mc requested review from a team and a balanced review from Copilot September 23, 2026 15:26
@owen-mc
owen-mc requested a review from a team as a code owner September 23, 2026 15:26
@owen-mc owen-mc added the no-change-note-required This PR does not need a change note label Sep 23, 2026

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot review overview

🟡 Changes recommended

The existing direct CFG expected output must be updated for the removed exceptional edge.

Get a fresh assessment by requesting another Copilot review.

Review effort: Balanced
Findings: 1 High severity

Open (1)
What changed in this PR

Fixes Go CFG handling so go calls do not terminate control flow in the caller.

Changes:

  • Excludes goroutine calls from abrupt-completion modeling.
  • Adds an unreachable-statement regression test.
File Description
ControlFlowGraphImpl.qll Corrects CFG behavior for goroutine calls.
UnreachableStatement/​main.go Adds a go panic() regression case.

💡 Add a code-review agent skill or configure MCP servers for context-aware, tailored reviews. Learn more in the docs.

Ast::AstNode ast, PreControlFlowNode n, AbruptCompletion c, boolean always
) {
ast instanceof Go::CallExpr and
not isGoStmtCall(ast) and
private predicate notBlankIdent(Go::Expr e) { not e instanceof Go::BlankIdent }

/** Holds if `e` is invoked in a newly started goroutine. */
private predicate isGoStmtCall(Ast::AstNode e) { e = any(Go::GoStmt s).getCall() }
@github-actions github-actions Bot added the Go label Sep 23, 2026

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Go no-change-note-required This PR does not need a change note

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants