Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[SR-12425] Swift 5.2 Regression: Segfault when type of dynamic member key path doesn't match instance type #54864

Closed
ZevEisenberg opened this issue Mar 26, 2020 · 5 comments
Labels
bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. compiler The Swift compiler in itself crash Bug: A crash, i.e., an abnormal termination of software type checker Area → compiler: Semantic analysis

Comments

@ZevEisenberg
Copy link
Contributor

Previous ID SR-12425
Radar rdar://problem/62200986
Original Reporter @ZevEisenberg
Type Bug
Status Closed
Resolution Done

Attachment: Download

Environment

Xcode 11.4 (11E146) on macOS 10.15.4 (19E266)

Apple Swift version 5.2 (swiftlang-1103.0.32.1 clang-1103.0.32.29)
Target: x86_64-apple-darwin19.4.0

Additional Detail from JIRA
Votes 0
Component/s Compiler
Labels Bug, CompilerCrash, TypeChecker
Assignee None
Priority Medium

md5: 5ebe8cb4b3c692d76e9a3f700fc80df6

is duplicated by:

  • SR-13006 Segmentation fault when type checking recursive dynamicMemberLookup
  • SR-13215 Default implementation of dynamic member lookup subscript in protocol extension causes segfault 11

Issue Description:

This is a Swift 5.2 regression. It does not happen on Swift 5.1.3.

// Structs

public struct WrongStruct {}

@dynamicMemberLookup
public struct RightStruct {}

// Instances

internal var rightStructInstance: RightStruct = RightStruct()

// Extensions

public extension RightStruct {
    // This should be a WritableKeyPath<RightStruct>, but it's actually
    // WriteableKeyPath<WrongStruct>, which is what's causing the error.
    subscript<T>(dynamicMember member: WritableKeyPath<WrongStruct, T>) -> T {
        get { rightStructInstance[keyPath: member] }
        set { rightStructInstance[keyPath: member] = newValue }
    }
}
$ swift /Users/username/Desktop/SampleProject/Utilities/SegfaultingThings.swift
Stack dump:
0.  Program arguments: /Applications/Xcode_11.4.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/swift -frontend -interpret /Users/username/Desktop/SampleProject/Utilities/SegfaultingThings.swift -enable-objc-interop -stack-check -sdk /Applications/Xcode_11.4.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.15.sdk -color-diagnostics -module-name SegfaultingThings 
1.  Apple Swift version 5.2 (swiftlang-1103.0.32.1 clang-1103.0.32.29)
2.  While evaluating request TypeCheckSourceFileRequest(source_file "/Users/username/Desktop/SampleProject/Utilities/SegfaultingThings.swift", 0)
3.  While evaluating request TypeCheckFunctionBodyUntilRequest(SegfaultingThings.(file).RightStruct extension._@/Users/username/Desktop/SampleProject/Utilities/SegfaultingThings.swift:18:9, )
4.  While type-checking getter for subscript(dynamicMember:) (at /Users/username/Desktop/SampleProject/Utilities/SegfaultingThings.swift:17:5)
5.  While type-checking statement at [/Users/username/Desktop/SampleProject/Utilities/SegfaultingThings.swift:18:13 - line:18:52] RangeText="{ rightStructInstance[keyPath: member] "
6.  While type-checking statement at [/Users/username/Desktop/SampleProject/Utilities/SegfaultingThings.swift:18:15 - line:18:50] RangeText="rightStructInstance[keyPath: member"
7.  While type-checking expression at [/Users/username/Desktop/SampleProject/Utilities/SegfaultingThings.swift:18:15 - line:18:50] RangeText="rightStructInstance[keyPath: member"
0  swift                    0x000000010ddc84ea PrintStackTraceSignalHandler(void*) + 42
1  swift                    0x000000010ddc7cc0 SignalHandler(int) + 352
2  libsystem_platform.dylib 0x00007fff6757d5fd _sigtramp + 29
3  libsystem_platform.dylib 0x00007ffee6186e08 _sigtramp + 2126551080
4  swift                    0x000000010a55e775 (anonymous namespace)::ExprRewriter::buildKeyPathDynamicMemberIndexExpr(swift::BoundGenericType*, swift::SourceLoc, swift::constraints::ConstraintLocator*) + 2645
5  swift                    0x000000010a553288 (anonymous namespace)::ExprRewriter::buildDynamicMemberLookupRef(swift::Expr*, swift::Expr*, swift::SourceLoc, swift::SourceLoc, swift::constraints::SelectedOverload const&, swift::constraints::ConstraintLocator*) + 568
6  swift                    0x000000010a54207c swift::ASTVisitor<(anonymous namespace)::ExprRewriter, swift::Expr*, void, void, void, void, void>::visit(swift::Expr*) + 7948
7  swift                    0x000000010a5400b2 (anonymous namespace)::ExprWalker::walkToExprPost(swift::Expr*) + 18
8  swift                    0x000000010a536a98 swift::constraints::ConstraintSystem::applySolution(swift::constraints::Solution&, swift::Expr*, swift::Type, bool, bool) + 7192
9  swift                    0x000000010a6f9ac9 swift::TypeChecker::typeCheckExpressionImpl(swift::Expr*&, swift::DeclContext*, swift::TypeLoc, swift::ContextualTypePurpose, swift::OptionSet<swift::TypeCheckExprFlags, unsigned int>, swift::ExprTypeCheckListener&, swift::constraints::ConstraintSystem*) + 1033
10 swift                    0x000000010a7cbb3e swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) + 20782
11 swift                    0x000000010a7cd2a9 bool (anonymous namespace)::StmtChecker::typeCheckStmt<swift::Stmt>(swift::Stmt*&) + 121
12 swift                    0x000000010a7c8834 swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) + 7716
13 swift                    0x000000010a7c63a9 bool (anonymous namespace)::StmtChecker::typeCheckStmt<swift::BraceStmt>(swift::BraceStmt*&) + 121
14 swift                    0x000000010a7be2ff swift::SimpleRequest<swift::TypeCheckFunctionBodyUntilRequest, bool (swift::AbstractFunctionDecl*, swift::SourceLoc), (swift::CacheKind)1>::evaluateRequest(swift::TypeCheckFunctionBodyUntilRequest const&, swift::Evaluator&) + 2879
15 swift                    0x000000010a7c4b6e swift::TypeCheckFunctionBodyUntilRequest::OutputType swift::evaluateOrDefault<swift::TypeCheckFunctionBodyUntilRequest>(swift::Evaluator&, swift::TypeCheckFunctionBodyUntilRequest, swift::TypeCheckFunctionBodyUntilRequest::OutputType) + 718
16 swift                    0x000000010a7f36ce swift::TypeCheckSourceFileRequest::evaluate(swift::Evaluator&, swift::SourceFile*, unsigned int) const + 6270
17 swift                    0x000000010a7c2b47 swift::SimpleRequest<swift::TypeCheckSourceFileRequest, bool (swift::SourceFile*, unsigned int), (swift::CacheKind)2>::evaluateRequest(swift::TypeCheckSourceFileRequest const&, swift::Evaluator&) + 23
18 swift                    0x000000010a7f0fce swift::performTypeChecking(swift::SourceFile&, unsigned int) + 1006
19 swift                    0x0000000109e2505b swift::CompilerInstance::performSemaUpTo(swift::SourceFile::ASTStage_t) + 5915
20 swift                    0x0000000109b112c9 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 10281
21 swift                    0x0000000109a924d3 main + 1283
22 libdyld.dylib            0x00007fff67384cc9 start + 1
23 libdyld.dylib            0x000000000000000b start + 2563224387
[1]    58108 segmentation fault  swift /Users/username/Desktop/SampleProject/Utilities/SegfaultingThings.swift
@ZevEisenberg
Copy link
Contributor Author

I guess I should clarify: the code is incorrect. Swift 5.1.3 diagnoses it, while Swift 5.2 segfaults. Here's the output for Swift 5.1.3:

/Users/username/Desktop/SampleProject/Utilities/SegfaultingThings.swift:5:1: error: @dynamicMemberLookup attribute requires 'RightStruct' to have a 'subscript(dynamicMember:)' method that accepts either 'ExpressibleByStringLiteral' or a keypath
@dynamicMemberLookup
^
/Users/username/Desktop/SampleProject/Utilities/SegfaultingThings.swift:18:34: error: incorrect argument label in subscript (have 'keyPath:', expected 'dynamicMember:')
        get { rightStructInstance[keyPath: member] }
                                 ^~~~~~~~
                                  dynamicMember
/Users/username/Desktop/SampleProject/Utilities/SegfaultingThings.swift:19:34: error: cannot assign through subscript: 'rightStructInstance' is immutable
        set { rightStructInstance[keyPath: member] = newValue }

@theblixguy
Copy link
Collaborator

On master:

Assertion failed: (is<T>() && "Invalid accessor called"), function get, file /Users/suyashsrijan/Documents/swift-src/llvm-project/llvm/include/llvm/ADT/PointerUnion.h, line 195.
Stack dump:
0.  Program arguments: ./swiftc -frontend -typecheck /Users/suyashsrijan/Desktop/test.swift -sdk /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk
1.  Swift version 5.3-dev (LLVM 223e844e4d, Swift a9bd4258c9)
2.  While evaluating request TypeCheckSourceFileRequest(source_file "/Users/suyashsrijan/Desktop/test.swift")
3.  While evaluating request TypeCheckFunctionBodyUntilRequest(test.(file).RightStruct extension._@/Users/suyashsrijan/Desktop/test.swift:16:9, )
4.  While type-checking statement at [/Users/suyashsrijan/Desktop/test.swift:16:13 - line:16:52] RangeText="{ rightStructInstance[keyPath: member] "
5.  While type-checking statement at [/Users/suyashsrijan/Desktop/test.swift:16:15 - line:16:50] RangeText="rightStructInstance[keyPath: member"
6.  While type-checking expression at [/Users/suyashsrijan/Desktop/test.swift:16:15 - line:16:50] RangeText="rightStructInstance[keyPath: member"
0  swiftc                   0x00000001084b12a5 llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 37
1  swiftc                   0x00000001084b04e5 llvm::sys::RunSignalHandlers() + 85
2  swiftc                   0x00000001084b188c SignalHandler(int) + 268
3  libsystem_platform.dylib 0x00007fff70da242d _sigtramp + 29
4  libdyld.dylib            0x00007fff70ba8345 dyldGlobalLockRelease() + 0
5  libsystem_c.dylib        0x00007fff70c77a1c abort + 120
6  libsystem_c.dylib        0x00007fff70c76cd6 err + 0
7  swiftc                   0x0000000108879f33 (anonymous namespace)::ExprRewriter::buildKeyPathSubscriptComponent(swift::constraints::SelectedOverload const&, swift::SourceLoc, swift::Expr*, llvm::ArrayRef<swift::Identifier>, swift::constraints::ConstraintLocator*, llvm::SmallVectorImpl<swift::KeyPathExpr::Component>&) (.cold.18) + 35
8  swiftc                   0x0000000104eac236 (anonymous namespace)::ExprRewriter::buildKeyPathSubscriptComponent(swift::constraints::SelectedOverload const&, swift::SourceLoc, swift::Expr*, llvm::ArrayRef<swift::Identifier>, swift::constraints::ConstraintLocator*, llvm::SmallVectorImpl<swift::KeyPathExpr::Component>&) + 3126
9  swiftc                   0x0000000104eab4fa (anonymous namespace)::ExprRewriter::buildKeyPathDynamicMemberIndexExpr(swift::BoundGenericType*, swift::SourceLoc, swift::constraints::ConstraintLocator*) + 2538
10 swiftc                   0x0000000104ea9455 (anonymous namespace)::ExprRewriter::buildDynamicMemberLookupRef(swift::Expr*, swift::Expr*, swift::SourceLoc, swift::SourceLoc, swift::constraints::SelectedOverload const&, swift::constraints::ConstraintLocator*) + 245
11 swiftc                   0x0000000104e98193 swift::ASTVisitor<(anonymous namespace)::ExprRewriter, swift::Expr*, void, void, void, void, void>::visit(swift::Expr*) + 13651
12 swiftc                   0x0000000104e94366 (anonymous namespace)::ExprWalker::walkToExprPost(swift::Expr*) + 22
13 swiftc                   0x00000001052ded33 swift::Expr::walk(swift::ASTWalker&) + 115
14 swiftc                   0x0000000104e8e7c6 (anonymous namespace)::ExprWalker::rewriteTarget(swift::constraints::SolutionApplicationTarget) + 198
15 swiftc                   0x0000000104e8e582 swift::constraints::ConstraintSystem::applySolution(swift::constraints::Solution&, swift::constraints::SolutionApplicationTarget) + 546
16 swiftc                   0x0000000104ffd832 swift::TypeChecker::typeCheckExpression(swift::constraints::SolutionApplicationTarget&, bool&, swift::OptionSet<swift::TypeCheckExprFlags, unsigned int>, swift::ExprTypeCheckListener*) + 658
17 swiftc                   0x0000000104ffd536 swift::TypeChecker::typeCheckExpression(swift::Expr*&, swift::DeclContext*, swift::TypeLoc, swift::ContextualTypePurpose, swift::OptionSet<swift::TypeCheckExprFlags, unsigned int>, swift::ExprTypeCheckListener*) + 102
18 swiftc                   0x00000001050a8ec2 swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) + 8962
19 swiftc                   0x00000001050a9520 bool (anonymous namespace)::StmtChecker::typeCheckStmt<swift::Stmt>(swift::Stmt*&) + 128
20 swiftc                   0x00000001050a81f7 swift::ASTVisitor<(anonymous namespace)::StmtChecker, void, swift::Stmt*, void, void, void, void>::visit(swift::Stmt*) + 5687
21 swiftc                   0x00000001050a4a80 bool (anonymous namespace)::StmtChecker::typeCheckStmt<swift::BraceStmt>(swift::BraceStmt*&) + 128
22 swiftc                   0x00000001050a3df0 swift::TypeCheckFunctionBodyUntilRequest::evaluate(swift::Evaluator&, swift::AbstractFunctionDecl*, swift::SourceLoc) const + 1056
23 swiftc                   0x00000001050a0d15 swift::SimpleRequest<swift::TypeCheckFunctionBodyUntilRequest, bool (swift::AbstractFunctionDecl*, swift::SourceLoc), (swift::CacheKind)1>::evaluateRequest(swift::TypeCheckFunctionBodyUntilRequest const&, swift::Evaluator&) + 21
24 swiftc                   0x00000001050aac81 llvm::Expected<swift::TypeCheckFunctionBodyUntilRequest::OutputType> swift::Evaluator::getResultUncached<swift::TypeCheckFunctionBodyUntilRequest>(swift::TypeCheckFunctionBodyUntilRequest const&) + 497
25 swiftc                   0x00000001050aa811 llvm::Expected<swift::TypeCheckFunctionBodyUntilRequest::OutputType> swift::Evaluator::getResultCached<swift::TypeCheckFunctionBodyUntilRequest, (void*)0>(swift::TypeCheckFunctionBodyUntilRequest const&) + 129
26 swiftc                   0x00000001050a4639 swift::TypeCheckFunctionBodyUntilRequest::OutputType swift::evaluateOrDefault<swift::TypeCheckFunctionBodyUntilRequest>(swift::Evaluator&, swift::TypeCheckFunctionBodyUntilRequest, swift::TypeCheckFunctionBodyUntilRequest::OutputType) + 41
27 swiftc                   0x00000001050a3962 swift::TypeChecker::typeCheckAbstractFunctionBody(swift::AbstractFunctionDecl*) + 66
28 swiftc                   0x00000001050d3838 swift::TypeCheckSourceFileRequest::evaluate(swift::Evaluator&, swift::SourceFile*) const + 520
29 swiftc                   0x00000001050a0f51 swift::SimpleRequest<swift::TypeCheckSourceFileRequest, bool (swift::SourceFile*), (swift::CacheKind)2>::evaluateRequest(swift::TypeCheckSourceFileRequest const&, swift::Evaluator&) + 17
30 swiftc                   0x00000001050d5726 llvm::Expected<swift::TypeCheckSourceFileRequest::OutputType> swift::Evaluator::getResultUncached<swift::TypeCheckSourceFileRequest>(swift::TypeCheckSourceFileRequest const&) + 454
31 swiftc                   0x00000001050d5488 llvm::Expected<swift::TypeCheckSourceFileRequest::OutputType> swift::Evaluator::getResultCached<swift::TypeCheckSourceFileRequest, (void*)0>(swift::TypeCheckSourceFileRequest const&) + 56
32 swiftc                   0x00000001050d3535 swift::TypeCheckSourceFileRequest::OutputType swift::evaluateOrDefault<swift::TypeCheckSourceFileRequest>(swift::Evaluator&, swift::TypeCheckSourceFileRequest, swift::TypeCheckSourceFileRequest::OutputType) + 37
33 swiftc                   0x00000001044abade swift::CompilerInstance::parseAndTypeCheckMainFileUpTo(swift::SourceFile::ASTStage_t) + 286
34 swiftc                   0x00000001044aabc7 swift::CompilerInstance::parseAndCheckTypesUpTo(swift::CompilerInstance::ImplicitImports const&, swift::SourceFile::ASTStage_t) + 359
35 swiftc                   0x00000001044aa608 swift::CompilerInstance::performSemaUpTo(swift::SourceFile::ASTStage_t) + 520
36 swiftc                   0x00000001043b78fd performCompile(swift::CompilerInstance&, swift::CompilerInvocation const&, llvm::ArrayRef<char const*>, int&, swift::FrontendObserver*) + 1933
37 swiftc                   0x00000001043b6191 swift::performFrontend(llvm::ArrayRef<char const*>, char const*, void*, swift::FrontendObserver*) + 3553
38 swiftc                   0x000000010434ed6d main + 861
39 libdyld.dylib            0x00007fff70ba97fd start + 1
40 libdyld.dylib            0x0000000000000006 start + 18446603338624886794

@beccadax
Copy link
Contributor

@swift-ci create

@LucianoPAlmeida
Copy link
Collaborator

Fixed by #31140 and #31192

@ZevEisenberg Can you please verify in the next master snapshot and close? 🙂 Thanks

@ZevEisenberg
Copy link
Contributor Author

Confirmed fixed in:

Apple Swift version 5.4 (swiftlang-1205.0.16.12 clang-1205.0.19.6)

Target: arm64-apple-darwin20.3.0

(And probably earlier, but I'm bad at email.)

@swift-ci swift-ci transferred this issue from apple/swift-issues Apr 25, 2022
@AnthonyLatsis AnthonyLatsis added the crash Bug: A crash, i.e., an abnormal termination of software label Dec 12, 2022
This issue was closed.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
bug A deviation from expected or documented behavior. Also: expected but undesirable behavior. compiler The Swift compiler in itself crash Bug: A crash, i.e., an abnormal termination of software type checker Area → compiler: Semantic analysis
Projects
None yet
Development

No branches or pull requests

5 participants