Bug 曝光台 知乎 Android 版本弱网或无网络条件下编辑问题时 Crash

xuxu · 2016年01月28日 · 最后由 securitytest 回复于 2017年09月26日 · 792 次阅读

平台:小米 4、Android 4.4
知乎版本:3.0.1
前置条件:弱网或者无网络

重现步骤:

  1. 进入知乎首页查看一个问题详情
  2. 弱网或者无网络条件下,在问题详情界面点击 Action Bar 中的菜单按钮,列表中会有一个选项为” 编辑问题 “
  3. 点击” 编辑问题 “

结果:应用停止运行,必现。

日志信息:

01-28 09:41:18.153 D/AndroidRuntime(14064): Shutting down VM
01-28 09:41:22.163 E/AndroidRuntime(14064): FATAL EXCEPTION: main
01-28 09:41:22.163 E/AndroidRuntime(14064): Process: com.zhihu.android, PID: 14064
01-28 09:41:22.163 E/AndroidRuntime(14064): java.lang.IllegalArgumentException: String input must not be null
01-28 09:41:22.163 E/AndroidRuntime(14064):     at org.jsoup.helper.Validate.notNull(Validate.java:26)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at org.jsoup.parser.TreeBuilder.initialiseParse(TreeBuilder.java:26)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at org.jsoup.parser.TreeBuilder.parse(TreeBuilder.java:42)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at org.jsoup.parser.HtmlTreeBuilder.parse(HtmlTreeBuilder.java:53)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at org.jsoup.parser.Parser.parse(Parser.java:89)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at org.jsoup.Jsoup.parse(Jsoup.java:58)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at com.zhihu.android.app.ui.fragment.k.b.c(QuestionOldEditFragment.java:1633)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at com.zhihu.android.app.ui.fragment.k.b.k(QuestionOldEditFragment.java:544)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at com.zhihu.android.app.ui.fragment.k.b.g(QuestionOldEditFragment.java:487)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at com.zhihu.android.app.ui.fragment.k.b.onViewCreated(QuestionOldEditFragment.java:299)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at android.support.v4.app.q.a(FragmentManager.java:1086)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at android.support.v4.app.q.a(FragmentManager.java:1248)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at android.support.v4.app.h.run(BackStackRecord.java:738)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at android.support.v4.app.q.h(FragmentManager.java:1613)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at android.support.v4.app.q$1.run(FragmentManager.java:517)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at android.os.Handler.handleCallback(Handler.java:733)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at android.os.Handler.dispatchMessage(Handler.java:95)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at android.os.Looper.loop(Looper.java:136)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at android.app.ActivityThread.main(ActivityThread.java:5072)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at java.lang.reflect.Method.invokeNative(Native Method)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at java.lang.reflect.Method.invoke(Method.java:515)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:609)
01-28 09:41:22.163 E/AndroidRuntime(14064):     at dalvik.system.NativeStart.main(Native Method)
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 13 条回复 时间 点赞

欢迎回来

#1 楼 @doctorq 貌似是解析 html 结构的时候没有判断为空. 这类问题通过静态代码分析工具可以批量找出来.

#2 楼 @seveniruby 他这个是还没提交编辑就出问题了,应该是逻辑问题

#3 楼 @doctorq 出问题的堆栈是 jsoup 的 parse. 感觉是点击编辑文章的时候尝试解析某个模板, 但是某个模板的内容是空. 所以挂了.

xuxu #5 · 2016年01月28日 Author

@doctorq 16 年,得跟上你们的脚步~

#5 楼 @xuxu 欢迎的欢迎的

不做非空判断么-_-#

我遇到过类似的问题,由于掉包数据包解析异常导致崩溃。

#7 楼 @kasi 非空判断研发经常偷懒. 或者想不到. 很多输入都容易被干扰的. 感觉得靠一些代码扫描分析才能找出来.

#9 楼 @seveniruby 这边碰到多这种场景 某 api 在 A 系统如果 null 直接抛异常,在 B 系统 返回 null.开发做了 try 没有做非空,因为测试不到位.

#10 楼 @dongdong try 不是好习惯, 判断为 null 比较好. 我们这边也在用 try. 但是实际上异常已经发生了. 影响了业务逻辑. 只是没有表现的像 crash 那么猛烈而已. 一般的浏览还好, 但是如果是交易, 就会有麻烦. 有 try 仍然也要验证业务是否正确.
我最近也刚开始研究, 想找找有没有更好的方法直接批量的找出这些问题. 不能纯靠人工或者肉眼 review

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册