Detecting Non-crashing Functional Bugs in Android Apps via Deep-State Differential Analysis
Non-crashing functional bugs of Android apps can seriously affect user experience.
Often buried in rare program paths, such bugs are difficult to detect but lead to severe consequences.
Unfortunately, very few automatic functional bug oracles for Android apps exist, and they are all specific to limited types of bugs.
In this paper, we introduce a novel technique named deep-state differential analysis, which brings the classical "bugs as
deviant behaviors" oracle to Android apps as a generic automatic test oracle.
Our oracle utilizes the observations on the execution of automatically generated test inputs that
(1) there can be a large number of traces reaching internal app states with similar GUI layouts, and only a small portion of them would reach an erroneous app state, and
(2) when performing the same sequence of actions on similar GUI layouts, the outcomes will be limited.
Therefore, for each set of test inputs terminating at similar GUI layouts, we manifest comparable app behaviors by appending the same events to these inputs, cluster the manifested behaviors, and identify minorities as possible anomalies.
We also calibrate the distribution of these test inputs by a novel input calibration procedure, to ensure the distribution of these test inputs is balanced with rare bug occurrences.
We implemented the deep-state differential analysis algorithm as an exploratory prototype Odin and evaluated it against 17 popular real-world Android apps.
Odin successfully identified 28 non-crashing functional bugs
(five of which were previously unknown) of various root causes with reasonable precision.
Detailed comparisons and analyses show that a large fraction (11/28) of these bugs cannot be detected by state-of-the-art techniques.