From 94c784e3e4bdc865f891df171507405941a706cf Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 23 Sep 2026 15:44:33 +0100 Subject: [PATCH 1/2] Add test with spurious results for go/unreachable-statement --- .../UnreachableStatement.expected | 1 + .../RedundantCode/UnreachableStatement/main.go | 17 +++++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/go/ql/test/query-tests/RedundantCode/UnreachableStatement/UnreachableStatement.expected b/go/ql/test/query-tests/RedundantCode/UnreachableStatement/UnreachableStatement.expected index 9c70b439d5b3..37a376384e0f 100644 --- a/go/ql/test/query-tests/RedundantCode/UnreachableStatement/UnreachableStatement.expected +++ b/go/ql/test/query-tests/RedundantCode/UnreachableStatement/UnreachableStatement.expected @@ -10,3 +10,4 @@ | main.go:147:2:147:17 | return statement | This statement is unreachable. | | main.go:153:2:153:22 | return statement | This statement is unreachable. | | main.go:159:2:159:43 | return statement | This statement is unreachable. | +| main.go:176:2:176:14 | return statement | This statement is unreachable. | diff --git a/go/ql/test/query-tests/RedundantCode/UnreachableStatement/main.go b/go/ql/test/query-tests/RedundantCode/UnreachableStatement/main.go index cc26b717f605..dbce1644dae6 100644 --- a/go/ql/test/query-tests/RedundantCode/UnreachableStatement/main.go +++ b/go/ql/test/query-tests/RedundantCode/UnreachableStatement/main.go @@ -159,4 +159,21 @@ func test19() mystruct { return mystruct{test10(1), test10(2) == 2} // $ Alert } +type ( + embedded struct{} + recursive struct { + *embedded + value int + *recursive + } +) + +func test20(x *recursive) []int { + values := []int{0} + if x.value != 0 { + values = append(values, x.value) + } + return values // $ SPURIOUS: Alert // BUG: reachable because value is a direct field of recursive +} + func main() {} From cc16593f5c43e550893f34a531b0aa3074b43db5 Mon Sep 17 00:00:00 2001 From: Owen Mansel-Chan Date: Wed, 23 Sep 2026 15:51:08 +0100 Subject: [PATCH 2/2] Fix bug - implicit field selection created with depth 0 --- go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll | 5 +++-- .../UnreachableStatement/UnreachableStatement.expected | 1 - .../query-tests/RedundantCode/UnreachableStatement/main.go | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll index 1da4b1e51231..1bdcf277d2c8 100644 --- a/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll +++ b/go/ql/lib/semmle/go/controlflow/ControlFlowGraphImpl.qll @@ -679,7 +679,7 @@ module CfgImpl { e.(Go::PromotedSelector).refersTo(explicitField) and baseType.getFieldAtDepth(_, explicitFieldDepth) = explicitField | - index = explicitFieldDepth - implicitFieldDepth + index = explicitFieldDepth - implicitFieldDepth and index > 0 ) ) or @@ -689,7 +689,8 @@ module CfgImpl { baseType = e.(Go::PromotedSelector).getSelectedStructType() and e.(Go::PromotedSelector).refersTo(method) and baseType.getMethodAtDepth(_, mDepth) = method and - index = mDepth - implicitFieldDepth + index = mDepth - implicitFieldDepth and + index > 0 | method = baseType.getMethodOfEmbedded(implicitField, _, implicitFieldDepth + 1) or diff --git a/go/ql/test/query-tests/RedundantCode/UnreachableStatement/UnreachableStatement.expected b/go/ql/test/query-tests/RedundantCode/UnreachableStatement/UnreachableStatement.expected index 37a376384e0f..9c70b439d5b3 100644 --- a/go/ql/test/query-tests/RedundantCode/UnreachableStatement/UnreachableStatement.expected +++ b/go/ql/test/query-tests/RedundantCode/UnreachableStatement/UnreachableStatement.expected @@ -10,4 +10,3 @@ | main.go:147:2:147:17 | return statement | This statement is unreachable. | | main.go:153:2:153:22 | return statement | This statement is unreachable. | | main.go:159:2:159:43 | return statement | This statement is unreachable. | -| main.go:176:2:176:14 | return statement | This statement is unreachable. | diff --git a/go/ql/test/query-tests/RedundantCode/UnreachableStatement/main.go b/go/ql/test/query-tests/RedundantCode/UnreachableStatement/main.go index dbce1644dae6..db36be0c552f 100644 --- a/go/ql/test/query-tests/RedundantCode/UnreachableStatement/main.go +++ b/go/ql/test/query-tests/RedundantCode/UnreachableStatement/main.go @@ -173,7 +173,7 @@ func test20(x *recursive) []int { if x.value != 0 { values = append(values, x.value) } - return values // $ SPURIOUS: Alert // BUG: reachable because value is a direct field of recursive + return values // OK: reachable because value is a direct field of recursive } func main() {}