注意点
このページは、dotnet/runtimeリポジトリにマージされたPull Requestを自動的に収集し、その内容をAIが要約した内容を表示しています。そのため、必ずしも正確な要約ではない場合があります。
目次
- #128647 Add RuntimeConfiguration parameter to RunDumpTests.ps1
- #128622 Extend timeout of libs legs in nativeaot-outerloop
- #128607 JIT: remove some useless code in escape analysis
- #128605 [release/10.0] Fix Linux madvise() advice values
- #128584 [ci-scan] Skip SocketBlockingModeTransitionTests.ConnectAsync_WithBuffer_Succeeds on Android (refs #128141)
- #128577 Fix utf8_to_utf16 and utf16_to_utf8 for s390x
- #128528 Rework
AsyncHelpersawait helpers for correctness and efficiency - #128494 [QUIC] Throw on write after closed writing side
- #128469 [ci-scan] Skip HostTests Moq tests on iossimulator (refs #128405)
- #128459 JIT: skip loop inversion for loops that are already bottom-tested
- #128441 Use Microsoft.CodeAnalysis.BannedApiAnalyzers from dependency flow
- #128355 Enable trim and AOT analyzers for selected library tests
- #128235 Include the thumb bit in symbol definitions for method code nodes in crossgen2
- #128105 [Diagnostics] Add InProc CrashReport Logging
- #127958 Add LOCKREADIFFAILRET to unlocked MDInternalRW read methods
#128647 Add RuntimeConfiguration parameter to RunDumpTests.ps1
- 作成者: @max-charlamb
- 作成日時: 2026年05月27日 14:19:38(UTC)
- マージ日時: 2026年05月27日 14:24:53(UTC)
- ラベル: area-Diagnostics-cdac
概要
RunDumpTests.ps1スクリプトに-RuntimeConfigurationパラメータを追加し、Release以外のChecked/Debug ランタイムビルドのテストに対応しました。これにより、Checked ビルドで有効になる追加のアサーションを活用して、Release ビルドでは検出できないバグをキャッチできるようになります。
変更内容
RunDumpTests.ps1に-RuntimeConfigurationパラメータを追加(デフォルト値:Release)- パラメータはMSBuildの
/p:RuntimeConfiguration=...経由でDumpTests.targets に渡される - スクリプトのヘルプテキストを更新
パフォーマンスへの影響
影響なし
関連Issue
なし
その他
- 後方互換性を維持:デフォルト値が
Releaseのため、既存の使用方法に影響なし - ローカルランタイムバージョンテスト時のみ有効な変更
- 使用例:
.\RunDumpTests.ps1 -Versions local -RuntimeConfiguration Checked .\RunDumpTests.ps1 -Versions local -RuntimeConfiguration Debug
#128622 Extend timeout of libs legs in nativeaot-outerloop
- 作成者: @MichalStrehovsky
- 作成日時: 2026年05月27日 05:14:50(UTC)
- マージ日時: 2026年05月27日 10:37:51(UTC)
- ラベル: area-NativeAOT-coreclr
概要
NativeAOT outerloopパイプラインのlibs legジョブのタイムアウト値を延長しています。製品ビルドとテストビルドが約3時間かかり、Helixキューが満杯の場合さらに2時間以上かかることがあるため、タイムアウトによる失敗を防ぐための変更です。
変更内容
eng/pipelines/coreclr/runtime-nativeaot-outerloop.yml: libs legのタイムアウト設定を増加(+3/-3行の修正)
パフォーマンスへの影響
直接的なパフォーマンス改善ではなく、CI/CDパイプラインの信頼性向上を目的とした変更です。既存のビルド・テスト処理の実行時間に変化なく、タイムアウトエラーによるパイプライン失敗の削減が期待されます。
関連Issue
なし
その他
NativeAOT outerloopが頻繁に失敗する主な原因がタイムアウトであったため、これはCI/CD安定性の改善を目指すものです。
#128607 JIT: remove some useless code in escape analysis
- 作成者: @AndyAyersMS
- 作成日時: 2026年05月26日 21:30:22(UTC)
- マージ日時: 2026年05月27日 13:58:43(UTC)
- ラベル: area-CodeGen-coreclr
概要
JIT のエスケープ分析で使用されていない古いコピー検出ロジックを削除します。現在はコピー追跡を CheckForGuardedAllocationOrCopy で行っているため、ObjectAllocator::AnalyzeParentStack 内の非機能的な状態管理コードは不要になっています。
変更内容
- src/coreclr/jit/objectalloc.cpp:
AnalyzeParentStackメソッドからisCopy/wasCopyトラッキングロジックを削除(14行削除、2行追加) GT_STORE_LCL_VARケースの到達不可能なenumerator-copy伝播コードを削除- コピー伝播ロジックは既に
CheckForGuardedAllocationOrCopyで処理済みのため、重複コードを排除
パフォーマンスへの影響
コンパイル時のメモリ使用量とJIT処理時間がわずかに改善される可能性があります(追跡対象の状態が削減)。ただし、機能的な変更がないため実行時パフォーマンスへの影響はありません。
関連Issue
なし
その他
JIT内部の code cleanup であり、公開APIや言語機能への影響はありません。エスケープ分析の有効性に変化なし。
#128605 [release/10.0] Fix Linux madvise() advice values
- 作成者: @janvorli
- 作成日時: 2026年05月26日 20:10:26(UTC)
- マージ日時: 2026年05月27日 17:44:41(UTC)
- ラベル: Servicing-approved area-GC-coreclr
概要
Linux上のGCメモリ管理におけるmadvise()呼び出しの不正な引数結合を修正するバックポート。VirtualResetがMADV_FREEとMADV_DONTDUMPをビット演算で結合していたため、無効な引数値がシステムコールに渡されていました。.NET 9で導入された最適化(#95643)による回帰を解決します。
変更内容
- src/coreclr/gc/unix/gcenv.unix.cpp:
GCToOSInterface::VirtualResetの実装を修正madvise()の2つの呼び出しに分割(従来は1つの呼び出しで複数のアドバイス値をOR結合)MADV_DONTDUMP(コアダンプ制御)とMADV_FREE(ページ回収)を独立した呼び出しで処理- コンパイル時ガード:
#ifdef MADV_FREEへ統一 MADV_FREEがない環境のみposix_madvise(POSIX_MADV_DONTNEED)にフォールバック
パフォーマンスへの影響
madvise()呼び出しが2回になるため、syscall数は若干増加します。ただし、正しいページ回収動作が復帰するため、メモリ効率は向上します。元々この最適化(syscall削減)が不正な実装だったため、実質的には修正による改善と言えます。
関連Issue
その他
- カスタマー報告による修正
- 低リスク修正:シンプルで影響範囲が限定的
- Unix系OS環境でのメモリ管理の正確性向上(Linuxカーネル 5.18未満と5.18以降の両方で動作可能)
#128584 [ci-scan] Skip SocketBlockingModeTransitionTests.ConnectAsync_WithBuffer_Succeeds on Android (refs #128141)
- 作成者: @github-actions[bot]
- 作成日時: 2026年05月26日 13:53:24(UTC)
- マージ日時: 2026年05月27日 11:36:45(UTC)
- ラベル: area-System.Net.Sockets agentic-workflows
概要
Android上でSocketBlockingModeTransitionTests.ConnectAsync_WithBuffer_Succeedsテストが一貫して失敗するため、[ActiveIssue]属性でAndroidプラットフォームをスキップする修正。バッファ付きConnectAsync後にソケットが非ブロッキングモードになる問題が発生しており、原因調査予定の間はテストをスキップする対応。
変更内容
- src/libraries/System.Net.Sockets/tests/FunctionalTests/Connect.Unix.cs:
ConnectAsync_WithBuffer_Succeedsテストに[ActiveIssue(TestPlatforms.Android)]属性を追加(1行追加)
パフォーマンスへの影響
影響なし(テストスキップ修正のため)
関連Issue
その他
- テスト失敗の詳細:
Assert.False() Failure— 期待値False、実際の値True(Connect.Unix.cs:229行) - 影響範囲: Android上の複数アーキテクチャ(android-arm64、android-x64)で発生
- 失敗パターン: TFO/connectxでのソケット接続後、ソケットが期待に反して非ブロッキングモードになる動作
- 検出状況: スキャン期間中に10回以上の継続的な失敗を確認
- 注記: 本修正は一時的なスキップで、根本原因の調査と修正が別途予定されている
#128577 Fix utf8_to_utf16 and utf16_to_utf8 for s390x
- 作成者: @saitama951
- 作成日時: 2026年05月26日 11:01:48(UTC)
- マージ日時: 2026年05月27日 23:17:43(UTC)
- ラベル: area-PAL-coreclr community-contribution
概要
s390x(big-endian)プラットフォームにおいて、UTF-8↔UTF-16変換関数(utf8_to_utf16、utf16_to_utf8)がMINIPAL_TREAT_AS_LITTLE_ENDIANフラグ設定時に誤った文字列を返す問題を修正しています。エンディアンの扱いに関する実装ロジックを改善することで、big-endianアーキテクチャでの正確な変換を実現します。
変更内容
src/native/minipal/utf8.c (+141/-11)
- UTF-8/UTF-16変換ロジックのエンディアン処理を改善
- リトルエンディアン想定での変換処理をビッグエンディアンに対応させる修正を実装
src/coreclr/pal/tests/palsuite/locale_info/MultiByteToWideChar/test4/test4.cpp (+36)
MultiByteToWideCharAPIの変換結果を検証するテストケースを追加
src/coreclr/pal/tests/palsuite/locale_info/WideCharToMultiByte/test5/test5.cpp (+37)
WideCharToMultiByteAPIの変換結果を検証するテストケースを追加
パフォーマンスへの影響
影響なし
関連Issue
#128394(Discussion参照)
その他
本修正はs390xなどのビッグエンディアンプラットフォームに固有の問題を解決するもので、リトルエンディアンシステム(x86、ARM等)には影響しません。PAL(Platform Abstraction Layer)の多言語サポート機能に関わる修正です。
#128528 Rework AsyncHelpers await helpers for correctness and efficiency
- 作成者: @jakobbotsch
- 作成日時: 2026年05月23日 22:00:14(UTC)
- マージ日時: 2026年05月27日 06:12:00(UTC)
- ラベル: area-System.Threading.Tasks runtime-async
概要
このPRは、ランタイム非同期await ヘルパーの動作正確性と効率を改善し、複数の継続がタスクに登録されている場合のasync1との動作差異を解決します。RuntimeAsyncTaskの代わりにRuntimeAsyncTaskContinuation(以前のTaskContinuation)を継続オブジェクトとして使用し、JITインライン化を有効化(テール await時)し、キャッシュされた継続により継続割り当てを削減します。
変更内容
内部実装(System.Private.CoreLib):
AsyncHelpers.Await*をテール await形状に書き換え、タスク/値タスク継続をキャッシュ化RuntimeAsyncTaskContinuation新規追加:複数登録時に最初以外は並行実行、最初は同期実行Task.RunContinuationsをRuntimeAsyncTaskContinuation型の継続に対応させたAsyncHelpers.TransparentAwait/Awaitを統一的に最適化し、value task awaitsと同様のキャッシュ最適化を適用
CoreCLR JIT:
- インライナが
AsyncHelpers.TailAwaitを使用する非同期関数のインライン化を許可 - 非同期コンテキスト引数を呼び出し元から被インライン化非同期呼び出しへ継承
CoreCLR async thunks:
- thunk IL生成を
TransparentAwait*へテール awaitする形状に更新(汎用TransparentAwaitOfT含む) - 管理型スタブ生成器でも同様の変更を反映
公開APIの変更:
ConfiguredTaskAwaiter<TResult>.m_taskとConfiguredValueTaskAwaitableの内部フィールドを内部化(高速パスアクセス用)
パフォーマンスへの影響
ベンチマーク結果(ValueTaskPerf):
Await_FromResult: 12.01ns → 8.32ns (31%改善)Await_FromCompletedTask: 16.35ns → 13.29ns (19%改善)CreateAndAwait_FromResult_ConfigureAwait: 15.85ns → 8.36ns (47%改善)CreateAndAwait_FromDelayedTCS: 1,830ns → 1,004ns (45%改善)
NativeAOT: バイナリサイズが全体的に削減(最大0.163%、System.Text.Json.SourceGeneration.Tests.exeで-198KB)
関連Issue
なし
その他
新しいテストparallel-continuations.csを追加し、複数継続登録時の正確な動作を検証。async1との動作一貫性を確保(最初の継続は同期実行、他は並行実行)。
#128494 [QUIC] Throw on write after closed writing side
- 作成者: @ManickaP
- 作成日時: 2026年05月22日 16:51:01(UTC)
- マージ日時: 2026年05月27日 08:45:11(UTC)
- ラベル: area-System.Net.Quic
概要
System.Net.Quic.QuicStream.WriteAsyncの動作を修正し、ストリームの書き込み側がCompleteWrites()で完了した後の書き込み試行時にInvalidOperationExceptionをスローするように変更しました。これまでは成功した完了済みのValueTaskを返していた不正な動作を改善します。
変更内容
- QuicStream.cs:
WriteAsyncメソッドに検証ロジックを追加。前回返された書き込みValueTaskが既に成功完了している場合(書き込み側がクローズされた状態)にInvalidOperationExceptionをスロー - QuicStreamTests.cs:
CompleteWrites()後のWriteAsync呼び出しが例外をスロー することを検証する回帰テストを追加 - ValueTaskSource.cs、ResettableValueTaskSource.cs: XMLドキュメントコメントの文法修正("is" → "if")
- Strings.resx: 新しい例外メッセージ用のローカライズされた文字列リソースを追加
パフォーマンスへの影響
影響なし(検証ロジックの追加による性能への実質的な影響は最小限)
関連Issue
その他
なし
#128469 [ci-scan] Skip HostTests Moq tests on iossimulator (refs #128405)
- 作成者: @github-actions[bot]
- 作成日時: 2026年05月22日 01:38:47(UTC)
- マージ日時: 2026年05月27日 14:49:18(UTC)
- ラベル: area-Extensions-Hosting agentic-workflows
概要
iOS シミュレータ (arm64) で Castle.DynamicProxy を使用した Moq ベースのテストが System.IndexOutOfRangeException で失敗するため、HostTests の7つのテストに [ActiveIssue] 属性を追加してスキップする変更です。既存の IsReflectionEmitSupported チェックの上に、プラットフォーム固有のスキップ処理を重ねています。
変更内容
- src/libraries/Microsoft.Extensions.Hosting/tests/UnitTests/Internal/HostTests.cs
- 7つのMoqベースのテストメソッドに
[ActiveIssue("https://github.com/dotnet/runtime/issues/128405", TestPlatforms.iOS)]属性を追加 - 影響を受けるテスト:
Dispose_DisposesHostConfigurationProvidersを含む7つのホスト関連テスト - 既存の
[ConditionalFact(... IsReflectionEmitSupported)]属性は維持
- 7つのMoqベースのテストメソッドに
パフォーマンスへの影響
影響なし(テストスキップの処理で、実行時コードには影響しません)
関連Issue
その他
- 失敗の原因: Castle.DynamicProxy の内部的な配列境界チェック問題により、iossimulator-arm64 プラットフォームで
MethodWithInvocationGenerator.BuildProxiedMethodBody内で範囲外エラーが発生 - 影響範囲: runtime-extra-platforms (iossimulator-arm64 Release AllSubsets_CoreCLR) の CI ビルドで3回発生
- 対応の妥当性:
TestPlatforms.iOSに限定することで、最小限のスコープで iOS シミュレータのテスト失敗のみをスキップ。このアプローチは自動生成されたCI Outer-Loop Failure Scanner による修正提案です。
#128459 JIT: skip loop inversion for loops that are already bottom-tested
- 作成者: @AndyAyersMS
- 作成日時: 2026年05月21日 20:56:04(UTC)
- マージ日時: 2026年05月27日 17:18:28(UTC)
- ラベル: area-CodeGen-coreclr
概要
JIT ループ反転最適化(optTryInvertWhileLoop)を改善し、既にボトムテスト(ループの継続条件がループ末尾で判定される構造)されているループでの反転をスキップするようにしました。これにより、冗長なプリヘッダテストと不要な制御フローの分岐を回避できます。
変更内容
- src/coreclr/jit/optimizer.cpp:
optTryInvertWhileLoop関数に早期終了チェックを追加- バックエッジがループを抜ける
BBJ_CONDラッチの場合にベイルアウト - 複数バックエッジを正規化した
BBJ_ALWAYSラッチの場合(ループ内の前身ノードがBBJ_CONDで抜ける場合)もカバー - 既存の「既に反転済み」チェック(単一ブロック自己ループと IV テスト認識ケース)では捕捉できていなかったケースに対応
- バックエッジがループを抜ける
パフォーマンスへの影響
正のパフォーマンス改善が期待されます。既にボトムテスト構造を持つループへの不要な反転を避けることで、以下の効果が期待できます:
- ループプリヘッダでの冗長なテスト実行を排除
- ループ本体の反復ごとの制御フロー分岐を削減
- コード生成の単純化
PR #116104がプロファイルデータからのループ反復推定を常に計算するようにしたことで、より多くのループがサイズ予算閾値を超え反転が試みられるようになったため、このチェックの重要性が増したことが背景にあります。
関連Issue
その他
なし
#128441 Use Microsoft.CodeAnalysis.BannedApiAnalyzers from dependency flow
- 作成者: @akoeplinger
- 作成日時: 2026年05月21日 10:31:07(UTC)
- マージ日時: 2026年05月27日 14:58:50(UTC)
- ラベル: area-codeflow
概要
Microsoft.CodeAnalysis.BannedApiAnalyzersの依存関係管理をMaestro依存関係フロー(eng/Version.Details.*)から自動供給される方式に変更しました。従来のハードコード版指定から、依存関係フローを経由した動的バージョン管理に移行し、バージョン最新化を実現しています。
変更内容
- eng/Versions.props:
MicrosoftCodeAnalysisBannedApiAnalyzersVersionのハードコード値を削除 - eng/Version.Details.xml:
Microsoft.CodeAnalysis.BannedApiAnalyzersを追跡依存関係リストに追加 - eng/Version.Details.props: MSBuildが参照するための
MicrosoftCodeAnalysisBannedApiAnalyzersPackageVersion/MicrosoftCodeAnalysisBannedApiAnalyzersVersionプロパティを新規定義
パフォーマンスへの影響
影響なし
関連Issue
なし
その他
この変更は依存関係管理の自動化を推進し、ビルドシステム全体の保守性を向上させるための基盤整備です。Microsoft.CodeAnalysis.BannedApiAnalyzersはコード分析ツールのため、ランタイム機能への直接的な影響はなく、開発・ビルドプロセスの改善に限定されます。
#128355 Enable trim and AOT analyzers for selected library tests
- 作成者: @Copilot
- 作成日時: 2026年05月19日 03:06:42(UTC)
- マージ日時: 2026年05月27日 21:15:15(UTC)
- ラベル: area-Infrastructure-libraries
概要
複数のライブラリテストプロジェクトでTrim/AOT アナライザーを有効化し、プロジェクトレベルの一括無効化を削除した上で、リフレクションと動的コード使用箇所に対してターゲット化された修正と注釈を適用する変更。アナライザーフレンドリーなAPIの使用(Enum.GetValues<TEnum>()、DiagnosticMethodInfoなど)に置き換えることで、警告を最小化している。
変更内容
- プロジェクトファイルの更新:約20個のテストプロジェクト(System.Threading.RateLimiting、System.Text.Json、System.Net.*、Microsoft.Extensions.Configuration など)から
EnableTrimAnalyzer/EnableAotAnalyzerの無効化設定を削除 - コード修正:
Enum.GetValues<TEnum>()で動的列挙型配列作成を回避(System.Net.Security.Tests)DiagnosticMethodInfoによるStackFrame.GetMethod()警告対策(Microsoft.Extensions.DependencyInjection)- LINQ ベースの配列変換で
ArrayListへの警告を排除(System.Net.WebProxy) - リフレクション重い箇所(構造的等価チェックヘルパー、QUIC 相互運用性リセット)に
RequiresUnreferencedCode/RequiresDynamicCode注釈を追加
- ターゲット化された抑制:必要な場合のみ
#pragma warning disable/restoreでスコープを限定(非ゼロ下限配列作成、COM 無効 API 使用など) - 共通テストヘルパーの更新:
GetStateMachineData.csの Describe メソッドを削除し、関連する Watchdog タイマー実装を簡略化
パフォーマンスへの影響
影響なし
関連Issue
#126862 (アナライザー無効化ブロックの削除対象)
その他
- 非対応プロジェクト:
Microsoft.Extensions.HostFactoryResolver.Testsは製品側の変更が必要なため今回の対象外とし、後続の個別対応待ち - 互換性:内部テストコード中心の変更で、公開API に破壊的変更なし
- .NET Framework 互換:
net481テストビルド向けにフォールバック実装と属性の手動定義を実施
#128235 Include the thumb bit in symbol definitions for method code nodes in crossgen2
- 作成者: @jtschuster
- 作成日時: 2026年05月14日 23:02:12(UTC)
- マージ日時: 2026年05月27日 03:06:57(UTC)
- ラベル: area-crossgen2-coreclr
概要
crossgen2でメソッドコードノードのシンボル定義にThumb bit(ARMアーキテクチャの命令セット識別ビット)を含める変更を行います。これにより、ARM環境でのメソッドコードポインタの正確な表現が可能になります。
変更内容
- IPCodeSymbolNode.cs:
PCodeシンボルノードの新規インターフェース追加(15行) - JIT層 (emit.cpp, emitarm.cpp): Thumb bitをシンボル定義に含める処理を追加
- ObjectWriter.cs: シンボル出力時のThumb bit処理を更新
- DelayLoadHelperImport.cs, ExceptionInfoLookupTableNode.cs等: メソッドRVA参照の処理をThumb bitに対応させる
- テストケース追加: Thumb bit関連の検証テストを追加(R2RResultChecker.cs、ThumbBit/HotColdSplitting.cs等)
パフォーマンスへの影響
影響なし(シンボル定義の変更であり、ランタイムパフォーマンスに直接的な影響なし)
関連Issue
なし
その他
作成者による注記:本変更は試験的なコード例であり、DelayLoadMethodCallThunksテーブルおよびExceptionInfoテーブルにおいて、メソッドコードへのポインタではなくRVAを扱う現在の設計との整合性が課題として挙げられています。将来的には、これらのフィールド定義をPCodeに統一するか、RVA専用のノード型を新設するかの検討が必要とのこと。
#128105 [Diagnostics] Add InProc CrashReport Logging
- 作成者: @mdh1418
- 作成日時: 2026年05月12日 23:23:26(UTC)
- マージ日時: 2026年05月27日 14:43:58(UTC)
- ラベル: area-Diagnostics-coreclr os-android os-ios
概要
CoreCLRのインプロセスクラッシュレポート機能にコンパクトなテキスト形式の出力を追加します。既存のJSON形式のレポートファイル出力は保持しながら、モバイルプラットフォーム向けにシグナルセーフなコンパクト形式をサポートします。Android環境ではlogcatのDOTNET_CRASHタグで出力され、iOS環境では標準エラー出力経由で出力されます。
変更内容
- signalsafeformat.h/cpp: 新規追加。整数フォーマット処理をJSON書き込みとコンソール書き込み間で共有するシグナルセーフなヘルパー関数を実装。
- signalsafeconsolewriter.h/cpp: 新規追加。Androidはlogcat(
DOTNET_CRASHタグ)、その他のプラットフォームはstderrを使用したコンパクト形式のクラッシュログ出力機能を実装。 - inproccrashreporter.cpp/h: クラッシュレポート出力をJSON形式とコンパクトログに分離。マネージフレーム情報のモジュールテーブル化によるメモリ効率化。
DOTNET_CrashReportFrameLimitPerThread設定(デフォルト32フレーム、0で制限なし)の追加。 - signalsafejsonwriter.cpp/h: 共有フォーマッタへの委譲により約100行削減。
- crashreportstackwalker.cpp: ダンプファイルパスなしでのクラッシュレポート対応。フレーム制限設定の統合。
- clrconfigvalues.h:
CrashReportFrameLimitPerThread設定値の追加。 - eepolicy.cpp/excep.cpp: Android/Apple(iOS/tvOS/MacCatalyst)プラットフォーム向けのレジスタ抽出とクラッシュレポート有効化。
パフォーマンスへの影響
コンパクト形式出力により、ログサイズが削減されます。フレーム制限(デフォルト32フレーム/スレッド)により、大規模スタックトレースのメモリ使用量が抑制される見込みです。JSONファイル出力は完全なデータを保持するため、詳細解析用途には影響ありません。
関連Issue
#126916(検証時の参考PR)
その他
- 破壊的変更: なし(既存のJSON出力は変更なし)
- プラットフォーム対応: Android、iOS、tvOS、MacCatalystで検証済み。
- 検証済みシナリオ: 未処理例外、FailFast、P/Invoke abort、SIGSEGV、マネージ/ネイティブ混在フレーム、スタックオーバーフロー。
- 設定:
DOTNET_CrashReportFrameLimitPerThreadで出力フレーム数を制御可能。
#127958 Add LOCKREADIFFAILRET to unlocked MDInternalRW read methods
- 作成者: @kevingosse
- 作成日時: 2026年05月08日 14:30:27(UTC)
- マージ日時: 2026年05月27日 23:20:23(UTC)
- ラベル: area-Diagnostics-coreclr community-contribution
概要
メタデータテーブルの再割り当て時に発生するポインタ無効化による競合状態を修正します。ExpandTables()がメタデータテーブルのバッキングバッファを再割り当てする際、GetMethodRecord/GetFieldRecord/GetMemberRefRecordが返すポインタが無効になる問題がありました。プロファイラのemit操作(DefineMemberRefなど)がLOCKWRITE下でExpandTablesをトリガーする際、use-after-free読み込みが発生し、MissingMethodExceptionやセグメンテーション違反が散発的に発生していました。
GetSigOfMethodDef、GetSigOfFieldDef、GetNameAndSigOfMemberRef、GetSigFromTokenにLOCKREADIFFAILRET()を追加してこれを修正します。
変更内容
- src/coreclr/md/enc/mdinternalrw.cpp: 4つの読み取りメソッドに読み取りロック(LOCKREADIFFAILRET)を追加。GetSigFromTokenではmdtSignature/mdtTypeSpecに対して読み取りロックを取得し、IfFailGo + ErrExitをIfFailRet + 直接リターンに置き換え、無効トークン処理をMETA_E_INVALID_TOKEN_TYPEを直接返すように簡潔化しました。
パフォーマンスへの影響
読み取りロック追加により、これまでロックレスで動作していた読み取りメソッドにロックオーバーヘッドが追加されます。ただし、競合状態によるuse-after-free読み込みとそれに伴うクラッシュを防ぐための必要な修正です。
関連Issue
その他
この修正はランタイムの内部実装(メタデータエンジンのロック機構)に限定されており、公開APIには影響しません。プロファイラAPI使用時の安定性が向上します。