[swift-users] Runtime crash caused by (NS)CharacterSet.hasMember?

Jens Persson jens at bitcycle.com
Tue Jun 13 15:12:46 CDT 2017


Thanks!

The documentation that Xcode displays (for CharacterSet's hasMember(inPlane
plane:)) is as follows:

Declaration:
func hasMember(inPlane plane: UInt8) -> Bool

Description:
Returns true if the `CharacterSet` has a member in the specified plane.
This method makes it easier to find the plane containing the members of the
current character set.
The Basic Multilingual Plane (BMP) is plane 0.

Parameters:
plane - No description

Which is about the same as here:
https://developer.apple.com/documentation/foundation/characterset/1779728-hasmember
and here:
https://developer.apple.com/documentation/foundation/nscharacterset/1412406-hasmemberinplane

No where does it mention anything about undefined behavior for some values
of plane.

In order to find that crucial info, I'd have to do what you did, write it
in Objective C and dig through the stack trace, or just guess that it
calls CFCharacterSetHasMemberInPlane
and that its documentation contains very valuable pieces of information
that for some reason got lost on the way to NSCharacterSet's method
hasMemberInPlane ...

Kind of makes one wonder what other undocumented undefined behavior might
hide in Foundation and other places.

/Jens




On Tue, Jun 13, 2017 at 7:14 PM, Doug Hill via swift-users <
swift-users at swift.org> wrote:

> I tried your calls to NSFont in Objective-C, and it also crashes. Looking
> at the stack trace, I see that it crashes in CFCharacterSetHasMemberInPlane.
> I see documentation for thePlane parameter of this function says:
>
> The valid value range is from 0 to 16.  If the value is outside of the
> valid plane number range, the behavior is undefined.
>
> I guess randomly crashing counts as undefined behavior.
> While it would be great if this function was more robust, Apple is
> definitely saying Don’t Do That.
>
> Doug Hill
> https://github.com/djfitz/SFFontFeatures
>
>
> On Jun 13, 2017, at 9:42 AM, Jens Persson via swift-users <
> swift-users at swift.org> wrote:
>
> PS
> There are only 17 planes in the (current?) Unicode standard, but I'm
> assuming that the CharacterSet.hasMember(inPlane:) shouldn't (randomly?)
> crash for UInt8 values other than 0 ... 16?
> It also seems strange that it reproducibly crashes or not depending on
> which specific font I use.
>
>
> On Tue, Jun 13, 2017 at 4:00 PM, Jens Persson <jens at bitcycle.com> wrote:
>
>> The below program demonstrates a possible bug that I encountered.
>> Can anyone else reproduce my results (as explained in the comments)?
>> If so, is it a Swift or Cocoa bug (I haven't tried it in Objective C)?
>>
>> import AppKit
>>
>> extension NSFont {
>>     var planesWithMembers: [UInt8] {
>>         return (UInt8(0) ... UInt8(255)).filter {
>>             // The follwing line will crash (EXC_BAD_ACCESS) for some
>> fonts:
>>             coveredCharacterSet.hasMember(inPlane: $0)
>>             // I have tested it with Xcode 8.3.3 and Xcode 9 beta 1, both
>>             // Swift 3 and 4, and they all reproduce the crash.
>>             // macOS 10.12.5
>>         }
>>     }
>> }
>>
>> // Examples that will not cause the crash:
>> // let fontName = "AlBayan"
>> // let fontName = "AppleBraille"
>> // let fontName = "Chalkboard"
>> // let fontName = "Helvetica"
>> // let fontName = "Zapfino"
>>
>> // Examples that will cause the crash:
>> // let fontName = "AppleColorEmoji"
>> // let fontName = "AppleSymbols"
>> let fontName = "Baskerville"
>> // let fontName = "Geneva"
>> // let fontName = "SnellRoundhand"
>>
>> let font = NSFont(name: fontName, size: 12)!
>> let result = font.planesWithMembers
>> print("Planes that contains members:", result)
>>
>>
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
>
>
>
> _______________________________________________
> swift-users mailing list
> swift-users at swift.org
> https://lists.swift.org/mailman/listinfo/swift-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-users/attachments/20170613/ce678960/attachment.html>


More information about the swift-users mailing list