[swift-dev] PR-9995: enable exclusivity runtime checks.

Andrew Trick atrick at apple.com
Thu Jun 1 18:47:45 CDT 2017


Hi swift-dev,

PR-9995 enables exclusivity runtime checks:
https://github.com/apple/swift/pull/9995

These checks catch violations of exclusivity that can't be discovered statically [0], printing the message:

"Simultaneous accesses to 0x*, but modification requires exclusive access."

The error message is followed by a backtrace and details on the source locations of the two conflicting accesses.

In Swift 3 mode, this runtime diagnostic is a warning. In Swift 4 mode it is an error, meaning the program aborts immediately after reporting the first failure.

To disable the runtime checks, use -enforce-exclusivity=unchecked, which enables static
checks only.

This feature is explained in the Swift evolution proposal: Enforce Exclusive Access to Memory:
https://github.com/apple/swift-evolution/blob/master/proposals/0176-enforce-exclusive-access-to-memory.md

Note that exclusivity is not yet fully enforced for noescape closures. The current checks are conservative in this respect. Enforcement will be strengthened to handle this case in the near future, pending review of the proposal ammendment: "Restrictions on recursive uses of non-escaping closures".
https://github.com/apple/swift-evolution/blob/master/proposals/0176-enforce-exclusive-access-to-memory.md#restrictions-on-recursive-uses-of-non-escaping-closures

[0] dynamic exclusivity violation

struct MyStruct {
  var i: Int = 0

  mutating func mutateS(_ f: ()->Int) {
    i += f()
  }
}

class MyClass {
  var s: MyStruct
  
  init() { s = MyStruct() }
}

func foo(_ o: MyClass) {
  o.s.mutateS({ o.s.i })
}

-Andy


More information about the swift-dev mailing list