Skip to content

SIL ownership/lifetime verifier crash on catch cast to the function's typed-throws error type (Windows, Swift 6.2) #89577

@broken-circle

Description

@broken-circle

Description

Compiling a Swift package on Windows with the Swift 6.2.0 toolchain crashes swift-frontend during SIL ownership verification. The crash is Found outside of lifetime use?! followed by Found ownership error?!. The same source compiles without crashing on macOS and Linux.

Reproduction

The crash occurs while compiling Configuration.swift in swiftlang/swift-subprocess#261. The relevant function and the catch block that triggers it:

internal func run<Result, Input: InputProtocol, Output: OutputProtocol, Error: OutputProtocol>(
    input: consuming CreatedPipe,
    as inputType: Input.Type,
    output: consuming CreatedPipe,
    as outputType: Output.Type,
    error: consuming CreatedPipe,
    as errorType: Error.Type,
    _ body: (
        (
            ProcessIdentifier,
            consuming IODescriptor?,
            consuming IODescriptor?,
            consuming IODescriptor?
        ) async throws -> Result
    )
) async throws -> ExecutionOutcome<Result> {
    let baseContext = ExecutionContext(self)

    var spawnResults: SpawnResult
    do {
        spawnResults = try await self.spawn(
            withInput: input,
            outputPipe: output,
            errorPipe: error
        )
    } catch let error as SubprocessError { // warning emitted + crash
        throw error.withExecutionContext(baseContext)
    }

    // ...
}

withExecutionContext(_:) returns SubprocessError. On Windows, spawn(withInput:outputPipe:errorPipe:) uses throws(SubprocessError); on other platforms it is an untyped throw.

The workaround is to branch on the OS:

var spawnResults: SpawnResult
#if os(Windows)
do {
    spawnResults = try await self.spawn(
        withInput: input,
        outputPipe: output,
        errorPipe: error
    )
} catch {
    throw error.withExecutionContext(baseContext)
}
#else
do {
    spawnResults = try await self.spawn(
        withInput: input,
        outputPipe: output,
        errorPipe: error
    )
} catch let error as SubprocessError {
    throw error.withExecutionContext(baseContext)
}
#endif

Stack dump

Full stack dump and program arguments
error: compile command failed due to exception 3 (use -v to see invocation)
Begin Error in Function: '$s10Subprocess13ConfigurationV3run5input2as6outputAF5errorAF_AA16ExecutionOutcomeVyxGAA11CreatedPipeVn_q_mAMnq0_mAMnq1_mxAA17ProcessIdentifierV_AA12IODescriptorVSgnARnARntYaKYCXEtYaKs8SendableRzAA13InputProtocolR_AA06OutputQ0R0_AaUR1_r2_lF'

Found outside of lifetime use?!

Value: %133 = argument of bb4 : $SubprocessError         // users: %138, %169, %178

Consuming User:   store %133 to [init] %176 : $*SubprocessError   // id: %178

Non Consuming User:   end_borrow %138 : $SubprocessError              // id: %184

Block: bb6



End Error in Function: '$s10Subprocess13ConfigurationV3run5input2as6outputAF5errorAF_AA16ExecutionOutcomeVyxGAA11CreatedPipeVn_q_mAMnq0_mAMnq1_mxAA17ProcessIdentifierV_AA12IODescriptorVSgnARnARntYaKYCXEtYaKs8SendableRzAA13InputProtocolR_AA06OutputQ0R0_AaUR1_r2_lF'

Found ownership error?!

D:\a\swift-subprocess-test\swift-subprocess-test\Sources\Subprocess\Configuration.swift:112:27: warning: 'as' test is always true

 110 |                 errorPipe: error

 111 |             )

 112 |         } catch let error as SubprocessError {

     |                           `- warning: 'as' test is always true

 113 |             throw error.withExecutionContext(baseContext)

 114 |         }



<unknown>:0: error: fatal error encountered during compilation; please submit a bug report (https://swift.org/contributing/#reporting-bugs)

<unknown>:0: note: triggering standard assertion failure routine

Please submit a bug report (https://swift.org/contributing/#reporting-bugs) and include the crash backtrace.

Stack dump:

0.	Program arguments: C:\\Users\\runneradmin\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.2.0+Asserts\\usr\\bin\\swift-frontend.exe -frontend -c -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\API.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Buffer.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Configuration.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Error.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Execution.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\ExecutionContext.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\IO\\AsyncIO+KQueue.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\IO\\AsyncIO+Linux.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\IO\\AsyncIO+Unix.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\IO\\AsyncIO+Windows.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\IO\\Input.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\IO\\Output.swift -primary-file D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Platforms\\Subprocess+BSD.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Platforms\\Subprocess+Darwin.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Platforms\\Subprocess+Linux.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Platforms\\Subprocess+Unix.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Platforms\\Subprocess+Windows.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Result.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Span+Subprocess.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\SubprocessFoundation\\Input+Foundation.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\SubprocessFoundation\\Output+Foundation.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\SubprocessFoundation\\Span+SubprocessFoundation.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\SubprocessOutputSequence.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Teardown.swift D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\Subprocess\\Thread.swift -supplementary-output-file-map C:\\Users\\runneradmin\\AppData\\Local\\Temp\\TemporaryDirectory.1ObWvc\\supplementaryOutputs-1 -target x86_64-unknown-windows-msvc -disable-objc-interop -sdk C:\\Users\\runneradmin\\AppData\\Local\\Programs\\Swift\\Platforms\\6.2.0\\Windows.platform\\Developer\\SDKs\\Windows.sdk\\ -I D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Modules -I C:\\Users\\runneradmin\\AppData\\Local\\Programs\\Swift\\Platforms\\6.2.0\\Windows.platform\\Developer\\Library\\XCTest-6.2.0\\usr\\lib\\swift\\windows -I C:\\Users\\runneradmin\\AppData\\Local\\Programs\\Swift\\Platforms\\6.2.0\\Windows.platform\\Developer\\Library\\XCTest-6.2.0\\usr\\lib\\swift\\windows\\x86_64 -I C:\\Users\\runneradmin\\AppData\\Local\\Programs\\Swift\\Platforms\\6.2.0\\Windows.platform\\Developer\\Library\\Testing-6.2.0\\usr\\lib\\swift\\windows -no-color-diagnostics -Xcc -fno-color-diagnostics -enable-testing -g -debug-info-format=dwarf -dwarf-version=4 -module-cache-path D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\ModuleCache -static -swift-version 6 -Onone -D SWIFT_PACKAGE -D DEBUG -D SWIFT_MODULE_RESOURCE_BUNDLE_UNAVAILABLE -D SubprocessFoundation -enable-experimental-feature StrictConcurrency -enable-experimental-feature Lifetimes -enable-upcoming-feature NonisolatedNonsendingByDefault -enable-upcoming-feature ExistentialAny -enable-upcoming-feature MemberImportVisibility -enable-upcoming-feature InternalImportsByDefault -empty-abi-descriptor -enable-anonymous-context-mangled-names -file-compilation-dir D:\\a\\swift-subprocess-test\\swift-subprocess-test -Xcc -fmodule-map-file=D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\_SubprocessCShims\\include\\module.modulemap -Xcc -I -Xcc D:\\a\\swift-subprocess-test\\swift-subprocess-test\\Sources\\_SubprocessCShims\\include -Xcc -fmodule-map-file=D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\checkouts\\swift-system\\Sources\\CSystem\\include\\module.modulemap -Xcc -I -Xcc D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\checkouts\\swift-system\\Sources\\CSystem\\include -Xcc -D_MT -Xcc -D_DLL -Xcc -Xclang -Xcc --dependent-lib=msvcrt -Xcc -gdwarf -no-auto-bridging-header-chaining -module-name Subprocess -package-name swift_subprocess_test -in-process-plugin-server-path C:\\Users\\runneradmin\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.2.0+Asserts\\usr\\bin\\SwiftInProcPluginServer.dll -plugin-path C:\\Users\\runneradmin\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.2.0+Asserts\\usr\\bin -plugin-path C:\\Users\\runneradmin\\AppData\\Local\\Programs\\Swift\\Toolchains\\6.2.0+Asserts\\usr\\local\\bin -autolink-library oldnames -autolink-library msvcrt -Xcc -D_MT -Xcc -D_DLL -parse-as-library -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\API.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\Buffer.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\Configuration.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\Error.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\Execution.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\ExecutionContext.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\AsyncIO+KQueue.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\AsyncIO+Linux.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\AsyncIO+Unix.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\AsyncIO+Windows.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\Input.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\Output.swift.o -o D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\Subprocess.build\\Subprocess+BSD.swift.o -index-store-path D:\\a\\swift-subprocess-test\\swift-subprocess-test\\.build\\x86_64-unknown-windows-msvc\\debug\\index\\store -index-system-modules

#17 0x00007ff6b49ed60d (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0x172d60d)

#18 0x00007ff6b401b5d9 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd5b5d9)

#19 0x00007ff6b401215d (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd5215d)

#20 0x00007ff6b4014eab (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd54eab)

#21 0x00007ff6b40112ef (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd512ef)

#22 0x00007ff6b405f248 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd9f248)

#23 0x00007ff6b4059c1d (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd99c1d)

#24 0x00007ff6b405f3f8 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd9f3f8)

#25 0x00007ff6b401ca15 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd5ca15)

#26 0x00007ff6b4015105 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd55105)

#27 0x00007ff6b40157e6 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd557e6)

#28 0x00007ff6b401ce16 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd5ce16)

#29 0x00007ff6b400b773 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd4b773)

#30 0x00007ff6b401b2c4 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0xd5b2c4)

#31 0x00007ff6b3907d69 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0x647d69)

#32 0x00007ff6b3906b34 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0x646b34)

#33 0x00007ff6b3906feb (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0x646feb)

#34 0x00007ff6b3908f52 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0x648f52)

#35 0x00007ff6b3754110 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0x494110)

#36 0x00007ff6b3753ca7 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0x493ca7)

#37 0x00007ff6ba226698 (C:\Users\runneradmin\AppData\Local\Programs\Swift\Toolchains\6.2.0+Asserts\usr\bin\swift-frontend.exe+0x6f66698)

#38 0x00007ffb7165e8d7 (C:\Windows\System32\KERNEL32.DLL+0x2e8d7)

#39 0x00007ffb726cc53c (C:\Windows\SYSTEM32\ntdll.dll+0x8c53c)

Expected behavior

The compiler should either compile the code successfully or emit an error diagnostic, not crash with an internal SIL verification failure.

Environment

  • swift-6.2-RELEASE, asserts-enabled toolchain
  • Target: x86_64-unknown-windows-msvc, -Onone, -swift-version 6
  • GitHub Actions windows-latest

Additional information

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    SILOptimizerArea → compiler: SIL optimization passescompilerThe Swift compiler itselfcrashBug: A crash, i.e., an abnormal termination of softwaredo catchFeature → statements: 'do' statementsownershipFeature: Ownership modifiers and semanticsstatementsFeature: statementsswift 6.5-devtyped throwsFeature → error handling → throws & rethrows: Typed throws

    Type

    No fields configured for Bug.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions