Mul$SE: ¡Mul$-‑Path ¡Symbolic ¡ Execu$on ¡using ¡Value ¡Summaries ¡ ¡ Koushik ¡Sen ¡ University ¡of ¡California, ¡Berkeley ¡ Joint ¡work ¡with ¡ ¡ George ¡Necula, ¡Liang ¡Gong, ¡Wontae ¡Choi ¡ ¡ Work ¡started ¡at ¡Samsung ¡Research ¡America, ¡ ¡ ¡ ¡ San ¡Jose ¡in ¡Summer ¡2013 ¡ ¡
Concolic ¡Tes$ng ¡or ¡DART ¡ • Combine ¡random ¡tes$ng ¡(concrete ¡execu$on) ¡and ¡ symbolic ¡tes$ng ¡(symbolic ¡execu$on) ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡ Conc rete ¡+ ¡Symb olic ¡= ¡Concolic ¡ 2 ¡
Goal ¡ • Automated ¡test ¡genera$on ¡for ¡real-‑world ¡ programs ¡ – Generate ¡test ¡inputs ¡ – Execute ¡unit ¡under ¡test ¡on ¡generated ¡test ¡inputs ¡ • so ¡that ¡all ¡reachable ¡statements ¡are ¡executed ¡ – Any ¡asser$on ¡viola$on ¡gets ¡caught ¡ ¡ 3 ¡
Goal ¡ • Automated ¡test ¡genera$on ¡for ¡real-‑world ¡ programs ¡ – Generate ¡test ¡inputs ¡ – Execute ¡unit ¡under ¡test ¡on ¡generated ¡test ¡inputs ¡ • so ¡that ¡all ¡reachable ¡statements ¡are ¡executed ¡ – Any ¡asser$on ¡viola$on ¡gets ¡caught ¡ • Our ¡Approach: ¡ – Explore ¡all ¡execu$on ¡paths ¡of ¡a ¡program ¡for ¡all ¡ possible ¡inputs ¡ • Exploring ¡all ¡execu$on ¡paths ¡ensure ¡that ¡all ¡reachable ¡ statements ¡are ¡executed ¡ 4 ¡
Execu$on ¡Paths ¡of ¡a ¡Program ¡ • Can ¡be ¡seen ¡as ¡a ¡binary ¡tree ¡ with ¡possibly ¡infinite ¡depth ¡ – Computa$on ¡tree ¡ 1 0 • Each ¡node ¡represents ¡the ¡ execu$on ¡of ¡a ¡ “ if ¡then ¡else ” ¡ 1 statement ¡ 0 1 0 • Each ¡edge ¡represents ¡the ¡ execu$on ¡of ¡a ¡sequence ¡of ¡ 0 1 1 non-‑condi$onal ¡statements ¡ • Each ¡path ¡in ¡the ¡tree ¡ represents ¡an ¡equivalence ¡ 1 class ¡of ¡inputs ¡ 0 1 5 ¡
Concolic ¡Tes$ng ¡(Dynamic ¡Symbolic ¡Execu$on) ¡ 1: ¡var ¡x ¡= ¡readInput; ¡ 2: ¡var ¡z ¡= ¡readInput; ¡ 3: ¡var ¡r ¡= ¡readInput; ¡ 4: ¡x ¡= ¡2*x; ¡ 5: ¡if ¡(x ¡> ¡100) ¡ ¡ 6: ¡ ¡ ¡ ¡if ¡(z ¡== ¡1) ¡ ¡ 7: ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡r ¡= ¡1.3; ¡ 8: ¡if ¡(r ¡> ¡1) ¡ ¡ 9: ¡ ¡ ¡ ¡z ¡= ¡r ¡– ¡1; ¡ 10: ¡halt ¡ ¡
Concolic ¡Tes$ng ¡(Dynamic ¡Symbolic ¡Execu$on) ¡ 1 1: ¡var ¡x ¡= ¡readInput; ¡ 2: ¡var ¡z ¡= ¡readInput; ¡ 3: ¡var ¡r ¡= ¡readInput; ¡ 4: ¡x ¡= ¡2*x; ¡ 5: ¡if ¡(x ¡> ¡100) ¡ ¡ 6: ¡ ¡ ¡ ¡if ¡(z ¡== ¡1) ¡ ¡ 7: ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡r ¡= ¡1.3; ¡ 8: ¡if ¡(r ¡> ¡1) ¡ ¡ path ¡ pc ¡ x ¡ z ¡ r ¡ Á 9: ¡ ¡ ¡ ¡z ¡= ¡r ¡– ¡1; ¡ 1 Á 1 =true ¡ 1 ¡ ? ? ? 10: ¡halt ¡ ¡
Concolic ¡Tes$ng ¡(Dynamic ¡Symbolic ¡Execu$on) ¡ 1. var x = readInput 1: ¡var ¡x ¡= ¡readInput; ¡ 1 1 2: ¡var ¡z ¡= ¡readInput; ¡ 3: ¡var ¡r ¡= ¡readInput; ¡ 4: ¡x ¡= ¡2*x; ¡ 5: ¡if ¡(x ¡> ¡100) ¡ ¡ 6: ¡ ¡ ¡ ¡if ¡(z ¡== ¡1) ¡ ¡ 7: ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡r ¡= ¡1.3; ¡ 8: ¡if ¡(r ¡> ¡1) ¡ ¡ path ¡ pc ¡ x ¡ z ¡ r ¡ Á 9: ¡ ¡ ¡ ¡z ¡= ¡r ¡– ¡1; ¡ 1 Á 1 =true ¡ 2 ¡ x 0 ¡ ? ? 10: ¡halt ¡ ¡
Concolic ¡Tes$ng ¡(Dynamic ¡Symbolic ¡Execu$on) ¡ 1. var x = readInput 1: ¡var ¡x ¡= ¡readInput; ¡ 2. var z = readInput 1 2: ¡var ¡z ¡= ¡readInput; ¡ 1 3: ¡var ¡r ¡= ¡readInput; ¡ 4: ¡x ¡= ¡2*x; ¡ 5: ¡if ¡(x ¡> ¡100) ¡ ¡ 6: ¡ ¡ ¡ ¡if ¡(z ¡== ¡1) ¡ ¡ 7: ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡r ¡= ¡1.3; ¡ 8: ¡if ¡(r ¡> ¡1) ¡ ¡ path ¡ pc ¡ x ¡ z ¡ r ¡ Á 9: ¡ ¡ ¡ ¡z ¡= ¡r ¡– ¡1; ¡ 1 Á 1 =true ¡ 3 ¡ x 0 ¡ z 0 ¡ ? 10: ¡halt ¡ ¡
Concolic ¡Tes$ng ¡(Dynamic ¡Symbolic ¡Execu$on) ¡ 1. var x = readInput 1: ¡var ¡x ¡= ¡readInput; ¡ 2. var z = readInput 3. var r = readInput 2: ¡var ¡z ¡= ¡readInput; ¡ 1 3: ¡var ¡r ¡= ¡readInput; ¡ 1 4: ¡x ¡= ¡2*x; ¡ 5: ¡if ¡(x ¡> ¡100) ¡ ¡ 6: ¡ ¡ ¡ ¡if ¡(z ¡== ¡1) ¡ ¡ 7: ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡r ¡= ¡1.3; ¡ 8: ¡if ¡(r ¡> ¡1) ¡ ¡ path ¡ pc ¡ x ¡ z ¡ r ¡ Á 9: ¡ ¡ ¡ ¡z ¡= ¡r ¡– ¡1; ¡ 1 Á 1 =true ¡ 4 ¡ x 0 ¡ z 0 ¡ r 0 ¡ 10: ¡halt ¡ ¡
Concolic ¡Tes$ng ¡(Dynamic ¡Symbolic ¡Execu$on) ¡ 1. var x = readInput 1: ¡var ¡x ¡= ¡readInput; ¡ 2. var z = readInput 3. var r = readInput 2: ¡var ¡z ¡= ¡readInput; ¡ 4. x = 2*x 1 3: ¡var ¡r ¡= ¡readInput; ¡ 4: ¡x ¡= ¡2*x; ¡ 1 5: ¡if ¡(x ¡> ¡100) ¡ ¡ 6: ¡ ¡ ¡ ¡if ¡(z ¡== ¡1) ¡ ¡ 7: ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡r ¡= ¡1.3; ¡ 8: ¡if ¡(r ¡> ¡1) ¡ ¡ path ¡ pc ¡ x ¡ z ¡ r ¡ Á 9: ¡ ¡ ¡ ¡z ¡= ¡r ¡– ¡1; ¡ 1 Á 1 =true ¡ 5 ¡ 2x 0 ¡ z 0 ¡ r 0 ¡ 10: ¡halt ¡ ¡
Concolic ¡Tes$ng ¡(Dynamic ¡Symbolic ¡Execu$on) ¡ 1. var x = readInput 1: ¡var ¡x ¡= ¡readInput; ¡ 2. var z = readInput 3. var r = readInput 2: ¡var ¡z ¡= ¡readInput; ¡ 4. x = 2*x 5. if(x > 100) 3: ¡var ¡r ¡= ¡readInput; ¡ 1 4: ¡x ¡= ¡2*x; ¡ 5: ¡if ¡(x ¡> ¡100) ¡ ¡ 1 2 6: ¡ ¡ ¡ ¡if ¡(z ¡== ¡1) ¡ ¡ 7: ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡r ¡= ¡1.3; ¡ 2 8: ¡if ¡(r ¡> ¡1) ¡ ¡ path ¡ pc ¡ x ¡ z ¡ r ¡ Á 9: ¡ ¡ ¡ ¡z ¡= ¡r ¡– ¡1; ¡ 1 Á 1 =2x 0 ¡ > ¡100 ¡ 6 ¡ 2x 0 ¡ z 0 ¡ ¡ r 0 ¡ 10: ¡halt ¡ ¡ 2 Á 2 =2x 0 ¡ · ¡100 ¡ 8 ¡ 2x 0 ¡ z 0 ¡ ¡ r 0 ¡
Concolic ¡Tes$ng ¡(Dynamic ¡Symbolic ¡Execu$on) ¡ 1. var x = readInput 1: ¡var ¡x ¡= ¡readInput; ¡ 2. var z = readInput 3. var r = readInput 2: ¡var ¡z ¡= ¡readInput; ¡ 4. x = 2*x 5. if(x > 100) 3: ¡var ¡r ¡= ¡readInput; ¡ 1 4: ¡x ¡= ¡2*x; ¡ 5: ¡if ¡(x ¡> ¡100) ¡ ¡ 1 8. if(r > 1) 6: ¡ ¡ ¡ ¡if ¡(z ¡== ¡1) ¡ ¡ 3 7: ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡r ¡= ¡1.3; ¡ halt 2 8: ¡if ¡(r ¡> ¡1) ¡ ¡ 3 path ¡ pc ¡ x ¡ z ¡ r ¡ Á 9: ¡ ¡ ¡ ¡z ¡= ¡r ¡– ¡1; ¡ 2 1 Á 1 =2x 0 ¡ > ¡100 ¡ 6 ¡ 2x 0 ¡ z 0 ¡ ¡ r 0 ¡ 10: ¡halt ¡ ¡ 2 Á 2 =2x 0 ¡ · ¡100 ¡ Æ ¡r 0 ¡ · ¡1 ¡ 10 ¡ 2x 0 ¡ z 0 ¡ r 0 ¡ 3 Á 3 =2x 0 ¡ · ¡100 ¡ Æ ¡r 0 ¡> ¡1 ¡ 9 ¡ 2x 0 ¡ z 0 ¡ r 0 ¡
Concolic ¡Tes$ng ¡(Dynamic ¡Symbolic ¡Execu$on) ¡ 1. var x = readInput 1: ¡var ¡x ¡= ¡readInput; ¡ 2. var z = readInput 3. var r = readInput 2: ¡var ¡z ¡= ¡readInput; ¡ 4. x = 2*x 5. if(x > 100) 3: ¡var ¡r ¡= ¡readInput; ¡ 1 4: ¡x ¡= ¡2*x; ¡ 5: ¡if ¡(x ¡> ¡100) ¡ ¡ 1 8. if(r > 1) 6: ¡ ¡ ¡ ¡if ¡(z ¡== ¡1) ¡ ¡ 9. z = r - 1 7: ¡ ¡ ¡ ¡ ¡ ¡ ¡ ¡r ¡= ¡1.3; ¡ halt halt 2 3 8: ¡if ¡(r ¡> ¡1) ¡ ¡ path ¡ pc ¡ x ¡ z ¡ r ¡ Á 9: ¡ ¡ ¡ ¡z ¡= ¡r ¡– ¡1; ¡ 2 1 Á 1 =2x 0 ¡ > ¡100 ¡ 6 ¡ 2x 0 ¡ z 0 ¡ ¡ r 0 ¡ 10: ¡halt ¡ ¡ 3 2 Á 2 =2x 0 ¡ · ¡100 ¡ Æ ¡r 0 ¡ · ¡1 ¡ 10 ¡ 2x 0 ¡ z 0 ¡ r 0 ¡ 3 Á 3 =2x 0 ¡ · ¡100 ¡ Æ ¡r 0 ¡> ¡1 ¡ 10 ¡ 2x 0 ¡ r 0 ¡ -‑ ¡1 ¡ r 0 ¡
Recommend
More recommend