140 likes | 160 Views
Learn about producing explanations using distance metrics. Understand how CBMC model checker works and perform experiments to find successful executions. Dive into metric d based on Static Single Assignment (SSA).
E N D
Error Explanation with Distance Metrics 2006.11.2 최윤라
Contents • Overview • Distance Metric d • Producing Explanation (s) • -Slicing • Experiments
Overview P + spec counterexample counterexample CBMC explain s closest successful execution S S’ SAT solver PBS finds closest successful execution as measured by distance metric finds a counterexample
Explanation with distance metrics • The metric d is based on Static Single Assignment (SSA) (plus loop unrolling). • CBMC model checker (bounded model checker for C programs) translates an ANSI C program into a set of equations. • An execution of the program is just a solution to this set of equations.
SSA Transformation • int main () { • int input1#0,input2#0,input3#0; • int least#0 = input1#0; • int most#0 = input1#0; • most#1 = input2#0; • guard#1 = most#0<input2#0; • most#2=guard#1?most#1:most#0; • most#3 = input3#0; • guard#2 = most#2<input3#0; • most#4=guard#2?most#3:most#2; • most#5 = input2#0; • guard#3 = least#0input2#0; • most#6=guard#3?most#5:most#4; • least#1 = input3#0; • guard#4 = least#0input3#0; • least#2= • guard#4?least#1:least#0; • assert(least#2<=most#6); • } • int main () { • int input1, input2, input3; • int least = input1; • int most = input1; • if (most < input2) • most = input2; • if (most < input3) • most = input3; • if (least > input2) • most = input2; • if (least > input3) • least = input3; • assert(least<=most); • }
Transformation to Equations • int main () { • int input1#0,input2#0,input3#0; • int least#0 = input1#0; • int most#0 = input1#0; • most#1 = input2#0; • guard#1 = most#0<input2#0; • most#2=guard#1?most#1:most#0; • most#3 = input3#0; • guard#2 = most#2<input3#0; • most#4=guard#2?most#3:most#2; • most#5 = input2#0; • guard#3 = least#0input2#0; • most#6=guard#3?most#5:most#4; • least#1 = input3#0; • guard#4 = least#0input3#0; • least#2= • guard#4?least#1:least#0; • assert(least#2<=most#6); • } • (least#0 == input1#0 • most#0 == input1#0 • most#1 == input2#0 • guard#1 == most#0<input2#0 • most#2==guard#1?most#1:most#0 • most#3 == input3#0 • guard#2 == most#2<input3#0 • most#4==guard#2?most#3:most#2 • most#5 == input2#0 • guard#3 == least#0input2#0 • most#6==guard#3?most#5:most#4 • least#1 == input3#0 • guard#4 == least#0input3#0 • least#2== • guard#4?least#1:least#0 • least#2<=most#6)
Negation of Claim • int main () { • int input1#0,input2#0,input3#0; • int least#0 = input1#0; • int most#0 = input1#0; • most#1 = input2#0; • guard#1 = most#0<input2#0; • most#2=guard#1?most#1:most#0; • most#3 = input3#0; • guard#2 = most#2<input3#0; • most#4=guard#2?most#3:most#2; • most#5 = input2#0; • guard#3 = least#0input2#0; • most#6=guard#3?most#5:most#4; • least#1 = input3#0; • guard#4 = least#0input3#0; • least#2= • guard#4?least#1:least#0; • assert(least#2<=most#6); • } • (least#0 == input1#0 • most#0 == input1#0 • most#1 == input2#0 • guard#1 == most#0<input2#0 • most#2==guard#1?most#1:most#0 • most#3 == input3#0 • guard#2 == most#2<input3#0 • most#4==guard#2?most#3:most#2 • most#5 == input2#0 • guard#3 == least#0input2#0 • most#6==guard#3?most#5:most#4 • least#1 == input3#0 • guard#4 == least#0input3#0 • least#2== • guard#4?least#1:least#0 • least#2>most#6)
Execution Representation counterexample • input1#0 = 1 • input2#0 = 0 • input3#0 = 1 • least#0 = 1 • most#0 = 0 • \guard#1 = FALSE • most#1 = 0 • most#2 = 1 • \guard#2 = FALSE • most#3 = 1 • most#4 = 1 • \guard#3 = TRUE • most#5 = 0 • most#6 = 0 • \guard#4 = FALSE • \least#1 = 1 • \least#2 = 1 • (least#0 == input1#0 • most#0 == input1#0 • most#1 == input2#0 • guard#1 == most#0<input2#0 • most#2==guard#1?most#1:most#0 • most#3 == input3#0 • guard#2 == most#2<input3#0 • most#4==guard#2?most#3:most#2 • most#5 == input2#0 • guard#3 == least#0input2#0 • most#6==guard#3?most#5:most#4 • least#1 == input3#0 • guard#4 == least#0input3#0 • least#2== • guard#4?least#1:least#0 • least#2>most#6)
Distance Metric d counterexample successful execution • input1#0 = 1 • input2#0 = 0 • input3#0 = 1 • least#0 = 1 • most#0 = 1 • \guard#1 = FALSE • most#1 = 0 • most#2 = 1 • \guard#2 = FALSE • most#3 = 1 • most#4 = 1 • \guard#3 = TRUE • most#5 = 0 • most#6 = 0 • \guard#4 = FALSE • \least#1 = 1 • \least#2 = 1 • input1#0 = 1 • input2#0 = 1 • input3#0 = 1 • least#0 = 1 • most#0 = 1 • \guard#1 = FALSE • most#1 = 1 • most#2 = 1 • \guard#2 = FALSE • most#3 = 1 • most#4 = 1 • \guard#3 = FALSE • most#5 = 1 • most#6 = 1 • \guard#4 = FALSE • \least#1 = 1 • \least#2 = 1 d=5
New SAT variables counterexample • input1#0 = 1 • input2#0 = 0 • input3#0 = 1 • least#0 = 1 • most#0 = 1 • \guard#1 = FALSE • most#1 = 0 • most#2 = 1 • \guard#2 = FALSE • most#3 = 1 • most#4 = 1 • \guard#3 = TRUE • most#5 = 0 • most#6 = 0 • \guard#4 = FALSE • \least#1 = 1 • \least#2 = 1 • input1#0 == (input1#0 != 1) • input2#0 == (input2#0 != 0) • input3#0 == (input3#0 != 1) • least#0 == (least#0 != 1) • most#0 == (most#0 != 1) • \guard#1 == (\guard#1 != FALSE) • most#1 == (most#1 == 0) • most#2 == (most#2 == 1) • \guard#2 == (\guard#2 != FALSE) • most#3 == (most#3 != 1) • most#4 == (most#4 != 1) • \guard#3 == (\guard#3 != TRUE) • most#5 == (most#5 != 0) • most#6 == (most#6 != 0) • \guard#4 == (\guard#4 != FALSE) • \least#1 == (\least#1 != 1) • \least#2 == (\least#2 != 1)
-Slicing • int main () { • int input1,input2; • int x=1,y=1,z=1; • if (input1 > 0) { • x += 5; • y += 6; • z += 4; • } • if (input2 > 0) { • x += 6; • y += 5; • z += 4; • } • assert((x<10)||(y<10)); • } irrelevant to assertion ! What is the smallest subset of changes in values between two executions that result in a change in the value of the predicate?
algorithm • Produce an explanation (a set of s) for a counterexample. • Modify the SAT constraints • replace the constraints for variables in s with (vi=valia)((vi=valib)(vi=expr)) • replace the constraints for all other vars with vi=valia • Find a new solution to the modified constraint system.
-Slicing for the Example partial constraints for slice.c -slicing constraints for slice.c -slice for slice.c
Experiments • Scores were generally much better than other methods—when they could be applied at all. • Much more consistent. • Testing-based methods of Renieris and Reiss occasionally worked better • Also gave useless (score 0) explanations much of the time.