swiftlang / swift-corelibs-foundation

The Foundation Project, providing core utilities, internationalization, and OS independence
swift.org
Apache License 2.0
5.29k stars 1.14k forks source link

[SR-13270] NSRegularExpression.numberOfMatches() with bad range doesn't fail #3976

Open swift-ci opened 4 years ago

swift-ci commented 4 years ago
Previous ID SR-13270
Radar None
Original Reporter NPAssoc (JIRA User)
Type Bug
Environment Raspian Linux Swift version 5.1.5-v0.1
Additional Detail from JIRA | | | |------------------|-----------------| |Votes | 0 | |Component/s | Foundation | |Labels | Bug | |Assignee | None | |Priority | Medium | md5: 957478105529dab8d74d9fcb73634dae

Issue Description:

Given a regular expression like:

let testExp = try! NSRegularExpression(pattern: "(^| /) .", options: [])

The code:

let ss = "/Pairs Series/._Chair15.jpg"

let tRange = NSMakeRange(0, ss.count + 2)

let matches = testExp.numberOfMatches(in: ss, options: [], range: tRange)

fails on the Mac with: '...Range or index out of bounds'

but works under Raspian returning 0 matches.

Under Raspian, it should either fail or return 1 match.

benrimmington commented 4 years ago

When given an invalid range, the internal prepareRegularExpression function returns NULL, which results in a silent failure with zero matches. I'm not sure if this behavior is considered a bug.

Note that your ss.count example gives the number of characters (extended grapheme clusters), but NSRegularExpression needs an NSRange of UTF-16 code units.

let tRange = NSRange(location: 0, length: ss.utf16.count)
let tRange = NSRange(ss.startIndex..., in: ss)