Skip to content

Add MA0195 static-field initialization analyzer#1112

Merged
meziantou merged 1 commit intomainfrom
meziantou/static-field-order
May 2, 2026
Merged

Add MA0195 static-field initialization analyzer#1112
meziantou merged 1 commit intomainfrom
meziantou/static-field-order

Conversation

@meziantou
Copy link
Copy Markdown
Owner

Why

Static fields are initialized in declaration order. A static field initializer can read another static field before its initializer runs, which can produce confusing default values.

What changed

  • Added MA0195 to detect static-field reads from static field initializers when the referenced field may not be initialized yet.
  • Implemented detection for both:
    • later field declarations in the same partial declaration, and
    • references across partial declarations of the same type.
  • Limited reporting to referenced fields that have an explicit initializer.
  • Kept non-runtime/deferred cases out of scope (for example nameof(...) and lambda/local-function bodies in initializers).
  • Enabled analysis/reporting for generated code for this rule.

Tests

  • Added analyzer tests covering reporting and non-reporting scenarios, including partial-class cases where no diagnostic should be reported.
  • Updated tests based on review feedback (removed redundant severity/default test).

Docs and configuration

  • Added docs/Rules/MA0195.md.
  • Regenerated rule listings/config entries in README and analyzer pack editorconfig files to include MA0195.

Notes for reviewers

The rule currently relies on field declaration locations to model initialization order and treats cross-partial references conservatively as potentially unsafe.

Detect reads of static fields from static field initializers before the referenced field is initialized, including cross-partial declarations.

Add comprehensive tests for reporting and non-reporting cases (same-part ordering, partial classes, nameof, lambda, and fields without initializers), and update generated documentation/config tables for MA0195.

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@meziantou meziantou merged commit 176cf03 into main May 2, 2026
13 checks passed
@meziantou meziantou deleted the meziantou/static-field-order branch May 2, 2026 16:05
IhateTrains pushed a commit to ParadoxGameConverters/ImperatorToCK3 that referenced this pull request May 2, 2026
Updated
[Meziantou.Analyzer](https://github.com/meziantou/Meziantou.Analyzer)
from 3.0.58 to 3.0.59.

<details>
<summary>Release notes</summary>

_Sourced from [Meziantou.Analyzer's
releases](https://github.com/meziantou/Meziantou.Analyzer/releases)._

## 3.0.59

NuGet package:
<https://www.nuget.org/packages/Meziantou.Analyzer/3.0.59>

## What's Changed
* Add MA0195 static-field initialization analyzer by @​meziantou in
meziantou/Meziantou.Analyzer#1112


**Full Changelog**:
meziantou/Meziantou.Analyzer@3.0.58...3.0.59

Commits viewable in [compare
view](meziantou/Meziantou.Analyzer@3.0.58...3.0.59).
</details>

[![Dependabot compatibility
score](https://dependabot-badges.githubapp.com/badges/compatibility_score?dependency-name=Meziantou.Analyzer&package-manager=nuget&previous-version=3.0.58&new-version=3.0.59)](https://docs.github.com/en/github/managing-security-vulnerabilities/about-dependabot-security-updates#about-compatibility-scores)

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore this major version` will close this PR and stop
Dependabot creating any more for this major version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this minor version` will close this PR and stop
Dependabot creating any more for this minor version (unless you reopen
the PR or upgrade to it yourself)
- `@dependabot ignore this dependency` will close this PR and stop
Dependabot creating any more for this dependency (unless you reopen the
PR or upgrade to it yourself)


</details>

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Chris-Wolfgang added a commit to Chris-Wolfgang/DbContextBuilder that referenced this pull request May 4, 2026
Updated [EntityFramework](https://github.com/dotnet/ef6) from 6.5.1 to
6.5.2.

<details>
<summary>Release notes</summary>

_Sourced from [EntityFramework's
releases](https://github.com/dotnet/ef6/releases)._

## 6.5.2

## What's Changed
* Update Microsoft.Data.SqlClient to 5.1.6 by @​AndriySvyryd in
dotnet/ef6#2284
* Port .NET 10 first-class span support fix by @​Copilot in
dotnet/ef6#2365
* Fix HierarchyId parsing for numbers outside Int32 range by @​Copilot
in dotnet/ef6#2362
* Allow the tools to run on the newest SDK by @​AndriySvyryd in
dotnet/ef6#2396

**Full Changelog**:
dotnet/ef6@v6.5.1...v6.5.2

Commits viewable in [compare
view](dotnet/ef6@v6.5.1...v6.5.2).
</details>

Updated
[Meziantou.Analyzer](https://github.com/meziantou/Meziantou.Analyzer)
from 3.0.58 to 3.0.61.

<details>
<summary>Release notes</summary>

_Sourced from [Meziantou.Analyzer's
releases](https://github.com/meziantou/Meziantou.Analyzer/releases)._

## 3.0.61

NuGet package:
<https://www.nuget.org/packages/Meziantou.Analyzer/3.0.61>

## What's Changed
* MA0042: suppress diagnostic for
`IDbContextFactory<TContext>.CreateDbContext()` by @​Copilot in
meziantou/Meziantou.Analyzer#1116


**Full Changelog**:
meziantou/Meziantou.Analyzer@3.0.60...3.0.61

## 3.0.60

NuGet package:
<https://www.nuget.org/packages/Meziantou.Analyzer/3.0.60>

## What's Changed
* Add global severity modes for MeziantouAnalysisMode by @​meziantou in
meziantou/Meziantou.Analyzer#1114


**Full Changelog**:
meziantou/Meziantou.Analyzer@3.0.59...3.0.60

## 3.0.59

NuGet package:
<https://www.nuget.org/packages/Meziantou.Analyzer/3.0.59>

## What's Changed
* Add MA0195 static-field initialization analyzer by @​meziantou in
meziantou/Meziantou.Analyzer#1112


**Full Changelog**:
meziantou/Meziantou.Analyzer@3.0.58...3.0.59

Commits viewable in [compare
view](meziantou/Meziantou.Analyzer@3.0.58...3.0.61).
</details>

Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions


</details>
This was referenced May 4, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant