iOS8短信收件人处理Unicode组合字时crash分析

今天Naville给我发来一条QQ,

在信息应用中编辑新信息的时候,收件人一栏如果使用系统自带的手写输入法,在输入一横中间加上一撇以后,信息应用必定闪退
无论是iPhone 6 Plus,亦或是iPhone 5s,只要系统是iOS 8版本以上,都会出现这个Bug

于是我果断去实验了一下,还真的会闪退。可以知道的是,写下来这个字应该是
屏幕快照 2014-12-05 下午8.44.19

 

(本来想直接打这个字 ud840udc87 的,结果WordPress也被这个字玩坏了,中文还真是厉害啊>ω</)分析如下

估计的原因如下,因为这个字是双字节Unicode字符,而短信程序要检查收件人是否开启了iMessage功能,需要拿收件人的length,但是

屏幕快照 2014-12-05 下午8.57.47

返回的结果却是2,于是,悲剧注定要发生了。可以想象发生了这样的事:

*** Terminating app due to uncaught exception 'NSRangeException', reason: '*** -[__NSCFConstantString substringFromIndex:]: Index SOME_INTEGER out of bounds; string length 2'

验证

找到另一个双字节Unicode汉字( ud840udc89 )

屏幕快照 2014-12-05 下午8.54.47

 

果然,也闪退了.

Device Log

Dec 5 20:17:38 ReportCrash[15071] <Notice>: Saved report to /var/mobile/Library/Logs/CrashReporter/MobileSMS_2014-12-05-201738_Ryza.ips
Dec 5 20:17:38 SpringBoard[6351] <Warning>: Application 'UIKitApplication:com.apple.MobileSMS[0xd78a]' crashed.

Crash Reporter

CrashReporter_SMS

Leave a Reply

Your email address will not be published. Required fields are marked *

seventeen − twelve =