Skip to content

Commit 75aa32b

Browse files
author
molicechen
committed
4.4.2
1 parent 95c98d5 commit 75aa32b

File tree

2 files changed

+12
-9
lines changed

2 files changed

+12
-9
lines changed

QMUIKit/UIKitExtensions/QMUIStringPrivate.m

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -160,7 +160,7 @@ + (void)qmuisafety_NSString {
160160

161161
// index 越界
162162
{
163-
BOOL isValidddatedIndex = index < selfObject.length;
163+
BOOL isValidddatedIndex = index <= selfObject.length;
164164
if (!isValidddatedIndex) {
165165
NSString *logString = [NSString stringWithFormat:@"%@ 传入了一个超过字符串长度的 index: %@,原字符串为: %@(%@)", NSStringFromSelector(originCMD), @(index), selfObject, @(selfObject.length)];
166166
NSAssert(NO, logString);
@@ -171,13 +171,15 @@ + (void)qmuisafety_NSString {
171171

172172
// 保护从 emoji 等 ComposedCharacterSequence 中间裁剪的场景
173173
{
174-
NSRange range = [selfObject rangeOfComposedCharacterSequenceAtIndex:index];
175-
BOOL isValidddatedIndex = range.location == index || NSMaxRange(range) == index;
176-
if (!isValidddatedIndex) {
177-
NSString *logString = [NSString stringWithFormat:@"试图在 ComposedCharacterSequence 中间用 %@ 裁剪字符串,可能导致乱码、crash。原字符串为“%@”(%@),index 为 %@,命中的 ComposedCharacterSequence range 为 %@", NSStringFromSelector(originCMD), selfObject, @(selfObject.length), @(index), NSStringFromRange(range)];
178-
NSAssert(NO, logString);
179-
QMUILogWarn(@"QMUIStringSafety", @"%@", logString);
180-
index = range.location;
174+
if (index < selfObject.length) {
175+
NSRange range = [selfObject rangeOfComposedCharacterSequenceAtIndex:index];
176+
BOOL isValidddatedIndex = range.location == index || NSMaxRange(range) == index;
177+
if (!isValidddatedIndex) {
178+
NSString *logString = [NSString stringWithFormat:@"试图在 ComposedCharacterSequence 中间用 %@ 裁剪字符串,可能导致乱码、crash。原字符串为“%@”(%@),index 为 %@,命中的 ComposedCharacterSequence range 为 %@", NSStringFromSelector(originCMD), selfObject, @(selfObject.length), @(index), NSStringFromRange(range)];
179+
NSAssert(NO, logString);
180+
QMUILogWarn(@"QMUIStringSafety", @"%@", logString);
181+
index = range.location;
182+
}
181183
}
182184
}
183185

QMUIKitTests/UIKitExtensions/NSStringTests.m

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ - (void)testStringSafety {
3333
NSString *string = @"A😊B";
3434

3535
XCTAssertNoThrow([string substringFromIndex:0]);
36-
XCTAssertThrows([string substringFromIndex:string.length]); // 越界的识别
36+
XCTAssertNoThrow([string substringFromIndex:string.length]); // 系统自身对 length 的参数做了保护,返回空字符串
37+
XCTAssertThrows([string substringFromIndex:5]); // 越界的识别
3738
XCTAssertNoThrow([string substringFromIndex:1]);
3839
XCTAssertThrows([string substringFromIndex:2]); // emoji 中间裁剪的识别
3940
XCTAssertNoThrow([string substringFromIndex:3]);

0 commit comments

Comments
 (0)