> On May 12, 2016, at 11:21 AM, John McCall <rjmcc...@apple.com> wrote:
> 
>> On May 12, 2016, at 10:45 AM, Jordan Rose via swift-dev 
>> <swift-dev@swift.org> wrote:
>>> On May 12, 2016, at 10:44, Joe Groff <jgr...@apple.com> wrote:
>>> 
>>> 
>>>> On May 12, 2016, at 9:27 AM, Jordan Rose via swift-dev 
>>>> <swift-dev@swift.org> wrote:
>>>> 
>>>> 
>>>> - I’m uncomfortable with using the term “undefined behavior” as if it’s 
>>>> universally understood. Up until now we haven't formally had that notion 
>>>> in Swift, just “type safety” and “memory safety” and 
>>>> “invariant-preserving” and the like. Maybe we need it now, but I think it 
>>>> needs to be explicitly defined. (I’d actually talk to Dave about exactly 
>>>> what terms make the most sense for users.)
>>> 
>>> We do have undefined behavior, and use that term in the standard library 
>>> docs where appropriate:
>>> 
>>> stdlib/public/core/Optional.swift-  /// `!` (forced unwrap) operator. 
>>> However, in optimized builds (`-O`), no
>>> stdlib/public/core/Optional.swift-  /// check is performed to ensure that 
>>> the current instance actually has a
>>> stdlib/public/core/Optional.swift-  /// value. Accessing this property in 
>>> the case of a `nil` value is a serious
>>> stdlib/public/core/Optional.swift:  /// programming error and could lead to 
>>> undefined behavior or a runtime
>>> stdlib/public/core/Optional.swift-  /// error.
>>> stdlib/public/core/Optional.swift-  ///
>>> stdlib/public/core/Optional.swift-  /// In debug builds (`-Onone`), the 
>>> `unsafelyUnwrapped` property has the same
>>> --
>>> stdlib/public/core/StringBridge.swift-  /// The caller of this function 
>>> guarantees that the closure 'body' does not
>>> stdlib/public/core/StringBridge.swift-  /// escape the object referenced by 
>>> the opaque pointer passed to it or
>>> stdlib/public/core/StringBridge.swift-  /// anything transitively reachable 
>>> form this object. Doing so
>>> stdlib/public/core/StringBridge.swift:  /// will result in undefined 
>>> behavior.
>>> stdlib/public/core/StringBridge.swift-  
>>> @_semantics("self_no_escaping_closure")
>>> stdlib/public/core/StringBridge.swift-  func 
>>> _unsafeWithNotEscapedSelfPointer<Result>(
>>> stdlib/public/core/StringBridge.swift-    _ body: @noescape (OpaquePointer) 
>>> throws -> Result
>>> --
>>> stdlib/public/core/Unmanaged.swift-  /// reference's lifetime fixed for the 
>>> duration of the
>>> stdlib/public/core/Unmanaged.swift-  /// '_withUnsafeGuaranteedRef' call.
>>> stdlib/public/core/Unmanaged.swift-  ///
>>> stdlib/public/core/Unmanaged.swift:  /// Violation of this will incur 
>>> undefined behavior.
>>> stdlib/public/core/Unmanaged.swift-  ///
>>> stdlib/public/core/Unmanaged.swift-  /// A lifetime of a reference 'the 
>>> instance' is fixed over a point in the
>>> stdlib/public/core/Unmanaged.swift-  /// programm if:
>> 
>> Those latter two are in stdlib-internal declarations. I think I have the 
>> same objection with using the term for 'unsafelyUnwrapped'.
> 
> Well, we can say "A program has undefined behavior if it does X or Y", or we 
> can say "A program which does X or Y lacks type safety".  In all cases we are 
> referring to a concept defined elsewhere.  If we say "undefined behavior", we 
> are using an easily-googled term whose popular discussions will quickly 
> inform the reader of the consequences of the violation.  If we say "type 
> safety", we are using a term with that's popularly used in very vague, 
> hand-wavey ways and whose consequences aren't usually discussed outside of 
> formal contexts.  If we say "memory safety", we're using a term that doesn't 
> even have that precedent.  So we can use the latter two terms if we want, but 
> that just means we need to have a standard place where we define them and 
> describe the consequences of violating them, probably with at least a 
> footnote saying "this is analogous to the undefined behavior rules of C and 
> C++".

In other places where the standard library intentionally has undefined 
behavior, it looks like we use the term "serious programming error", for 
instance in the the doc comment for `assert`:

/// * In -Ounchecked builds, `condition` is not evaluated, but the
///   optimizer may assume that it *would* evaluate to `true`. Failure
///   to satisfy that assumption in -Ounchecked builds is a serious
///   programming error.

which feels a bit colloquial to me, and doesn't provide much insight into the 
full consequences of UB. I think we're better off using an established term.

-Joe
_______________________________________________
swift-dev mailing list
swift-dev@swift.org
https://lists.swift.org/mailman/listinfo/swift-dev

Reply via email to