void use(...); void test1() { int x = 0; // $ certain="SSA def(&x)" certain="SSA def(x)" use(x); x = 1; // $ certain="SSA def(x)" use(x); int* p = &x; // $ certain="SSA def(&p)" certain="SSA def(p)" certain="SSA def(*p)" use(p); *p = 2; // $ certain="SSA def(*p)" use(p); p = nullptr; // $ certain="SSA def(p)" certain="SSA def(*p)" use(p); *p = 2; // $ uncertain="SSA def(*p)" use(p); } void test2(bool b) { // $ certain="SSA def(&b)" certain="SSA def(b)" { int x; // $ certain="SSA def(&x)" if(b) { x = 0; // $ certain="SSA def(x)" } else { x = 1; // $ certain="SSA def(x)" } use(x); // $ certain="SSA phi(x)" } { int x; // $ certain="SSA def(&x)" certain="SSA def(x)" if(b) { x = 0; // $ certain="SSA def(x)" } else { } use(x); // $ certain="SSA phi(x)" } { int x; // $ certain="SSA def(&x)" certain="SSA def(x)" int* p = &x; // $ certain="SSA def(&p)" certain="SSA def(p)" certain="SSA def(*p)" if(b) { *p = 0; // $ certain="SSA def(*p)" } else { *(p + 1) = 1; // $ uncertain="SSA def(*p)" } use(p); // $ uncertain="SSA phi(*p)" } } void test3(bool b) { // $ certain="SSA def(&b)" certain="SSA def(b)" for(int i = 0; i < 10;) { // $ certain="SSA def(&i)" certain="SSA def(i)" certain="SSA phi(i)" if(b) { ++i; // $ certain="SSA def(i)" } use(i); // $ certain="SSA phi(i)" } } void test(int x, bool b1, bool b2) { // $ certain="SSA def(&x)" certain="SSA def(x)" certain="SSA def(&b1)" certain="SSA def(b1)" certain="SSA def(&b2)" certain="SSA def(b2)" int* p = &x; // $ certain="SSA def(&p)" certain="SSA def(p)" certain="SSA def(*p)" int i = 0; // $ certain="SSA def(&i)" certain="SSA def(i)" int j = 0; // $ certain="SSA def(&j)" certain="SSA def(j)" while (i < 10) { // $ certain="SSA phi(i)" certain="SSA phi(*p)" if (b1) { *p = 0; // $ certain="SSA def(*p)" } ++i; // $ certain="SSA def(i)" certain="SSA phi(*p)" } while (j < 10) { // $ uncertain="SSA phi(*p)" certain="SSA phi(j)" if (b2) { *(p + j) = 0; // $ uncertain="SSA def(*p)" } ++j; // $ certain="SSA def(j)" uncertain="SSA phi(*p)" } }