local nontermination detection for parallel c programs
play

Local Nontermination Detection for Parallel C++ Programs Vladimr - PowerPoint PPT Presentation

Local Nontermination Detection for Parallel C++ Programs Vladimr till Ji Barnat Masaryk University Brno, Czech Republic 20th Septempler 2019 Motivation Would you trust a program which was verified, but not tested? 1 / 14


  1. Local Nontermination Detection for Parallel C++ Programs Vladimír Štill Jiří Barnat Masaryk University Brno, Czech Republic 20th Septempler 2019

  2. Motivation “Would you trust a program which was verified, but not tested?” 1 / 14

  3. Motivation “Would you trust a program which was verified, but not tested?” DEMO: DIVINE 1 / 14

  4. Motivation “Would you trust a program which was verified, but not tested?” DEMO: DIVINE . . . at the very least, we should not blindly trust safety checking 1 / 14

  5. Safety Checking Parallel Programs targeting assertion violations, memory corruption, data races primarily caused by thread interleaving or by relaxed memory 2 / 14

  6. Safety Checking Parallel Programs targeting assertion violations, memory corruption, data races primarily caused by thread interleaving or by relaxed memory if the program might not terminate. . . the tool might not terminate or it might report there are no safety violations 2 / 14

  7. Safety Checking Parallel Programs targeting assertion violations, memory corruption, data races primarily caused by thread interleaving or by relaxed memory if the program might not terminate. . . the tool might not terminate or it might report there are no safety violations (correctly) 2 / 14

  8. Safety Checking Parallel Programs targeting assertion violations, memory corruption, data races primarily caused by thread interleaving or by relaxed memory if the program might not terminate. . . the tool might not terminate or it might report there are no safety violations (correctly) not enough for parallel programs 2 / 14

  9. (Non)Termination Checking check that the whole program terminates 3 / 14

  10. (Non)Termination Checking check that the whole program terminates or checks that certain parts of it terminate critical sections waiting for condition variables, threads. . . user-defined parts 3 / 14

  11. Local Nontermination Detection for Parallel Programs we aim at nontermination caused by unintended parallel interactions 4 / 14

  12. Local Nontermination Detection for Parallel Programs we aim at nontermination caused by unintended parallel interactions not at complex control flow & loops 4 / 14

  13. Local Nontermination Detection for Parallel Programs we aim at nontermination caused by unintended parallel interactions not at complex control flow & loops should be easy to specify should not report nontermination spuriously should be useful for analysis of services/servers 4 / 14

  14. Local Nontermination Detection for Parallel Programs we aim at nontermination caused by unintended parallel interactions not at complex control flow & loops should be easy to specify should not report nontermination spuriously should be useful for analysis of services/servers build on explicit-state model checking → finite-state programs (with possibly infinite behaviour) user can specify what to check bool x = true ; while ( true ) { x = !x; } ¬ x x 4 / 14

  15. What is Nontermination? mutex mtx; void w() { mutex.lock(); x++; mutex.unlock(); } int main() { thread t0(w), t1(w); t0.join(); t1.join(); } Does this program terminate? 5 / 14

  16. What is Nontermination? mutex mtx; void w() { mutex.lock(); x++; mutex.unlock(); } int main() { thread t0(w), t1(w); t0.join(); t1.join(); } Does this program terminate? . . . yes 5 / 14

  17. What is Nontermination? atomic< bool > spin_lock; void w() { while (spin_lock.exchange( true )) { /* wait */ } x++; spin_lock = false ; } int main() { thread t0(w), t1(w); t0.join(); t1.join(); } Does this program terminate? 6 / 14

  18. What is Nontermination? atomic< bool > spin_lock; void w() { while (spin_lock.exchange( true )) { /* wait */ } x++; spin_lock = false ; } int main() { thread t0(w), t1(w); t0.join(); t1.join(); } Does this program terminate? . . . yes 6 / 14

  19. What is Nontermination? atomic< bool > spin_lock; void w() { while (spin_lock.exchange( true )) { /* wait */ } x++; spin_lock = false ; } int main() { thread t0(w), t1(w); t0.join(); t1.join(); } Does this program terminate? . . . yes But there is an infinite run : [t0: spin_lock.exchange(true) → false] spin_lock.exchange(true) → true] ω (repeats infinitely) [t1: 6 / 14

  20. What is Nontermination? atomic< bool > spin_lock; void w() { while (spin_lock.exchange( true )) { /* wait */ } x++; spin_lock = false ; } int main() { thread t0(w), t1(w); t0.join(); t1.join(); } Does this program terminate? . . . yes But there is an infinite run : [t0: spin_lock.exchange(true) → false] spin_lock.exchange(true) → true] ω (repeats infinitely) [t1: but only because t0 is not allowed to run 6 / 14

  21. What is Nontermination? void w() { while ( true ) { while (spin_lock.exchange( true )) { /* wait */ } x++; spin_lock = false ; } } Does every wait end? 7 / 14

  22. What is Nontermination? void w() { while ( true ) { while (spin_lock.exchange( true )) { /* wait */ } x++; spin_lock = false ; } } Does every wait end? yes 7 / 14

  23. What is Nontermination? void w() { while ( true ) { while (spin_lock.exchange( true )) { /* wait */ } x++; spin_lock = false ; } } Does every wait end? yes? 7 / 14

  24. What is Nontermination? void w() { while ( true ) { while (spin_lock.exchange( true )) { /* wait */ } x++; spin_lock = false ; } } Does every wait end? yes? [t0: spin_lock.exchange(true) → false] � [t1: spin_lock.exchange(true) → true] [t0: x++] [t0: spin_lock = false] � ω [t0: spin_lock.exchange(true) → false] both threads can run 7 / 14

  25. What is Nontermination? [t0: spin_lock.exchange(true) → false] � [t1: spin_lock.exchange(true) → true] [t0: x++] [t0: spin_lock = false] � ω [t0: spin_lock.exchange(true) → false] this run requires a scheduler which allows t1 to run only if t0 is in the critical section 8 / 14

  26. What is Nontermination? [t0: spin_lock.exchange(true) → false] � [t1: spin_lock.exchange(true) → true] [t0: x++] [t0: spin_lock = false] � ω [t0: spin_lock.exchange(true) → false] this run requires a scheduler which allows t1 to run only if t0 is in the critical section does not happen in reality 8 / 14

  27. What is Nontermination? [t0: spin_lock.exchange(true) → false] � [t1: spin_lock.exchange(true) → true] [t0: x++] [t0: spin_lock = false] � ω [t0: spin_lock.exchange(true) → false] this run requires a scheduler which allows t1 to run only if t0 is in the critical section does not happen in reality for realistic schedulers an infinite run does not imply nontermination 8 / 14

  28. What is Nontermination? Nontermation a program does not terminate if it can reach a point from which it cannot reach its end 9 / 14

  29. What is Nontermination? Nontermation a program does not terminate if it can reach a point from which it cannot reach its end Resource Section a block of code with an identifier delimited in the source code 9 / 14

  30. What is Nontermination? Nontermation a program does not terminate if it can reach a point from which it cannot reach its end Resource Section a block of code with an identifier delimited in the source code Local Nontermation a resource section does not terminate if the program can reach a point in the resource section from which it cannot reach the corresponding resource section end 9 / 14

  31. Detecting Nontermination a program does not terminate if it can reach a point from which it cannot reach its end 10 / 14

  32. Detecting Nontermination a program does not terminate if it can reach a point from which it cannot reach its end detect nontrivial terminal strongly connected components nontriv. terminal SCC ⊥ 10 / 14

  33. Going Local : Active Resource Section Instances lock(m1) do_work_1 lock(m2) do_work_2 unlock(m2) unlock(m1) end 11 / 14

  34. Going Local : Active Resource Section Instances lock(m1) do_work_1 lock(m2) do_work_2 unlock(m2) unlock(m1) end 11 / 14

  35. Going Local : Active Resource Section Instances lock(m1) lock(m1) ARSI do_work_1 do_work_1 lock(m2) lock(m2) lock(m2) ARSI do_work_2 do_work_2 do_work_2 unlock(m2) unlock(m2) unlock(m2) unlock(m1) unlock(m1) end 11 / 14

  36. Detecting Local Nontermination a resource section does not terminate if the program can reach a point in the section from which it cannot reach the corresponding resource section end 12 / 14

  37. Detecting Local Nontermination a resource section does not terminate if the program can reach a point in the section from which it cannot reach the corresponding resource section end mark edges in ARSIs as accepting detect fully accepting terminal strongly connected components ( FATSCC ) nontriv. terminal SCC FATSCC 12 / 14

  38. Detection Algorithm modified Tarjan’s algorithm for SCC decomposition: O ( | G | ) global nontermination has no overhead for local nontermination the graph can get bigger 13 / 14

  39. Detection Algorithm modified Tarjan’s algorithm for SCC decomposition: O ( | G | ) global nontermination has no overhead for local nontermination the graph can get bigger Wall Time (in seconds) 10 4 local nonterm. [s] 10 3 10 2 10 1 10 0 10 0 10 1 10 2 10 3 10 4 safety [s] 13 / 14

  40. Resource Sections & Conclusions Source of resourcre sections either built-in (mutexes, condition variables, thread joining, . . . ) or user-provided (in source code; block of code, function end, . . . ) 14 / 14

Download Presentation
Download Policy: The content available on the website is offered to you 'AS IS' for your personal information and use only. It cannot be commercialized, licensed, or distributed on other websites without prior consent from the author. To download a presentation, simply click this link. If you encounter any difficulties during the download process, it's possible that the publisher has removed the file from their server.

Recommend


More recommend