PC パソコン

Xcode「Found ownership error?!」の原因と回避方法【Swift 6.4 typed throws】

Xcode 27 betaのSwift 6.4では、typed throwsと列挙型ケースを指定したcatchを組み合わせると、正しいコードでもFound ownership error?!を出してコンパイラが停止することがあります。発生条件、原因、推奨手順、回避策を公式Issueに基づいて解説します。

代表的なログ

error: compile command failed due to signal 6 (use -v to see invocation)
Found outside of lifetime use?!
Found ownership error?!
<unknown>:0: error: fatal error encountered during compilation
While running pass #0 SILModuleTransform "SILGenCleanup".

原因

Swift Issue #89787によると、SILGenがケースパターン付きcatchを生成する際、typed throwsのエラー値を借用したまま未処理エラーの再送出経路へ所有権を渡す場合があります。所有権検証器が有効期間外の使用と判断し、コンパイラがsignal 6で停止します。

アプリ実行時のメモリ破損ではありません。Swiftコンパイラ内部の回帰です。

発生条件・対象バージョン

  • Xcode 27 betaのApple Swift 6.4(再現環境はswiftlang-6.4.0.20.104)
  • throws(MyError)またはResult<T, MyError>.get()を使用
  • catch MyError.someCaseでケースをパターンマッチ
  • エラー列挙型に関連値を持つケースがある

Swift 5/6言語モードの両方で再現し、Swift 6.3.2では再現しないと報告されています。

再現例

enum MyError: Error {
    case noData
    case wrapped(Error)
}
func load() throws(MyError) -> Int { 0 }
func reproduce() throws -> Int {
    do { return try load() }
    catch MyError.noData { return 0 }
}

推奨する解決手順

  1. 使用中のXcodeとSwiftを確認します。
    xcodebuild -version
    xcrun swiftc --version
    xcode-select -p
  2. 修正を含むことが確認できるツールチェーンまたはXcodeへ更新します。PR #90330は2026年7月6日にSwiftのmainへマージ済みですが、最初に収録されたXcode正式版は公開情報で特定できません。更新後に再現コードで確認してください。
  3. 更新できない場合は、ケースパターンをcatchの外へ移します。
    func reproduce() throws -> Int {
        do { return try load() }
        catch {
            if case MyError.noData = error { return 0 }
            throw error
        }
    }
  4. Derived Dataを削除して再ビルドします。
    rm -rf ~/Library/Developer/Xcode/DerivedData/*
    xcodebuild clean

代替策

  • 要件が許せばSwift 6.3.2を含むXcodeへ一時的に戻す
  • API契約を変えられる場合だけ通常のthrowsへ変更する
  • 汎用catch内でswitchまたはif caseを使う

@_で始まる非公開属性に依存する恒久対策は推奨しません。

確認方法

  1. 最小再現ターゲットを作る
  2. 以前と同じSwift言語モードでDebug/Releaseをビルドする
  3. SILGenCleanupと所有権エラーが消えたことを確認する
  4. 処理対象のケースと再送出ケースの両方をテストする

注意点

compile command failed due to signal 6だけでは今回の不具合と断定できません。SILGenCleanup、所有権エラー、typed throws、ケースパターン付きcatchがそろうか確認してください。IssueがClosedでも、使用中のXcodeへの収録を意味するとは限りません。

まとめ

Found ownership error?!は、Swift 6.4でtyped throwsをケース指定のcatchと組み合わせた際のSILGen所有権管理の回帰です。確認済みの修正ツールチェーンへ更新し、それまでは汎用catch内でケース判定してください。

公式情報