numerical static analysis of embedded software with
play

Numerical Static Analysis of Embedded Software with Interrupts - PowerPoint PPT Presentation

The 2016 Workshop on Static Analysis of Concurrent Software, Edinburgh, Scotland Numerical Static Analysis of Embedded Software with Interrupts Liqian Chen National University of Defense Technology, Changsha, China 11/09/2016 (Joint work with


  1. The 2016 Workshop on Static Analysis of Concurrent Software, Edinburgh, Scotland Numerical Static Analysis of Embedded Software with Interrupts Liqian Chen National University of Defense Technology, Changsha, China 11/09/2016 (Joint work with Xueguang Wu, Wei Dong, Ji Wang from NUDT, and Antoine Miné from UPMC)

  2. Overview • Motivation • Interrupt-driven programs (IDPs) • Sequentialization of IDPs • Analysis of sequentialized IDPs via abstract interpretation • Experiments • Conclusion 2

  3. Interrupts in Embedded Software • Interrupts are a commonly used technique that introduce concurrency in embedded software areaspace medical equipment automobile • Numerical static analysis to find • Data race detection run-time errors • too many false alarms • embedded software often contain intensive numerical computations • harmful or unharmful which are error prone 3

  4. Motivation • Without considering the interleaving, sequential program analysis results may be unsound int x, y, z; void ISR(){ void TASK(){ x++; if (x<y){ // ❶ y--; z = 1/(x-y); // ❷ return ; } } return ; } Interrupt semantics: Given x=1,y=3 , if ISR fires Sequential program analysis: no division-by-zero at ❶, ¡ there is a division- by-zero error at ❷ UNSOUND ! 4

  5. Our Goal • Goal • a sound approach for numerical static analysis of embedded C programs with interrupts • Challenges • analyzing source code rather than machine code (soundness) • interleaving state space can grow exponentially w.r.t. the number of interrupts (scalability) • interrupts are controlled by hardware (precision) • e.g., periodic interrupts, interrupt mask register (IMR) 5

  6. Basic Idea Sequential IDPs Seq Programs Numerical static analysis via abstract interpretation 6

  7. Overview • Motivation • Interrupt-driven programs (IDPs) • Sequentialization of IDPs • Analysis of sequentialized IDPs via abstract interpretation • Experiments • Conclusion 7

  8. Interrupt-Driven Programs • Our target interrupt-driven programs (IDPs) • an IDP consists of a fixed finite set of tasks and interrupts • tasks are scheduled cooperatively, while interrupts are scheduled preemptively by priority (on a unicore processor) 8

  9. Interrupt-Driven Programs • Model of interrupt-driven programs • 1 task + N interrupts • each interrupt priority with at most one interrupt • only 2 forms of statements accessing shared variables • l=g //read from a shared variable g • g=l //write to a shared variable g Expr := l | C | E 1 � E 2 (where l ∈ NV , C is a constant, E 1 , E 2 ∈ Expr and � ∈ { + , − , × , ÷} ) := l = g | g = l | l = e | S 1 ; S 2 | skip | enableISR ( i ) Stmt | disableISR ( i ) | if e then S 1 else S 2 | while e do S (where l ∈ NV , g ∈ SV , e ∈ Expr , i ∈ [1 , N ] , S 1 , S 2 , S ∈ Stmt ) := entry (where entry ∈ Stmt ) Task := � entry, p � (where entry ∈ Stmt , p ∈ [1 , N ]) ISR := Task � ISR 1 � . . . � ISR N Prog 9

  10. Interrupt-Driven Programs • Model of interrupt-driven programs • 1 task + N interrupts • each interrupt priority with at most one interrupt • only 2 forms of statements accessing shared variables • l=g //read from a shared variable g • g=l //write to a shared variable g Expr := l | C | E 1 � E 2 (where l ∈ NV , C is a constant, E 1 , E 2 ∈ Expr and � ∈ { + , − , × , ÷} ) := l = g | g = l | l = e | S 1 ; S 2 | skip | enableISR ( i ) Stmt | disableISR ( i ) | if e then S 1 else S 2 | while e do S (where l ∈ NV , g ∈ SV , e ∈ Expr , i ∈ [1 , N ] , S 1 , S 2 , S ∈ Stmt ) := entry (where entry ∈ Stmt ) Task This model simplifies IDPs without losing generality := � entry, p � (where entry ∈ Stmt , p ∈ [1 , N ]) ISR := Task � ISR 1 � . . . � ISR N Prog 10

  11. Interrupt-Driven Programs • Assumptions over the model 1. all accesses to shared variables ( l=g and g=l ) are atomic. this assumption exists in most of concurrent program analysis, e.g., Cseq [ASE’13], AstréeA[ESOP’11], KISS [PLDI’04] 2. the IMR is intact inside an ISR, i.e. IMR ISR i entry = IMR ISR i exit keeping IMR intact holds for practical IDPs, e.g., satellite control programs 11

  12. Overview • Motivation • Interrupt-driven programs (IDPs) • Sequentialization of IDPs • Analysis of sequentialized IDPs via abstract interpretation • Experiments • Conclusion 12

  13. Basic Idea of Sequentialization • Observation : firing of interrupts can be simulated by function calls • Basic idea : add a schedule () function before each (atomic) program statement of the task and interrupts • the schedule () function non-deterministically schedules higher priority interrupts Original Sequentialized Seq st 1 ;…;st k st 1 ’;…; st k ’ where st i ’ = schedule(); st i 13

  14. Example only allow l=g and g = l int x,y,z; int x, y, z; void task(){ void task’(){ void ISR’(){ if (x<y){ int tx, ty; int tx, ty; z = 1/(x-y) ; tx = x; tx = x; } ty = y; tx = tx + 1; return ; if (tx < ty){ x = tx; } tx = x; ty = y; void ISR(){ ty = y; ty = ty + 1; x++; z = 1/(tx-ty); y = ty; y--; } return ; return ; return ; } } } 14

  15. int x, y, z; void ISR_seq(){ Add schedule() before each program statement Example int Prio=0; int tx, ty; //current priority schedule();tx = x; ISR ISRs_seq[N]; schedule(); tx = tx + 1; int x,y,z; //ISR entry schedule(); x = tx; void task(){ void task_seq(){ schedule(); ty = y; if (x<y){ int tx, ty; schedule(); ty = ty + 1; z = 1/(x-y) ; schedule(); tx = x; schedule(); y = ty; } schedule(); ty = y; schedule(); return ;} return ; schedule(); void schedule(){ } if (tx < ty){ int prevPrio = Prio; void ISR(){ schedule(); tx = x; for ( int i<=1;i<=N;i++){ x++; schedule(); ty = y; if (i<=Prio) continue ; y--; schedule(); if (nondet()){ return ; z = 1/(tx-ty); Prio = i; } } ISRs_seq[i].entry();}} schedule(); return ; Prio = prevPrio; } } 15

  16. int x, y, z; void ISR_seq(){ Example int Prio=0; int tx, ty; //current priority schedule();tx = x; ISR ISRs_seq[N]; schedule(); tx = tx + 1; int x,y,z; //ISR entry schedule(); x = tx; void task(){ void task_seq(){ schedule(); ty = y; if (x<y){ int tx, ty; schedule(); ty = ty + 1; z = 1/(x-y) ; schedule(); tx = x; schedule(); y = ty; } schedule(); ty = y; schedule(); return ;} return ; schedule(); void schedule(){ } if (tx < ty){ int prevPrio = Prio; void ISR(){ schedule(); tx = x; for ( int i<=1;i<=N;i++){ x++; schedule(); ty = y; if (i<=Prio) continue ; Non-deterministically y--; schedule(); if (nondet()){ return ; schedule higher z = 1/(tx-ty); Prio = i; } } ISRs_seq[i].entry();}} priority interrupts schedule(); return ; Prio = prevPrio; } } 16

  17. Basic Idea of Sequentialization • Disadvantages of the basic sequentialization method • the resulting sequentialized program becomes large • too many schedule () functions are invoked • Further observation • interrupts and tasks communicate with each other by shared variables • interrupts only affect those statements which access shared variables Further idea: utilize data flow dependency to reduce the size of sequentialized programs 17

  18. Sequentialization by Considering Data Flow Dependency l Example : Program { St 1 ; St 2 ; …; St n } , where only St n reads shared variables (SVs) - basic sequentialization { St 1 ; St 2 ; … ; ; St n } schedule(); schedule(); schedule() - consider SVs { St 1 ; St 2 ; …; St n-1 ; for ( int i=0;i<n;i++) schedule(); St n } 18

  19. Sequentialization by Considering Data Flow Dependency • Key idea: schedule relevant interrupts only for those statements accessing shared variables • before l = g (i.e., reading a shared variable) • schedule those interrupts which may affect the value of shared variable g • after g = l (i.e., writing a shared variable) • schedule those interrupts of which the execution results may be affected by shared variable g 19

  20. Sequentialization by Considering Data Flow Dependency • Need to consider the firing number of interrupts, otherwise the analysis results may be not sound void scheduleG_K(group: int set){ for ( int i=1;i<=K;i++) K is the upper bound of the scheduleG(group); firing times of each ISR, which } can be a specific value or +oo 20

  21. int x,y,z; Example void task(){ These statements access int t, tx, ty, tz; x = 10; shared variables y = 0; tx = x; ty = y; t = tx+ty; ty=y; tx = t-ty; x = tx; tz = t*2; z = tz; ty = y; ty = t-ty; y = ty; } void ISR1(){ int tx, ty; ty = y; ty = ty + 1; y = ty; tx = x; tx = tx -1; x = tx; } void ISR2(){ int tz; tz = z; tz = tz+1; z=tz; } 21

Recommend


More recommend