> On May 20, 2016, at 7:56 AM, Chris Lattner <clatt...@apple.com> wrote:
> On May 12, 2016, at 4:03 PM, John McCall via swift-dev <swift-dev@swift.org> 
> wrote:
> 
>>>> On May 12, 2016, at 3:21 PM, Joe Groff <jgr...@apple.com> wrote:
>>>>> 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.
>> 
>> Agreed.
>> 
>> Do we have a good place to document common terms?  Preferably one that isn't 
>> a book?
> 
> We cite Wikipedia in the stdlib doc comments, why can't we cite TSPL, and put 
> the detailed discussion there?

I don't feel comfortable editing TSPL.  Should I?

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

Reply via email to