Pull Request on 2026年10月10日

dotnet/runtimeにマージされたPull RequestをAIで日本語要約

注意点

このページは、dotnet/runtimeリポジトリにマージされたPull Requestを自動的に収集し、その内容をAIが要約した内容を表示しています。そのため、必ずしも正確な要約ではない場合があります。



#135548 Update MsQuic to 2.5.11 to unblock release/10.0 builds

  • 作成者: @Copilot
  • 作成日時: 2026年10月09日 22:45:47(UTC)
  • マージ日時: 2026年10月10日 22:24:57(UTC)
  • ラベル: area-Infrastructure

概要

release/10.0 のビルドをブロックしている NuGet 監査エラー(NU1904)を解消するため、共有の MsQuic バージョンを 2.5.10 から修正版の 2.5.11 に更新します。MsQuic.OpenSSL 2.5.10 には、致命的な証明書検証の脆弱性 GHSA-w5f4-fx9m-m4q7 が報告されています。この脆弱性により、OpenSSL バックエンドでは TLS のホスト名検証が不適切となり、サーバーのなりすましが可能になります。Schannel は影響を受けません。

変更内容

  • eng/Versions.props: MsQuic の共有バージョンを 2.5.10 → 2.5.11 に更新(+1/-1)
    • OpenSSL(テスト用)と Schannel(製品用)の両パッケージがこのバージョンを参照します。
    • NuGet 監査の警告ポリシーは維持しており、警告の抑制(suppression)は行っていません。

マネージドコードの変更はなく、依存パッケージのパッチバージョン更新のみです。公開 API や互換性(破壊的変更・非推奨化)への影響は記載されていません。

パフォーマンスへの影響

影響なし(パフォーマンスに関する記載はありません)。

関連Issue

その他

  • 作成者によるテスト結果: 更新前は NU1904 により restore が失敗し、更新後は NU1904 をエラー扱いにしても成功することを確認。両パッケージとも 2.5.11 に解決されます。
  • フルビルドと機能テストは未実施で、ネイティブランタイムの動作も未検証です(リスクは小さいと記載されています)。
  • 本件は既存の依存関係に対して新たに公開された脆弱性への対応であり、.NET コード自体のリグレッションではありません。

#135534 [release/10.0] OpenSSL 4 support

概要

release/10.0 に OpenSSL 4.0 対応をバックポートするPRです。.NET 11 の #122744、#125470、#125687 を概念的にバックポートしたものですが、.NET 11 で OpenSSL 1.0.x / 1.1.0 のサポートが削除されたため、そのままでは適用できず再実装されています。変更は最小限に絞られています。

背景として、OpenSSL 4.0 のみを搭載するシステム(Ubuntu 26.10、Fedora 45 など、搭載予定のディストリビューション)では、これらの変更がないと .NET 10 が動作しません。

変更内容

すべて src/native/libs/System.Security.Cryptography.Native/ 配下のネイティブ層の変更です(verify-so.sh を除く)。

  • apibridge.c / apibridge.h: OpenSSL 互換用ブリッジ関数の変更(+25/-18、+1/-0)
  • openssl.c / openssl.h: OpenSSL 関連処理の変更(+45/-9、+1/-1)。CheckX509HostnameMatch の修正を含む
  • openssl_1_0_structs.h: OpenSSL 1.0 向け構造体定義の追加(+9)
  • opensslshim.c / opensslshim.h: シム定義の追加・変更(+6、+14/-3)。ASN1_STRING_get0_data を OpenSSL 1.0.2 向けの FALLBACK シムとして追加
  • osslcompat_40.h: OpenSSL 4.0 向け互換定義の追加(+12、新規ファイルと思われる)
  • pal_x509.c: X509 関連処理の変更(+4/-2)
  • src/native/libs/verify-so.sh: 検証スクリプトの変更(+13/-6)

.NET 11 版との主な相違点は以下の2点です。

  1. CheckX509HostnameMatch は .NET 10 で修正が必要でしたが、.NET 11 には存在しません。
  2. ASN1_STRING_get0_data を OpenSSL 1.0.2 向けの FALLBACK シムとする必要がありました。

パフォーマンスへの影響

影響なし(記載なし)。

関連Issue

#125619(Closes)。元のバックポート対象のPRは #122744、#125470、#125687 です。

その他

  • 顧客影響: 顧客・パートナーからの報告と社内発見の両方があります。
  • リグレッション: なし。
  • テスト: 様々な OpenSSL バージョンで、portable / non-portable の両方でローカル検証済みです。
  • リスク: Medium-low。CI カバレッジのない OpenSSL バージョンに対するランタイム変更を含みますが、変更内容は概ね単純です。
  • 既存の警告: 変更を最小限にするため、const 関連のビルド警告は .NET 11 版と異なり対処していません。新しいコンパイラでは release/10.0 に多数の警告が残ります。

#135486 JIT: copy large local structs through their address when decomposing

  • 作成者: @EgorBo
  • 作成日時: 2026年10月09日 10:03:46(UTC)
  • マージ日時: 2026年10月10日 13:08:06(UTC)
  • ラベル: area-CodeGen-coreclr

概要

JITのLowering段階で、GC参照を含む構造体のコピーを個別のストアに分解する際、ローカル変数のソースを LCL_FLD ノード経由で読み取っていました。LCL_FLD のオフセットは16ビットに制限されているため、64 KiBを超える構造体ではオフセットが折り返され、誤ったデータを読み取って64 KiB以降のフィールドが欠落していました(Checkedビルドではアサート)。

本PRでは、ローカルのフィールドをすべて LCL_FLD としてエンコードできない場合(IsValidLclAddr が偽の場合)、ローカルのアドレスを一度取得し、そのアドレス経由で各部分をロードするよう修正しています。これは間接ソースに対して既に使われているパスと同じです。

変更内容

  • src/coreclr/jit/lower.cpp(+18/-2): 64 KiBを超えるローカル構造体のコピー時に、LCL_FLD のオフセット折り返しを避けるため、アドレス経由でロードするパスを追加。
  • src/tests/JIT/Regression_ro_2/Runtime_133581.cs(+64/-0): ヒープフィールドおよび ref を宛先とするコピーで、64 KiB境界を超えるフィールドが正しくコピーされることを検証する回帰テストを追加。

パフォーマンスへの影響

影響なし(PR説明に記載されているのは「No diffs」のみで、ベンチマーク結果の記載はありません)。

関連Issue

#133581

その他

  • 影響範囲はCoreCLRのJIT内部実装(Lowering)で、公開APIの変更や互換性への影響についての記載はありません。
  • Copilotのレビュー概要では、クロスプラットフォームのJIT LoweringとGCの挙動に関わるため、CIの完了とメンテナーによる検証が必要とされています(未解決の指摘は0件)。

#135485 JIT: model the signed Log2 fallback as throwing

  • 作成者: @EgorBo
  • 作成日時: 2026年10月09日 10:02:55(UTC)
  • マージ日時: 2026年10月10日 16:46:49(UTC)
  • ラベル: area-CodeGen-coreclr

概要

符号付きの int.Log2 / long.Log2 は x < 0 ? INTRINSIC(Log2, x) : lzcnt-based result としてインポートされ、フォールバック側のノードは後に例外をスローするマネージド呼び出しへ書き換えられます。しかしこのフォールバックノードは手動で GTF_CALL が設定されているだけで、OperExceptions が例外なしと報告し、副作用チェックも本物の呼び出しとしてしか扱わないため、戻り値が未使用の場合にデッドストア除去で ArgumentOutOfRangeException ごと削除されていました。本PRはこのフォールバックを「例外をスローし得る」ものとして扱うよう修正します(JIT内部の修正で、公開APIの変更はありません)。

また、フォールバックを保持するようにしたことで顕在化した fgExpandQmarkStmt の潜在バグ(then側のみのqmarkで、条件を反転しているにもかかわらず then/else の確率が逆のエッジに割り当てられ、then側が稀な場合にプロファイルデータが不整合になる)も合わせて修正しています。

変更内容

  • src/coreclr/jit/gentree.cpp: OperExceptions で Log2 フォールバックの intrinsic が例外をスローし得ることを報告するよう変更(+6/-1)。
  • src/coreclr/jit/importercalls.cpp: フォールバックノードに GTF_EXCEPT を付与(+1/-1)。
  • src/coreclr/jit/morph.cpp: fgExpandQmarkStmt の then/else の確率を正しいエッジに割り当てるよう修正(+5/-4)。
  • src/coreclr/jit/valuenum.cpp: 値番号付けで、スローし得る GT_INTRINSIC に関する NamedIntrinsic のガイダンスに従い、フォールバックに不透明な例外セット(opaque exception set)を付与(+10/-0)。
  • src/tests/JIT/Regression_ro_2/Runtime_133965.cs: 符号付き Log2 の結果を破棄した場合の回帰テストを追加(+52/-0)。

パフォーマンスへの影響

PR本文によれば、asm diff は「No asm diffs」で、生成コードへの影響は確認されていません。ベンチマーク結果の記載はありません。

関連Issue

その他

  • Copilotのレビューでは「変更推奨」とされ、1件の低重要度の指摘(open)があります。回帰テストが nint.Log2 を含んでおらず、nint.Log2 も同じ符号付きフォールバック経路を使うため、native-int 用の回帰テストの追加が提案されています。

#135484 JIT: preserve relocatable handles when simplifying ordered comparisons

  • 作成者: @EgorBo
  • 作成日時: 2026年10月09日 10:02:43(UTC)
  • マージ日時: 2026年10月10日 16:53:17(UTC)
  • ラベル: area-CodeGen-coreclr

概要

JITの値番号付け(Value Numbering)において、再配置可能(relocatable)なハンドルを含む符号付き大小比較の定数畳み込みを拒否するよう修正したPRです。コンパイル時のハンドルのプレースホルダは、再配置後の実行時アドレスの順序を保証しないため、符号なし比較や算術演算と同様に畳み込みを拒否します。あわせて、longからintへの VN narrowing によってハンドルVNが通常の数値定数に変換され、この拒否を回避してしまう問題も防止します。同一性に基づく等値比較/null畳み込みは従来どおり維持されます。

変更内容

  • src/coreclr/jit/valuenum.cpp(+8/-8)
    • 符号付き順序比較の定数畳み込みで、再配置可能ハンドルを含む場合を拒否
    • long→int の VN narrowing でハンドルVNを保持(通常の数値定数への変換を防止)
  • src/tests/JIT/Regression_ro_2/Runtime_134891.cs(+60/-0)
    • ハンドルの順序比較に対する回帰テストを追加(Copilotの要約によればNativeAOT向け)

パフォーマンスへの影響

影響なし(diff なし:No diffs)

関連Issue

#134891(Fixes)

その他

  • Copilotのレビューでは「Changes recommended」とされ、プレースホルダに基づく非負性推論を経由して、ゼロとの比較が依然として畳み込まれる可能性が指摘されています(Low severity)。また、ハンドルに関する整数定数変換のドキュメント更新が提案されています。

#135461 JIT: retain complete metadata of reassociated folded constants

  • 作成者: @EgorBo
  • 作成日時: 2026年10月09日 00:33:35(UTC)
  • マージ日時: 2026年10月10日 13:02:55(UTC)
  • ラベル: area-CodeGen-coreclr

概要

JITの可換算術演算の再結合(reassociation)において、定数畳み込みの結果として返された定数ノードをそのまま利用するよう変更するPRです。従来は元の定数ノードに値・VN・フィールドシーケンスのみをコピーしていたため、算術演算でハンドルが通常の数値定数に変わった後も、ハンドルフラグなどの古いメタデータが残る可能性がありました。この変更により、再結合された畳み込み定数のメタデータが完全に保持されます。既存の定数畳み込みのリロケーション保護と算術最適化は維持されます。

変更内容

  • src/coreclr/jit/morph.cpp(+2/-6): 畳み込み結果の定数ノードをそのまま使用するように変更し、値・VN・フィールドシーケンスだけをコピーする処理を置き換え。
  • src/tests/JIT/Regression_ro_2/Runtime_134475.cs(+36/-0): ハンドル算術およびXORを含む式を対象としたリグレッションテストを追加。

パフォーマンスへの影響

影響なし。作成者によると、diffsなし(No diffs)とのことです。

関連Issue

その他

Copilotによるレビューでは、追加された回帰テストが古いハンドルメタデータの問題を露呈させる逆アセンブリ(disassembly)のパスを有効にしておらず、失敗を再現できていない可能性があるとして、中程度の指摘(「変更推奨」)が1件挙げられています。


#135459 JIT: preserve negation of division by the signed minimum

  • 作成者: @EgorBo
  • 作成日時: 2026年10月08日 23:48:22(UTC)
  • マージ日時: 2026年10月10日 13:08:50(UTC)
  • ラベル: area-CodeGen-coreclr

概要

JITのmorph処理で、符号付き除算の定数除数が「その型の符号付き最小値」である場合に、否定(negation)を除数側へ分配する最適化を行わないようにする修正です。最小値の否定は同じ型では表現できないため、被除数も最小値のとき、結果が -1 から 1 に変わってしまう問題(#133517)を防ぎます。

変更内容

  • src/coreclr/jit/morph.cpp (+4/-3): 符号付き最小値の除数に対する否定の分配を除外するガードを追加。対象は int、long、nint の最小値除数。
  • src/tests/JIT/Regression_ro_2/Runtime_133517.cs (+37/-0): 影響を受ける整数型について、代表的な被除数で正しい結果になることを検証する回帰テストを追加。

パフォーマンスへの影響

影響なし。作成者によると、JIT diffs はほぼありません。

関連Issue

その他

  • 公開APIや互換性への影響に関する記載は、提供された情報にはありません。
  • 変更はJITコンパイラ内部の最適化ロジックに限定されており、誤った結果を返す正確性バグ(miscompilation)の修正です。

#135457 JIT: require nonnegative bounds for symbolic range limits

  • 作成者: @EgorBo
  • 作成日時: 2026年10月08日 23:40:50(UTC)
  • マージ日時: 2026年10月10日 13:02:27(UTC)
  • ラベル: area-CodeGen-coreclr

概要

JITのRangeCheck(境界チェック除去)において、IsVNCheckedBound(チェック済みの境界値)が「負ではない」と暗黙に仮定していた箇所を修正するPRです。シンボリックな範囲の上限を構築する際に、境界が非負であることを要求するようにし、境界が負になり得るケースで誤って境界チェックが除去される正しさ(correctness)の問題を修正します。

変更内容

  • src/coreclr/jit/rangecheck.cpp(+8/-3): シンボリックな範囲上限を構築する際のガードを追加。シンボリックな境界が非負である、または現在の境界と一致する場合にのみ使用されるようにした
  • src/tests/JIT/Regression_ro_2/Runtime_133821.cs(+44/-0): 報告された「符号付き比較で範囲外アクセスとなるケース」の回帰テストを追加

パフォーマンスへの影響

境界チェック除去が保守的になるため、一部で最適化が働かなくなる可能性があります。作成者によると、CIのパフォーマンス結果に「いくつかのリグレッション」が見られますが、これは正しさのための修正であるとされています。具体的な数値は提供情報にありません。

関連Issue

その他

  • Copilotのレビューでは「変更推奨」とされており、指摘事項が1件あります(重要度: Medium)。境界が入れ替わる(swapped-bound)経路や等価(equality)アサーションの経路に対して、2つの境界を用いた回帰テストが不足しているという内容です。
  • 変更は内部実装(JITコンパイラの最適化)に閉じており、公開APIへの影響や互換性の破壊的変更に関する記載はありません。

#135289 Write the managed ilasm PDB to a separate file, as native ilasm does

概要

マネージド版ilasm(src/tools/ilasmのC#実装)が、ネイティブilasmと同様にPDBを別ファイル(<output>.pdb)へ書き出すよう変更するPRです。主な変更点は次の3点です。

  • -DEBUG / -PDB 指定時、PDBはイメージに埋め込まず<output>.pdbに出力します。
  • -DEBUGも-PDBも指定せず.lineだけを使った場合は、PDBもデバッグディレクトリも生成しません(.lineのパースと検証は継続)。
  • CodeViewパスは常にassembly.pdbではなく、PDBファイルのフルパスになります。-DET指定時のみファイル名(例: Min.pdb)だけを記録し、ディレクトリが違っても同一バイト列になる決定論性を確保します。

デバッグディレクトリはCodeView → PdbChecksum(PDBのid 20バイトをゼロ化したSHA-256)→(-DET時)Reproducibleの順で、ネイティブと同じ構成です。PDBがない場合は、ManagedPEBuilderが追加するReproducibleのみのディレクトリをILAssemblerPEBuilderで消去し、デバッグディレクトリを持たないイメージにします。

変更内容

  • ILAssembler(ライブラリ)
    • CompilationResult.PortablePdb(PDBバイト列)とOptions.PdbFilePath(CodeViewパス用)を追加しました。PdbFilePath未指定時は出力ファイル名の拡張子を.pdbにしたもの、なければassembly.pdbを使います。
    • GrammarActions.BuildImage.csで別PDB生成とCodeView/チェックサム登録を実装しました。
    • ILAssemblerPEBuilder.csを新規追加しました(空のデバッグディレクトリ除去)。VTableExportPEBuilderもこれを継承します。
    • OutputWriter.csを新規追加しました。ストリームベースで書き込み順序と古いPDBの扱いを判断します。
  • ilasm(CLI)
    • OutputFileWriter.csを新規追加しました。一時ファイルへ書いてからリネームするため、<output>.pdbに不完全なPDBが残りません。
    • Program.csでPDBを書き出すようにしました。
    • --debug-modeのヘルプ文を修正しました。
  • 出力ファイル処理の挙動
    • イメージを先に書き込んでクローズしてから、PDBを書きます。
    • PDBなしでイメージを書いた場合、既存の<output>.pdbは「置き換え前のイメージのCodeViewエントリがそのPDBのidを指している場合のみ」削除します。それ以外のファイルは保持します。
    • 出力パスとPDBパスが衝突する場合(-OUTPUT=Min.pdb -DEBUG)はエラーにして何も書きません(ネイティブはイメージをPDBで上書き)。比較はWindows/macOSでは大文字小文字を無視します。
    • --debug-mode単独でもPDBを生成します(-PDBはDebuggableAttributeを追加しません)。
  • src/tests/Common/CLRTest.Jit.targets
    • ラウンドトリップの決定論性チェックが-output=<name>.pdbとしてPDBでイメージを上書きするネイティブ依存の方法だったため、IL-RT/<name>.pdbcheck.dllへ出力し、イメージと隣のPDBの両方をハッシュする方式に変更しました(マネージド版では前者の出力パスが拒否されるため必須)。
  • テスト
    • OutputWriterTests、OutputFileWriterTests、CommandLinePdbFileTests、シード付きの生成ケース(PdbGeneratedCaseTests)などを追加し、既存テストも更新しました。
    • ILAssembler.Testsは1216件から2379件に増加し、Linuxで全件パスしています。
    • src/tests/ilasm/PortablePdbは0/10から4/10になりました(TestPortablePdbDebugDirectoryの2ケースが通過)。残り6件はローカルスコープ、複数ドキュメントにまたがるシーケンスポイント、.ilソースのドキュメント記録といったPDB内容の差分で、別PRで対応予定です。

パフォーマンスへの影響

影響なし(実行時の性能に関する変更ではなく、ビルドツールの出力形式の変更です。ベンチマークの記載もありません)。

関連Issue

  • #135212(本文で言及されているPull Request。ネイティブilasmの差異を指摘する議論のきっかけ)

その他

  • ネイティブilasmとの残差(本文より):
    • PdbChecksumのタイムスタンプは、マネージドでは0、ネイティブではPDBスタンプです。
    • 非決定的時のPDBスタンプは、マネージドでは定数0x04030201、ネイティブでは時計値です。
    • -DET時のPDB idは、マネージドではPDB内容のハッシュ、ネイティブではメタデータのハッシュです。
    • -DET時のCodeViewパスは、マネージドではファイル名のみ、ネイティブではフルパスです(意図的)。
    • 古いPDBの削除は、マネージドでは所有関係に基づく条件付き、ネイティブでは<output>.PDBの無条件削除です。
    • PDB内容では、マネージドにはローカルスコープがな

#134384 Serialize process-wide memory barriers under Rosetta

概要

macOS上でx64プロセスがRosetta下で動作している場合に、Appleのプロセス全体メモリバリア(Interlocked.MemoryBarrierProcessWideの実装)の呼び出しを直列化するPRです。Rosetta下ではthread_get_register_pointer_valuesを並行して呼ぶと、変換されたx64スレッド状態の再構築中にデッドロックが発生します(単独の再現コードで5回中5回ハング)。ネイティブarm64およびIntel macOSの動作は変更されません。#133797で報告された並行バリアのハングに対応するもので、別件のraw forkとの相互作用に対するpthread_atforkハンドラは意図的に追加していません。

変更内容

  • src/native/minipal/memorybarrierprocesswide.c(+33/-5): Rosetta下で動作している場合に、既存のMachベースのバリア呼び出しを直列化。
  • src/libraries/System.Threading/tests/InterlockedTests.cs(+36/-0): Interlocked.MemoryBarrierProcessWideを4スレッドから同時に呼び出す、分離された回帰テストを追加。レビューでの指摘を受け、マルチスレッド非対応環境ではスキップするよう修正済み。

パフォーマンスへの影響

Debugビルドのx64 testhostをRosetta下で実行し、10,000回呼び出しを10プロセス分測定した単一スレッドのレイテンシ中央値は以下のとおりです。

中央値
修正前 35.7 us/call
修正後 36.4 us/call

競合のない場合のミューテックスによるオーバーヘッドは約2%です。並行呼び出しは意図的に直列化されます(Mach経由のレジスタ状態クエリを並行発行することがデッドロックの原因であるため)。

関連Issue

  • #133797(並行バリアのハング)
  • #126063(macOSの通常のプロセス生成はposix_spawnを使用。raw forkの件の背景として言及)

その他

  • 検証: System.Threading.Testsはネイティブarm64とRosetta下のx64の両方で714件成功。新規テストも両環境で成功。
  • 修正なしのx64 libcoreclrでは新規テストが20秒でタイムアウトし、修正ありでは約5.5秒で完了することを確認済み。
  • Copilotレビューは最終的に承認推奨で、指摘事項は解消済み。

#134023 [automated] Merge branch 'release/8.0' => 'release/8.0-staging'

概要

release/8.0 ブランチの未マージ変更を release/8.0-staging に取り込む、自動生成のブランチ間マージPRです(github-actions[bot] が作成)。対象コミットの作成者は ViveliDuCh です。このPRは自動マージされず、チェック通過後にスカッシュやリベースではなくマージコミットで手動マージする必要があります。

変更内容

  • eng/Versions.props(+3/-4):バージョン関連の定義が変更されています。提供情報からは、具体的にどのプロパティがどう変わったかは確認できません。

パフォーマンスへの影響

影響なし(提供情報にパフォーマンスに関する記述はありません)。

関連Issue

なし

その他

  • マージコンフリクトがある場合は、GitHub UI またはコマンドラインで手動解決が必要です。
  • 変更のプッシュ先ブランチは merge/release/8.0-to-release/8.0-staging です。このブランチに push するとPR検証が再実行されます。
  • PRが誤って生成された場合は、arcadeリポジトリの inter-branch-merge.ps1 を参照するか、.NET Core Engineering (dotnet/dnceng) に連絡してください。

#134013 [automated] Merge branch 'release/9.0' => 'release/9.0-staging'

概要

release/9.0 ブランチにあって、まだ release/9.0-staging にマージされていない変更を取り込む、GitHub Actions ボットによる自動マージPRです。取り込まれるコミットは、コミッターの ViveliDuCh によるものです。自動マージはされず、チェック通過後にスカッシュやリベースではなく、マージコミットで手動マージする必要があります。コンフリクトが発生した場合は、手動での解決が必要です。

変更内容

  • eng/Versions.props (+3/-4): バージョン関連のプロパティが変更されています。具体的な変更内容は提供情報からは判断できません。

パフォーマンスへの影響

影響なし

関連Issue

なし

その他

  • 本PRは merge/release/9.0-to-release/9.0-staging ブランチから作成されています。
  • コンフリクト解決や変更の追加が必要な場合は、このブランチに直接プッシュできます。
  • PRが誤って生成された場合は、dotnet/dnceng に連絡するか、inter-branch-merge.ps1 の修正に協力してください。

目次