/
Automatically Verifying and Reproducing Event-Based Races i Automatically Verifying and Reproducing Event-Based Races i

Automatically Verifying and Reproducing Event-Based Races i - PowerPoint Presentation

yoshiko-marsland
yoshiko-marsland . @yoshiko-marsland
Follow
394 views
Uploaded On 2017-06-04

Automatically Verifying and Reproducing Event-Based Races i - PPT Presentation

Yongjian Hu Iulian Neamtiu Arash Alavi Rise of EventDriven Systems Mobile apps Web apps 2 Eventbased races are prevalent and may cause harmful result crash incorrect results etc ID: 555833

event race races thread race event thread races runnable benign state based mrunnable nrunningloader amp public run void android

Share:

Link:

Embed:

Download Presentation from below link

Download Presentation The PPT/PDF document "Automatically Verifying and Reproducing ..." is the property of its rightful owner. Permission is granted to download and print the materials on this web site for personal, non-commercial use only, and to display it on your personal computer provided you do not modify the materials and that you retain all copyright notices contained in the materials. By downloading content from our website, you accept the terms of this agreement.


Presentation Transcript

Slide1

Automatically Verifying and Reproducing Event-Based Races in Android Apps

Yongjian Hu Iulian Neamtiu Arash AlaviSlide2

Rise of Event-Driven Systems

Mobile apps

Web apps

2

Event-based races are prevalent and may cause harmful

result: crash, incorrect results, etc.Slide3

Outline

Motivation of Event-Based RaceMost prevalent concurrency errors in Android [Maya et al., PLDI’14, etc.]

Prior Work of Event-Based Race DetectorsImprecise: mostly false positives & benign races

Not able to reproduce the raceOur Approach: ERVA

Replay based approach to verify race

Event flipping to alternate schedule

Filter benign races by state comparison

Experiment

Result

3

% true positive harmful races in out workSlide4

Example of Event-Based Race

Syncing…

Done!

BackSlide5

Example of Event-Based Race

Syncing…

Back

Crash!Slide6

State-of-art Race Detectors for Event Driven Systems

Web ApplicationsWebRacer, PLDI’12EventRacer for JavaScript, OOPSLA’13Mobile Applications(Android)

DroidRacer, PLDI’14CAFA, PLDI’14EventRacer for Android, OOPSLA’15

Instrumented

Framework

App Execution

Happens Before Graph Building

Race Detection

Report Filtering

and GenerationSlide7

Limitation of State-of-art Race Detector

False positivesDroidRacer: FP rate is 63%CAFA: FP rate is 21.7%, benign rate 27.8%EventRacer

reduces FP by race coverage, but still have FPs in our experiment Cannot distinguish between harmful &benign racesManual efforts to check the race report

Cannot reproducing racesSlide8

False Positive Type 1:

Imprecise

Android Model

EventRacer

reports a harmful race in

AnyMemo’s

RecentListFragment

Looper

Thread

onCreateView

() {

mHandler

= new Handler();

mAdapter

= new

ArrayAdapter

();

}

onResume

() {

Thread

thrd

= new Thread() {

public void run() {

// query database operation

mHandler.post

(new Runnable() {

public void run() {

mAdapter.clear

();

for (

RecentItem

ri

: database)

mAdapter.insert

(

ri

);

}

});

}

}

thrd.start

();

}

Thread

onCreateView

onResume

RunnableSlide9

False Positive Type 2:

Implicit

Happens-Before Relation

One race reported in

CoolReader

app’s

CoolReaderActivity

[

CoolReaderActivity.java

]

onStart

() {

waitForCRDService(new Runnable() {

public void run() { Service.getHistory().loadFromDB

(…);

……

new

CRRootView

(…);

}

});

}

[

History.java

]

onRecentBookListLoaded

(List list) {

mBooks

= list;

}

[

History.java

]

getOrLoadRecentBooks

(…) {

if (

mBooks

!= null &&

mBooks.size

() > 0)

// update

mBooks

.

}

post(Runnable r)

post(Runnable r)

Looper

Thread

onStart

onRecentBookListLoaded

getOrLoadRecentBooks

Atomicity

Delayed post time = 0

Delayed post time = 0Slide10

Benign Race Type 1:

Ad-hoc

Synchronization

One race reported in Volley HTTP library

public class

ImageLoader

{

private Handler

mHandler

= new Handler();

private Runnable

mRunnable

;

private void

batchResponse

(…) {

if (

mRunnable

== null) {

mRunnable

= new Runnable() {

public void run() {

// deliver batched request

mRunnable

= null;

}

}

mHandler.post

(

mRunnable

);

}

}

}

Looper

Thread

batchResponse

Runnable.run

()

batchResponse

Benign race: read/write access protected by the

control flowSlide11

Benign Race Type 2:

No

External Visible State Difference

One race reported in

AnyMemo

app’s

QACardActivity

startLoading

() {

for (Loader loader :

mLoaders

) {

loaderManager.initLoader

(loader);

nRunningLoader

++;

}

}

checkAllLoaderCompleted

() {

nRunningLoader

--;

if (

nRunningLoader

<= 0) {

onAllLoaderComplete

();

}

}

checkAllLoaderCompleted

() {

nRunningLoader

--;

if (

nRunningLoader

<= 0) {

onAllLoaderComplete

();

}

}

Thread-1

Thread-2

onLoadFinished

onLoadFinished

Benign race: no state differenceSlide12

Our

Approach ERVA: Event-race Reproducer and Verifier for Android

App

Input capture

Race Report

Instrumented platform

(emulator)

Event

Racer

Event capture

Input log

EDG

Replay platform

(emulator or phone)

Input replay

Event flipping

Race detection phase

Race verification phase

False positive

Benign

race

Harmful

race

single execution

multiple executions

App state comparisonSlide13

ERVA Details

Input Capture and ReplayInput, sensors, IPC, threading events are captured by VALERA(OOPSLA’15)Event Dependency Graph(EDG)

Causal relationship between events (strong HB relations)Event Flipping

Leverage VALERA’s deterministic schedule replayUser defined order of event execution which is allowed by EDG

State Recording and Comparison

Externally visible state(EVS)

EVS = All GUI states(layout

& contents

) + shared preference data

EVS is extensible to dump customized state

Race VerificationSlide14

Race Verification: FP Race Type 1

Looper

Thread

onCreateView

() {

mHandler

= new Handler();

mAdapter

= new

ArrayAdapter

();

}

onResume

() {

Thread

thrd

= new Thread() {

public void run() {

// query database operation

mHandler.post

(new Runnable() {

public void run() {

mAdapter.clear

();

for (

RecentItem

ri

: database)

mAdapter.insert

(

ri

);

}

});

}

}

thrd.start

();

}

Thread

onCreateView

onResume

Runnable

Dead lock!!!Slide15

Race Verification: FP

Type 2[CoolReaderActivity.java]

onStart() { waitForCRDService

(new Runnable() { public void run() {

Service.getHistory

().

loadFromDB

(…);

……

new CRRootView(…); } });

}[History.java]onRecentBookListLoaded

(List list) { mBooks = list;}

[History.java

]

getOrLoadRecentBooks

(…) {

if (

mBooks

!= null &&

mBooks.size

() > 0)

// update

mBooks

.

}

post1(Runnable r1, delay1=0)

post2(Runnable r2, delay2=0)

Looper

Thread

onStart

onRecentBookListLoaded

getOrLoadRecentBooks

Analyze the trace

post1 < post2

&&

delay1

==

delay2Slide16

Race Verification: Benign Type 1

One race reported in Volley HTTP library

public class

ImageLoader

{

private Handler

mHandler

= new Handler();

private Runnable

mRunnable

;

private void

batchResponse

(…) {

if (

mRunnable

== null) {

mRunnable

= new Runnable() {

public void run() {

// deliver batched request

mRunnable

= null;

}

}

mHandler.post

(

mRunnable

);

}

}

}

Looper

Thread

batchResponse

Runnable.run

()

batchResponse

Flippable

Different branch condition executed in flipped schedule

R

acy read write disappear in new scheduleSlide17

Race Verification: Benign Type 2

One race reported in

AnyMemo

app’s

QACardActivity

startLoading

() {

for (Loader loader :

mLoaders

) {

loaderManager.initLoader

(loader);

nRunningLoader

++;

}

}

checkAllLoaderCompleted

() {

nRunningLoader

--;

if (

nRunningLoader

<= 0) {

onAllLoaderComplete

();

}

}

checkAllLoaderCompleted

() {

nRunningLoader

--;

if (

nRunningLoader

<= 0) {

onAllLoaderComplete

();

}

}

Thread-1

Thread-2

onLoadFinished

onLoadFinished

Flippable

External visible state dumping and comparison

Benign race: no state differenceSlide18

Experimental Result

High priority: races in app code

Normal priority: races in framework but invoked from appSlide19

Related Work

Race DetectionMulti-threaded racesVarious works: static, dynamic or hybrid approachesEvent-based races

Web apps: WebRacer, EventRacer

Mobile apps: DroidRacer, CAFA, EventRacer

Android

Race Classification

Multi-threaded races

Instruction-level replay,

Narayanasamy

et al., PLDI’07

Symbolic execution, Kasikci et al., ASPLOS’12Slide20

Related Work

Model checking for event driven systemsSystematically explore all schedules for find concurrency errorsR4: OOPSLA’16, for web applications

Dynamic partial order reduction + bounded conflict reversalAsyncDroid: CAV’15, for Android applications

Delay-bounded prioritized systematic explorationModel checking may have scalability problemsHuge number of events, exponential schedules

EVRA can help model checkers

Use EDG to filter unreachable schedules

Use EVS to verify harmful and benign racesSlide21

Conclusions

Event-based racesMost prevalent concurrency errorsPrior works on event-based race detectorsImprecise, mostly false positives & benign racesNot able to reproduce races

Our approach: ERVAReplay based approach to verify raceEvent flipping to alternate schedule

Filter benign races by state comparisonExperiment result3% true positive harmful racesSlide22

Thanks!Slide23

Android Event Handling

UI Thread

Looper

msg

evt

Message Queue

Thread

Thread

Handler

Handler

msg

Hardware EventsSlide24

UI Thread

Looper

Message Queue

A

B

C

D

Event Log

1

2

3

4

Deterministic Event Schedule: RecordingSlide25

UI Thread

Looper

Message Queue

Pending Queue

B

D

C

A

Deterministic Event

Schedule: Replaying

A

B

C

D

Event Log

1

2

3

4

Controller =

1

2

4

3

Reconciling different event orders between record and replay