swiftlang / swift

The Swift Programming Language
https://swift.org
Apache License 2.0
66.72k stars 10.28k forks source link

Assertion failed: (getRawDiscriminator() != InvalidDiscriminator), function getDiscriminator, file Expr.cpp, line 1937. #74091

Open dimlio opened 1 month ago

dimlio commented 1 month ago

Description

Hi!

We observed a strange behavior of our Swift application leading to either wrong logs or crashes. When running under ASAN it reported "use after free" error. We tried to use 5.10 and 6.0 development snapshots and got compiler crashes due to failed asserts. We were able to minimize the code that produces similar assertion.

Reproduction

import Foundation

func log(_ message: @autoclosure () -> String) {
    print(message())
}

func check() throws -> Bool {
    func inner() -> Predicate<Int> {
        #Predicate<Int> { $0 > 0 }
    }

    let foo = 18
    log("checking \(foo)")
    let predicate = inner()
    log("predicate: \(predicate)")
    return try predicate.evaluate(foo)
}

print(try check())

Stack dump

0.      Program arguments: /Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2024-05-15-a.xctoolchain/usr/bin/swift-frontend -frontend -interpret a.swift -Xllvm -aarch64-use-tbi -enable-objc-interop -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk -color-diagnostics -empty-abi-descriptor -Xcc -working-directory -Xcc /Users/sbn/work/test/predicate-in-inner-function -resource-dir /Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2024-05-15-a.xctoolchain/usr/lib/swift -module-name a -plugin-path /Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2024-05-15-a.xctoolchain/usr/lib/swift/host/plugins -plugin-path /Library/Developer/Toolchains/swift-DEVELOPMENT-SNAPSHOT-2024-05-15-a.xctoolchain/usr/local/lib/swift/host/plugins -target-sdk-version 14.5 -target-sdk-name macosx14.5 -external-plugin-path /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib/swift/host/plugins#/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/bin/swift-plugin-server -external-plugin-path /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/local/lib/swift/host/plugins#/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/bin/swift-plugin-server
1.      Apple Swift version 6.0-dev (LLVM cef183591317ec7, Swift 66e311074bff491)
2.      Compiling with effective version 5.10
3.      While walking into body of 'check()' (at a.swift:7:1)
4.      While verifying closure expression at [a.swift:13:9 - line:13:9] RangeText=""
Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
0  swift-frontend           0x0000000107e80820 llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 56
1  swift-frontend           0x0000000107e7efec llvm::sys::RunSignalHandlers() + 112
2  swift-frontend           0x0000000107e80e68 SignalHandler(int) + 304
3  libsystem_platform.dylib 0x0000000182647584 _sigtramp + 56
4  libsystem_pthread.dylib  0x0000000182616c20 pthread_kill + 288
5  libsystem_c.dylib        0x0000000182523a30 abort + 180
6  libsystem_c.dylib        0x0000000182522d20 err + 0
7  swift-frontend           0x00000001083b1bd8 swift::AbstractClosureExpr::getBody() const (.cold.1) + 0
8  swift-frontend           0x00000001041bd9cc swift::AbstractClosureExpr::setParameterList(swift::ParameterList*) + 0
9  swift-frontend           0x00000001040449ec (anonymous namespace)::Verifier::verifyChecked(swift::AbstractClosureExpr*) + 272
10 swift-frontend           0x000000010403c630 swift::ASTWalker::PostWalkResult<swift::AutoClosureExpr*> (anonymous namespace)::Verifier::dispatchVisitPost<swift::AutoClosureExpr*>(swift::AutoClosureExpr*) + 192
11 swift-frontend           0x00000001040341e4 (anonymous namespace)::Verifier::walkToExprPost(swift::Expr*) + 184
12 swift-frontend           0x0000000104049634 (anonymous namespace)::Traversal::doIt(swift::Expr*) + 988
13 swift-frontend           0x000000010404dd3c swift::ArgumentList* llvm::function_ref<swift::ArgumentList* (swift::ArgumentList*)>::callback_fn<(anonymous namespace)::Traversal::doIt(swift::ArgumentList*)::'lambda'(swift::ArgumentList*)>(long, swift::ArgumentList*) + 264
14 swift-frontend           0x000000010404dbd0 swift::ArgumentList* (anonymous namespace)::Traversal::traverse<swift::ArgumentList>(swift::ASTWalker::PreWalkResult<swift::ArgumentList*>, llvm::function_ref<swift::ArgumentList* (swift::ArgumentList*)>, llvm::function_ref<swift::ASTWalker::PostWalkResult<swift::ArgumentList*> (swift::ArgumentList*)>) + 84
15 swift-frontend           0x000000010404b254 (anonymous namespace)::Traversal::visitApplyExpr(swift::ApplyExpr*) + 108
16 swift-frontend           0x0000000104049334 (anonymous namespace)::Traversal::doIt(swift::Expr*) + 220
17 swift-frontend           0x000000010404b5fc swift::Stmt* llvm::function_ref<swift::Stmt* (swift::Stmt*)>::callback_fn<(anonymous namespace)::Traversal::doIt(swift::Stmt*)::'lambda'(swift::Stmt*)>(long, swift::Stmt*) + 380
18 swift-frontend           0x000000010404b41c swift::Stmt* (anonymous namespace)::Traversal::traverse<swift::Stmt>(swift::ASTWalker::PreWalkResult<swift::Stmt*>, llvm::function_ref<swift::Stmt* (swift::Stmt*)>, llvm::function_ref<swift::ASTWalker::PostWalkResult<swift::Stmt*> (swift::Stmt*)>) + 84
19 swift-frontend           0x000000010404d9f0 (anonymous namespace)::Traversal::visitAbstractFunctionDecl(swift::AbstractFunctionDecl*) + 660
20 swift-frontend           0x000000010404c7e8 (anonymous namespace)::Traversal::visit(swift::Decl*) + 156
21 swift-frontend           0x0000000104049cd0 (anonymous namespace)::Traversal::doIt(swift::Decl*) + 288
22 swift-frontend           0x0000000104049ba4 swift::Decl::walk(swift::ASTWalker&) + 32
23 swift-frontend           0x00000001041fecd4 swift::SourceFile::walk(swift::ASTWalker&) + 196
24 swift-frontend           0x0000000104033864 swift::verify(swift::SourceFile&) + 96
25 swift-frontend           0x0000000104316d00 swift::TypeCheckSourceFileRequest::cacheResult(std::__1::tuple<>) const + 76
26 swift-frontend           0x0000000103d4f3dc swift::performTypeChecking(swift::SourceFile&) + 92
27 swift-frontend           0x0000000102c3ffb0 bool llvm::function_ref<bool (swift::SourceFile&)>::callback_fn<swift::CompilerInstance::performSema()::$_7>(long, swift::SourceFile&) + 16
28 swift-frontend           0x0000000102c39a40 swift::CompilerInstance::forEachFileToTypeCheck(llvm::function_ref<bool (swift::SourceFile&)>) + 156
29 swift-frontend           0x0000000102c39984 swift::CompilerInstance::performSema() + 76
30 swift-frontend           0x0000000102a0ed84 withSemanticAnalysis(swift::CompilerInstance&, swift::FrontendObserver*, llvm::function_ref<bool (swift::CompilerInstance&)>, bool) + 60
31 swift-frontend           0x0000000102a00164 performCompile(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 708
32 swift-frontend           0x00000001029ff0d0 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 2384
33 swift-frontend           0x000000010280c2ec swift::mainEntry(int, char const**) + 3096
34 dyld                     0x000000018228e0e0 start + 2360

Expected behavior

Code is expected to compile and run without errors.

Environment

Apple Swift version 6.0-dev (LLVM cef183591317ec7, Swift 66e311074bff491) Target: arm64-apple-macosx14.0

Additional information

No response

dimlio commented 1 month ago

When building with current 5.10 compiler the crash is different:

$ swiftc a.swift
error: compile command failed due to signal 6 (use -v to see invocation)
Invalid bitcast
  %19 = bitcast ptr %11 to i64
<unknown>:0: error: fatal error encountered during compilation; please submit a bug report (https://swift.org/contributing/#reporting-bugs)
<unknown>:0: note: Broken module found, compilation aborted!
Please submit a bug report (https://swift.org/contributing/#reporting-bugs) and include the crash backtrace.
Stack dump:
0.      Program arguments: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-frontend -frontend -c -primary-file a.swift -target arm64-apple-macosx14.0 -Xllvm -aarch64-use-tbi -enable-objc-interop -stack-check -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk -color-diagnostics -new-driver-path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift-driver -empty-abi-descriptor -resource-dir /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift -module-name a -disable-clang-spi -target-sdk-version 14.5 -target-sdk-name macosx14.5 -external-plugin-path /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/usr/lib/swift/host/plugins#/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/usr/bin/swift-plugin-server -external-plugin-path /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/usr/local/lib/swift/host/plugins#/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX14.5.sdk/usr/bin/swift-plugin-server -external-plugin-path /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/lib/swift/host/plugins#/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/bin/swift-plugin-server -external-plugin-path /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/local/lib/swift/host/plugins#/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/usr/bin/swift-plugin-server -plugin-path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/swift/host/plugins -plugin-path /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/local/lib/swift/host/plugins -o /var/folders/y0/5ch3_9cs0x1fyzdykz2tbz4w0000gn/T/TemporaryDirectory.SQOhZE/a-1.o
1.      Apple Swift version 5.10 (swiftlang-5.10.0.13 clang-1500.3.9.4)
2.      Compiling with the current language version
Stack dump without symbol names (ensure you have llvm-symbolizer in your PATH or set the environment var `LLVM_SYMBOLIZER_PATH` to point to it):
0  swift-frontend           0x0000000107e97f3c llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) + 56
1  swift-frontend           0x0000000107e970f8 llvm::sys::RunSignalHandlers() + 112
2  swift-frontend           0x0000000107e98544 SignalHandler(int) + 360
3  libsystem_platform.dylib 0x0000000182647584 _sigtramp + 56
4  libsystem_pthread.dylib  0x0000000182616c20 pthread_kill + 288
5  libsystem_c.dylib        0x0000000182523a30 abort + 180
6  swift-frontend           0x00000001027a16d8 PrettyStackTraceFrontend::~PrettyStackTraceFrontend() + 0
7  swift-frontend           0x0000000107de0a18 llvm::report_fatal_error(llvm::Twine const&, bool) + 280
8  swift-frontend           0x0000000107de0900 llvm::report_fatal_error(llvm::Twine const&, bool) + 0
9  swift-frontend           0x0000000102c744b8 llvm::detail::PassModel<llvm::Module, llvm::VerifierPass, llvm::PreservedAnalyses, llvm::AnalysisManager<llvm::Module>>::printPipeline(llvm::raw_ostream&, llvm::function_ref<llvm::StringRef (llvm::StringRef)>) + 0
10 swift-frontend           0x0000000107b97ce8 llvm::PassManager<llvm::Module, llvm::AnalysisManager<llvm::Module>>::run(llvm::Module&, llvm::AnalysisManager<llvm::Module>&) + 224
11 swift-frontend           0x0000000102c67490 swift::performLLVMOptimizations(swift::IRGenOptions const&, llvm::Module*, llvm::TargetMachine*, llvm::raw_pwrite_stream*) + 3992
12 swift-frontend           0x0000000102c68bec swift::performLLVM(swift::IRGenOptions const&, swift::DiagnosticEngine&, llvm::sys::SmartMutex<false>*, llvm::GlobalVariable*, llvm::Module*, llvm::TargetMachine*, llvm::StringRef, llvm::vfs::OutputBackend&, swift::UnifiedStatsReporter*) + 2364
13 swift-frontend           0x000000010279c4f8 generateCode(swift::CompilerInstance&, llvm::StringRef, llvm::Module*, llvm::GlobalVariable*) + 260
14 swift-frontend           0x0000000102796318 performCompileStepsPostSILGen(swift::CompilerInstance&, std::__1::unique_ptr<swift::SILModule, std::__1::default_delete<swift::SILModule>>, llvm::PointerUnion<swift::ModuleDecl*, swift::SourceFile*>, swift::PrimarySpecificPaths const&, int&, swift::FrontendObserver*) + 2024
15 swift-frontend           0x0000000102795444 swift::performCompileStepsPostSema(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 608
16 swift-frontend           0x0000000102799694 performCompile(swift::CompilerInstance&, int&, swift::FrontendObserver*) + 1448
17 swift-frontend           0x00000001027976d0 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 4968
18 swift-frontend           0x0000000102726e8c swift::mainEntry(int, char const**) + 2612
19 dyld                     0x000000018228e0e0 start + 2360
error: fatalError