connglli / ELEGANT

ELEGANT - a tool to Effectively LocatE fraGmentAtion-iNduced compaTibility issues.
MIT License
3 stars 0 forks source link

weekly report: 2018.03.28-2018.04.04 #17

Closed connglli closed 6 years ago

connglli commented 6 years ago

周报

测试结果

这周除了邮件中列出的几点工作外,还对现在的版本(branch: counterpart, revision: 3045bdb)进行了测试,测试主要从几个方面下手:

  1. detection 阶段后每个 App 可以检测到的 FIC Issues 数目(以 api/call-sites/call-chains 个数表示,每条 api 会有多个 call sites 对他进行调用,而每处 call site 又会形成更多的 call chain,因此 api < call-sites < call-chains)
  2. validation 阶段后每个 App 可以检测到的 FIC Issues 数目。
  3. 每个 App 报出的 FIC Issues 有多少 TP,多少 FP。
  4. 对目前构建成功的 15 (实际计算中只有 14 个,其中一个 PocketHub 有问题,没列入计算) 个 App,validation 阶段有多高的剪枝率。
  5. 对目前构建成功的 15 个 App,总共检测到的 FIC Issues 数目是多少,误报率多高。

下表为针对上述指标所列的表:

APP DETECTED VALIDATED TP FP TOTAL
1Sheeld 4/17/21 4/17/21 3/14/17 1/3/4 4/17/21
BankDroid 4/11/19 3/10/18 2/9/11 1/1/7 3/10/18
AnkiDroid 7/28/455 4/23/198 2/14/183 2/9/15 4/23/198
AntennaPod 5/27/164 5/19/39 2/14/33 3/5/6 5/19/39
AnySoftKeyboard 3/21/86 2/18/45 2/18/45 0/0/0 2/18/45
ConnectBot 2/3/4 2/3/4 2/3/4 0/0/0 2/3/4
Conversations-free
Conversations-playstore
3/6/58
3/6/58
2/3/42
2/3/42
2/3/42
2/3/42
0/0/0 2/3/42
2/3/42
IrssiNotifier-free
IrssiNotifier-pro
3/7/31
3/7/31
2/6/24
2/6/24
1/5/21
1/5/21
1/1/3
1/1/3
2/6/24
2/6/24
K-9 Mail 4/13/26 4/13/26 4/7/14 0/6/12 4/13/26
Kore 2/12/32 2/12/32 1/11/30 1/1/2 2/12/32
PactrackDroid 1/2/11 1/1/1 1/1/1 0//0/0 1/1/1
PocketHub 1/2/5 1/1/1 ? ? 1/1/1
QKSMS-noAnalysis
QKSMS-withAnalysis
3/6/20
3/6/20
3/3/11
3/3/11
2/2/9
2/2/9
1/1/2
1/1/2
3/3/11
3/3/11
Transdroid-lite
Transdroid-full
2/8/48
2/8/48
2/6/16
2/6/16
1/4/4
1/4/4
1/2/12
1/2/12
2/6/16
2/6/16
WordPress-vanilla
WordPress-wasabi
WordPress-zalpha
3/41/227
3/41/227
3/41/227
3/31/55
3/31/55
3/31/55
2/14/32
2/14/32
2/14/32
1/17/23
1/17/23
1/17/23
3/31/55
3/31/55
3/31/55
TOTAL 46/202/1202 39/165/532 27/119/423 12/46/109 39/165/532
RATE CUT
RATE
0.152/0.183/0.557 FP
RATE
0.307/0.279/0.205  

测试结果解读

从上表可以看出,对这 15 个 App(实际只有 14 个参与计算,PocketHub 没参与)

  1. detection 阶段共报出 46/202/1202 个 FIC Issues,经过 validation 阶段后,剩下 39/165/532 个,剪枝率为 0.152/0.183/0.557。
  2. 对最后(validation 阶段后)报出的 39/165/532 个 FIC Issues,其中 TP 有 27/119/423 个,FP 有 12/46/109 个,误报率为 0.307/0.279/0.205。

测试结果分析

回看 Lili 论文中所做的实验,针对上述 14 个 App,Lili 共发现了 21 个 FIC Issues(这里我假设为 api 数量),其中有 3 个 FP,误报率 0.143。可见,当前版本(branch: counterpart, revision: 3045bdb)能够发现更多的 Issues,但误报率也更高。下面总结了一些好与不好的原因:

  1. 能够报出更多的 Issues
    1. 两个实验使用的 acpairs 数目和种类不同,这可能是其中的原因之一。
    2. 在搜索 call-site 的过程中,不仅使用了所有的 class,也使用了内置的 call graph,内置的 call graph 在构造的时候做了 OOP 的 CHA,所以可以发现更多的问题。
    3. 利用到了 call-chain,call-chain 所带来的好处就是:(1) 如果开发者意识到了某个 API 的问题,但却仅仅在某些地方进行了 fix,Lili 的方法就无法进行检测(Lili 的方法会认为被 fix 掉了,而实际上还有其他的 call-chain 没被 fix)。
  2. 误报率更高
    1. 其中有些显而易见的问题,因为 slicing 不足而没有发现。如利用 if-else 而 fix 掉的 issue(这里说明一点,因为现在的版本使用了内置的 icfg,所以摒弃了之前周报中提到的专门针对 if-else 的比较 “狭隘” 的分析,相关的分析在 master 分支中仍然存在,但是现在我觉得这种分析继续下去会没完没了,后续是否再次加入还待考虑)
    2. 报告出了一些第三方库代码所引起的 Issues,因为所有的代码(无论是库代码还是 App 代码)都会被集成到 apk 中,所以第三方库中的代码也会被 Soot 分析。而目前的版本针对第三方库的代码用到的方式仅仅是黑名单,而黑名单里只能加入一些常用的第三方库。这种方式的问题就在于,(1) 每发现一个三方库,就得加入进去,麻烦;(2) 对于一些第三方库的组织所做的 App,它们(这些 App)与第三方库共享包名前缀,从而导致这些 App 无法被分析(这也是 PocketHub 无法被正确分析的原因,因为他用了 com.github)这个包前缀,这个前缀也正是很多很多 github 官方常用三方库的包前缀。
    3. 我在 ApiContext Model 中引入了 “important” 机制(这在上次的周报中已经提到了),使用了 “important” 的 acpair,只要 detect 到,直接报出,而不会经过 validate 阶段。引入这种机制考虑到的是,有些 acpair 是语义相关,这种 acpair 无法通过对代码的检测(validation 阶段)而得到任何有用的信息,而 validation 阶段又是费时的,所以直接报出来提醒开发者注意这样的问题才是更好的选择。与之相关的有 (1) AlarmManager.set 这个 API,根据官方文档,无法设置精确的时间,但使用这个 API 的开发者到底是真的需要精确的时间还是仅仅需要一个 App 特定的推动时间我们不可知,代码不可知,因此需要 "important";(2) AsynTask.execute 这个 API,根据官方文档,无法真正的实现并行化,而是一个串行化的操作,同 (1) 一样,开发者是否真的需要并行也是代码不可知的,因此需要 "important";(3) …
    4. 有些 API 真的一定 会在某些设备上引发问题,但却是代码不可知的(这种与 (3) 的区别在于,(3) 中所提到的 API 不一定 会引发问题),如 AppCompatActivity.setSupportActionBar,这个 API 会在三星 Galaxy 上引发问题,但解决方式是利用 proguard 配置文件,而不是代码。

其实误报率里的水分(有偏高的水分也有偏低的水分)很大一部分原因就是上述提到的 2/3/4,ELEGANT 把他们直接报告了出来,而实际上并不一定是开发者实际的(语义)需求。下面我也把这 15 个 App 所报出的 FIC Issues 的 API 进行了 TP 和 FP 的汇总,并列出了报告为 FP 的原因。其中 :white_check_mark: 表示 TP,:exclamation: 表示 FP,:question: 表示 TP 和 FP 都有(针对这种,我把它列为了 TP),同时列出了新发现(和目前版本已经有的)的一些第三方包。(我在考虑能不能找到一些 3rd party libs elimination 的工具进行集成)

If, in some api, some call sites of it are fixed while others are not, we classify it into TP.

  1. 1Sheeld
    • :exclamation::exclamation: TextToSpeech.setOnUtteranceProgressListener => fixed using if (Build.VERSION.SDK_INT >= 15)
    • :white_check_mark: AsyncTask.execute
    • :white_check_mark: AlarmManager.set
    • :question: Resources.getDrawable => 3rd-party libs: 2 (com.facebook, com.handmark)
  2. BankDroid
    • :white_check_mark: Activity.onKeyDown
    • :exclamation: AppCompatActivity.setSupportActionBar => fixed in proguard-rules.pro
    • :white_check_mark: AsyncTask.execute
  3. AnkiDroid
    • :white_check_mark: Activity.onKeyDown
    • :exclamation::exclamation: TextToSpeech.setOnUtteranceProgressListener => fixed using class hierarchy
    • :exclamation: AppCompatActivity.setSupportActionBar => fixed in proguard-rules.pro
    • :white_check_mark: AsyncTask.execute
  4. AntennaPod
    • :exclamation: AppCompatActivity.setSupportActionBar => fixed in proguard-rules.pro
    • :exclamation::exclamation: AsyncTask.executeOnExecutor => fixed using if (Build.VERSION.SDK_INT >= 15)
    • :white_check_mark: AsyncTask.execute
    • :white_check_mark: AlarmManager.set
    • :exclamation: Resources.getDrawable => 3rd-party libs: 1 (com.viewpagerindicator)
  5. AnySoftKeyboard
    • :white_check_mark: AsyncTask.execute
    • :white_check_mark: Resources.getDrawable
  6. ConnectBot
    • :white_check_mark: MenuItem.setShowAsAction
    • :white_check_mark: AsyncTask.execute
  7. Conversations
    • :white_check_mark: KeyChain.getPrivateKey
    • :white_check_mark: AlarmManager.set
  8. IrssiNotifier
    • :white_check_mark: AsyncTask.execute
    • :exclamation: Activity.getActionBar => 3rd-party libs: 1 (com.actionbarsherlock)
  9. K-9 Mail
    • :white_check_mark: Activity.onKeyDown
    • :white_check_mark: KeyChain.getPrivateKey
    • :white_check_mark: AlarmManager.set
    • :question: Resources.getDrawable => 3rd-party libs: 6 (com.handmark, com.bumptech, org.openintents)
  10. Kore
    • :white_check_mark: AppCompatActivity.setSupportActionBar
    • :exclamation: Resources.getDrawable => 3rd-party libs: 1 (com.melnykov)
  11. PacktrackDroid
    • :white_check_mark: ConnectivityManager.getBackgroundDataSetting
  12. PocketHub
    • ==com.github was regarded as a 3rd party, so data here is not reliable==
  13. QKSMS
    • :white_check_mark: AppCompatActivity.setSupportActionBar
    • :white_check_mark: AlarmManager.set
    • :exclamation: Resources.getDrawable => 3rd-party libs: 1 (com.melnykov)
  14. Transdroid
    • :white_check_mark: AppCompatActivity.setSupportActionBar
    • :exclamation: Resources.getDrawable => 3rd-party libs: 2 (com.getbase)
  15. WordPress
    • :exclamation: AppCompatActivity.setSupportActionBar => fixed in proguard.cfg
    • :white_check_mark: ContentValues.put
    • :question: Resources.getDrawable => 3rd-party libs: 2 (com.helpshift)

newly found 3rd party libs list

"com.handmark",           // Android Pull-to-Refresh
"com.facebook",           // facebook related sdk
"com.bumptech",           // glide
"com.viewpagerindicator", // ViewPager related
"com.actionbarsherlock",  // ActionBar related
"org.openintents",        // Intent related
"com.melnykov",           // FloatingActionButton related
"com.helpshift"           // help shift android sdk

embedded 3rd party libs list

"android",          // android official
"java",             // java official
"com.jakewharton",  // butterknife
"com.github",       // github related, glide, etc.
"com.squareup",     // okhttp, retrofit, etc.
"com.google",       // google related, gson, guava, etc.
"com.crashlytcics", // firebase
"org.omg",          // extends to java
"org.w3c",          // extends to java
"org.xml",          // extends to java
"org.apache",       // apache organization
"com.sun",          // sun
"org.eclipse",      // eclipse
"rx"                // reactivex java