[swift-dev] quick, spot the UB in this code:

Drew Crawford drew at sealedabstract.com
Wed Apr 6 23:16:44 CDT 2016


let completeFile = [112, 114, 105, 110, 116, 40, 34, 104, 101, 108, 108, 111, 32, 119, 111, 114, 108, 100, 34, 41]
let str = String(validatingUTF8: completeFile)

Did you see it?  No?

What if our bytes are not UTF8?  Well, one would hope that the constructor, um, validates them.

Turns out it does validate them, *but only if the bytes are null-terminated*.  If they are not null-terminated, we get UB <https://github.com/apple/swift/blob/510f29abf77e202780c11d5f6c7449313c819030/stdlib/public/core/CString.swift#L41>.

IMO:

1.  If this constructor insists on null-terminated bytes, it should say so in the name (e.g. validatingNullTerminatedUTF8:), and it should crash deterministically if it gets non-terminated bytes, or
2.  It should not require null-terminated bytes

Drew



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-dev/attachments/20160406/d84c387b/attachment.html>


More information about the swift-dev mailing list