Skip to content

formatter: guard diagnostics with no source range - #2562

Merged
bendrucker merged 1 commit into
masterfrom
formatter-nil-subject
Jun 10, 2026
Merged

formatter: guard diagnostics with no source range#2562
bendrucker merged 1 commit into
masterfrom
formatter-nil-subject

Conversation

@bendrucker

Copy link
Copy Markdown
Member

Guards every formatter against an hcl.Diagnostic with a nil Subject. The JSON, SARIF, JUnit, Checkstyle, and Compact formatters all dereferenced diag.Subject unconditionally when rendering an hcl.Diagnostics error, so a diagnostic without a source range crashes the process with a nil pointer panic. HCL documents Subject as optional ("some diagnostics have no source ranges at all").

I couldn't reach this from current CLI input: every host-side diagnostic producer sets Subject, and plugin diagnostics cross the gRPC boundary as plain strings rather than hcl.Diagnostics. So this is hardening against a documented-nullable field, not a fix for a live crash. The SDK's own hclext decode does emit nil-Subject diagnostics ("Missing attribute/block"), so a future path that surfaces those host-side would hit it.

Changes

  • Adds a diagRange helper in errors.go that returns a zero hcl.Range when Subject is nil.
  • json.go omits the range when Subject is nil. JSONError.Range is already a pointer with omitempty for this.
  • checkstyle.go, junit.go, and compact.go render through diagRange, so a missing subject yields an empty filename and zero line/column, matching how those formats already render empty issue ranges.
  • sarif.go emits the result without a location when Subject is nil, mirroring the issue path that already attaches locations conditionally.

The non-nil path is byte-for-byte unchanged in every format. The default (pretty) format was already safe because HCL's DiagnosticTextWriter handles a nil Subject.

Testing

Adds a nil-Subject case to each format's table test (json, sarif, junit, checkstyle, compact). Each case panics on master and passes here.

@bendrucker
bendrucker merged commit 6c04482 into master Jun 10, 2026
19 checks passed
@bendrucker
bendrucker deleted the formatter-nil-subject branch June 10, 2026 16:17
tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Jul 21, 2026
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [tflint](https://github.com/terraform-linters/tflint) | minor | `0.63.1` → `0.64.0` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>terraform-linters/tflint (tflint)</summary>

### [`v0.64.0`](https://github.com/terraform-linters/tflint/releases/tag/v0.64.0)

[Compare Source](terraform-linters/tflint@v0.63.1...v0.64.0)

#### What's Changed

##### Enhancements

- cmd: include worker dir for no-range recursive issues by [@&#8203;Zakharden](https://github.com/Zakharden) in [#&#8203;2524](terraform-linters/tflint#2524)
- config: add ignorable rule setting by [@&#8203;Zakharden](https://github.com/Zakharden) in [#&#8203;2525](terraform-linters/tflint#2525)
- formatter(junit): include range in testcase name by [@&#8203;Zakharden](https://github.com/Zakharden) in [#&#8203;2538](terraform-linters/tflint#2538)

##### Bug Fixes

- plugin: fetch attestation bundles from bundle\_url by [@&#8203;Kunalbehbud](https://github.com/Kunalbehbud) in [#&#8203;2593](terraform-linters/tflint#2593)
  - Merged as [#&#8203;2600](terraform-linters/tflint#2600)

##### Chores

- Refactor formatter dispatch into format adapters by [@&#8203;bendrucker](https://github.com/bendrucker) in [#&#8203;2556](terraform-linters/tflint#2556)
- Inline per-format print methods into their adapters by [@&#8203;bendrucker](https://github.com/bendrucker) in [#&#8203;2557](terraform-linters/tflint#2557)
- build(deps): Bump docker/setup-buildx-action from 4.0.0 to 4.1.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;2559](terraform-linters/tflint#2559)
- build(deps): Bump github.com/mattn/go-colorable from 0.1.14 to 0.1.15 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;2560](terraform-linters/tflint#2560)
- build(deps): Bump golang from 1.26.3-alpine3.23 to 1.26.4-alpine3.23 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;2558](terraform-linters/tflint#2558)
- release: Set branch name for Homebrew tap by [@&#8203;wata727](https://github.com/wata727) in [#&#8203;2561](terraform-linters/tflint#2561)
- Extract the shared runner-setup pipeline by [@&#8203;bendrucker](https://github.com/bendrucker) in [#&#8203;2555](terraform-linters/tflint#2555)
- formatter: guard diagnostics with no source range by [@&#8203;bendrucker](https://github.com/bendrucker) in [#&#8203;2562](terraform-linters/tflint#2562)
- docs: add Go install instructions to README by [@&#8203;RoseSecurity](https://github.com/RoseSecurity) in [#&#8203;2563](terraform-linters/tflint#2563)
- build(deps): Bump actions/checkout from 6.0.2 to 6.0.3 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;2565](terraform-linters/tflint#2565)
- build(deps): Bump alpine from 3.23.4 to 3.24.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;2566](terraform-linters/tflint#2566)
- build(deps): Bump the go-x group with 2 updates by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;2567](terraform-linters/tflint#2567)
- build(deps): Bump github.com/sigstore/sigstore-go from 1.1.4 to 1.2.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;2568](terraform-linters/tflint#2568)
- fix(install): close download and zip readers by [@&#8203;RoseSecurity](https://github.com/RoseSecurity) in [#&#8203;2564](terraform-linters/tflint#2564)
- build(deps): Bump alpine from 3.24.0 to 3.24.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;2570](terraform-linters/tflint#2570)
- build(deps): Bump golang.org/x/net from 0.55.0 to 0.56.0 in the go-x group by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;2571](terraform-linters/tflint#2571)
- build(deps): Bump github.com/sigstore/sigstore-go from 1.2.0 to 1.2.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;2572](terraform-linters/tflint#2572)
- build(deps): Bump actions/checkout from 6.0.3 to 7.0.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;2579](terraform-linters/tflint#2579)
- build(deps): Bump actions/setup-go from 6.4.0 to 6.5.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;2580](terraform-linters/tflint#2580)
- build(deps): Bump golangci/golangci-lint-action from 9.2.1 to 9.3.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;2583](terraform-linters/tflint#2583)
- build(deps): Bump goreleaser/goreleaser-action from 7.2.2 to 7.2.3 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;2582](terraform-linters/tflint#2582)
- build(deps): Bump actions/attest from 4.1.0 to 4.1.1 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;2581](terraform-linters/tflint#2581)
- build(deps): Bump docker/build-push-action from 7.2.0 to 7.3.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;2584](terraform-linters/tflint#2584)
- build(deps): Bump golang.org/x/text from 0.38.0 to 0.39.0 in the go-x group by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;2585](terraform-linters/tflint#2585)
- build(deps): Bump github.com/sigstore/sigstore-go from 1.2.1 to 1.2.2 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;2588](terraform-linters/tflint#2588)
- build(deps): Bump google.golang.org/grpc from 1.81.1 to 1.82.0 by [@&#8203;dependabot](https://github.com/dependabot)\[bot] in [#&#8203;2587](terraform-linters/tflint#2587)

#### New Contributors

- [@&#8203;Zakharden](https://github.com/Zakharden) made their first contribution in [#&#8203;2524](terraform-linters/tflint#2524)
- [@&#8203;RoseSecurity](https://github.com/RoseSecurity) made their first contribution in [#&#8203;2563](terraform-linters/tflint#2563)
- [@&#8203;Kunalbehbud](https://github.com/Kunalbehbud) made their first contribution in [#&#8203;2593](terraform-linters/tflint#2593)

**Full Changelog**: <terraform-linters/tflint@v0.63.1...v0.64.0>

</details>

---

### Configuration

📅 **Schedule**: (UTC)

- Branch creation
  - At any time (no schedule defined)
- Automerge
  - At any time (no schedule defined)

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Mend Renovate](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0My4yNzIuNiIsInVwZGF0ZWRJblZlciI6IjQzLjI3Mi42IiwidGFyZ2V0QnJhbmNoIjoibWFpbiIsImxhYmVscyI6WyJSZW5vdmF0ZSBCb3QiLCJhdXRvbWF0aW9uOmJvdC1hdXRob3JlZCIsImRlcGVuZGVuY3ktdHlwZTo6bWlub3IiXX0=-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Development

Successfully merging this pull request may close these issues.

1 participant