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-9947] EXC_BAD_ACCESS stemming from protocol definition not including class, but including class-based restraint #52350

Closed
swift-ci opened this issue Feb 18, 2019 · 4 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 run-time crash Bug → crash: Swift code crashed during execution runtime The Swift Runtime

Comments

@swift-ci
Copy link
Collaborator

Previous ID SR-9947
Radar None
Original Reporter BenLeggiero (JIRA User)
Type Bug
Status Resolved
Resolution Done

Attachment: Download

Environment
  • Xcode 10.1 (10B61)

  • Swift 4.2.1

  • macOS 10.13.6 (17G5019)

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

md5: 6e55766998aa375ab1d917246fb28b04

Issue Description:

A crash named EXC_BAD_ACCESS occurs with the following setup:

  • Swift 4.2.1 (as bundled with Xcode 10.1)

  • A protocol which is not class-bound, but which has a where clause requiring it to inherit from any other class

    • At least one function or variable requirement of that protocol
  • A class which conforms to the aforementioned protocol

  • A variable or constant whose type is explicitly the aforementioned protocol, and whose instance is of the aforementioned class

  • A call to the protocol-required function or variable of the aforementioned variable

Expected outcome

Calling the function or variable requirement on the implementation instance will actually call said function or variable

Actual outcome

Attempting to perform such a call results in EXC_BAD_ACCESS

Known workarounds

  1. On the protocol, add : class to make it class-bound. This is not always possible as it results in a Swift compiler warning, and some projects/businesses require "Treat Warnings As Errors" be set to "Yes", which will cause this to fail a compile attempt

  2. On the variable declaration, explicitly type it to the implementation class' type. This is not always possible as that type is not always knowable at that time of writing (e.g. implementation class might be internal to some other framework)

SSCCE

open class Bar {}



protocol Foo where Self : Bar { // Fix 1: change this to `protocol Foo : class where Self : Bar {`
    func bar()
    var baz: Any { get }
}



class FooImpl : Bar, Foo {
    func bar() {
        print("You called bar!")
    }
    
    let baz: Any = "This is baz"
}



let myFoo: Foo // Fix 2: change this to `let myFoo: FooImpl`
myFoo = FooImpl()

myFoo.bar() // crash: EXC_BAD_ACCESS (code=EXC_I386_GPFLT)
print(myFoo.baz) // if the previous line is commented-out, crash: EXC_BAD_ACCESS (code=1, address=0xfffffffffffffff8)
@hamishknight
Copy link
Collaborator

Superclass constrained protocols (that is, protocol Foo where Self : Bar) aren't completely implemented in Swift 4.x, the syntax should have really been rejected. They are however implemented in Swift 5 – your code runs as expected when using Xcode 10.2 beta 2.

@swift-ci
Copy link
Collaborator Author

Comment by Ky (JIRA)

@hamishknight Fascinating! Unfortunately, due to company policy, I won't be able to test that since I'm not allowed to install Mojave. Will this fix possibly be patched into Swift 4.2 andor Xcode 10.1?

@hamishknight
Copy link
Collaborator

BenLeggiero (JIRA User) I don't believe so. You should however be able to use a Swift 5 snapshot toolchain with Xcode 10.1 (it may have to be a slightly earlier snapshot though to ensure compatibility with the old SDKs, 2019-01-23 works for me). That being said, I'm not sure if you're able to distribute iOS/macOS apps while using a development snapshot of Swift.

@swift-ci
Copy link
Collaborator Author

Comment by Ky (JIRA)

Dunno when this was fixed, but it seems to be working as of:

Xcode Version 11.1 (11A1027)
macOS 10.14.6 (18G95)
Apple Swift version 5.1 (swiftlang-1100.0.270.13 clang-1100.0.33.7)
Target: x86_64-apple-darwin18.7.0

@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 run-time crash Bug → crash: Swift code crashed during execution runtime The Swift Runtime
Projects
None yet
Development

No branches or pull requests

3 participants