C++: add test for IR alias analysis soundness

This commit is contained in:
Robert Marsh
2021-04-13 12:31:42 -07:00
parent 059a5f35fa
commit d95ef89cee
5 changed files with 339 additions and 0 deletions

View File

@@ -1502,3 +1502,90 @@ ssa.cpp:
# 310| v310_12(void) = ReturnVoid :
# 310| v310_13(void) = AliasedUse : m310_3
# 310| v310_14(void) = ExitFunction :
# 319| void DoubleIndirectionEscapes(char*)
# 319| Block 0
# 319| v319_1(void) = EnterFunction :
# 319| m319_2(unknown) = AliasedDefinition :
# 319| m319_3(unknown) = InitializeNonLocal :
# 319| m319_4(unknown) = Chi : total:m319_2, partial:m319_3
# 319| r319_5(glval<char *>) = VariableAddress[s] :
# 319| m319_6(char *) = InitializeParameter[s] : &:r319_5
# 319| r319_7(char *) = Load[s] : &:r319_5, m319_6
# 319| m319_8(unknown) = InitializeIndirection[s] : &:r319_7
# 321| r321_1(glval<char[1024]>) = VariableAddress[buffer] :
# 321| m321_2(char[1024]) = Uninitialized[buffer] : &:r321_1
# 321| m321_3(unknown) = Chi : total:m319_4, partial:m321_2
# 322| r322_1(glval<char *>) = VariableAddress[ptr1] :
# 322| m322_2(char *) = Uninitialized[ptr1] : &:r322_1
# 322| m322_3(unknown) = Chi : total:m321_3, partial:m322_2
# 322| r322_4(glval<char **>) = VariableAddress[ptr2] :
# 322| m322_5(char **) = Uninitialized[ptr2] : &:r322_4
# 323| r323_1(glval<char *>) = VariableAddress[ptr3] :
# 323| m323_2(char *) = Uninitialized[ptr3] : &:r323_1
# 323| r323_3(glval<char **>) = VariableAddress[ptr4] :
# 323| m323_4(char **) = Uninitialized[ptr4] : &:r323_3
# 325| r325_1(glval<char[1024]>) = VariableAddress[buffer] :
# 325| r325_2(char *) = Convert : r325_1
# 325| r325_3(glval<char *>) = VariableAddress[ptr1] :
# 325| m325_4(char *) = Store[ptr1] : &:r325_3, r325_2
# 325| m325_5(unknown) = Chi : total:m322_3, partial:m325_4
# 326| r326_1(glval<char *>) = VariableAddress[ptr1] :
# 326| r326_2(char **) = CopyValue : r326_1
# 326| r326_3(glval<char **>) = VariableAddress[ptr2] :
# 326| m326_4(char **) = Store[ptr2] : &:r326_3, r326_2
# 327| r327_1(glval<unknown>) = FunctionAddress[memcpy] :
# 327| r327_2(glval<char **>) = VariableAddress[ptr2] :
# 327| r327_3(char **) = Load[ptr2] : &:r327_2, m326_4
# 327| r327_4(char *) = Load[?] : &:r327_3, m325_4
# 327| r327_5(void *) = Convert : r327_4
# 327| r327_6(glval<char *>) = VariableAddress[s] :
# 327| r327_7(char *) = Load[s] : &:r327_6, m319_6
# 327| r327_8(void *) = Convert : r327_7
# 327| r327_9(int) = Constant[1024] :
# 327| r327_10(void *) = Call[memcpy] : func:r327_1, 0:r327_5, 1:r327_8, 2:r327_9
# 327| v327_11(void) = ^SizedBufferReadSideEffect[1] : &:r327_8, r327_9, ~m319_8
# 327| m327_12(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r327_5, r327_9
# 327| m327_13(unknown) = Chi : total:m325_5, partial:m327_12
# 329| r329_1(glval<unknown>) = FunctionAddress[sink] :
# 329| r329_2(glval<char[1024]>) = VariableAddress[buffer] :
# 329| r329_3(char *) = Convert : r329_2
# 329| v329_4(void) = Call[sink] : func:r329_1, 0:r329_3
# 329| m329_5(unknown) = ^CallSideEffect : ~m327_13
# 329| m329_6(unknown) = Chi : total:m327_13, partial:m329_5
# 329| v329_7(void) = ^BufferReadSideEffect[0] : &:r329_3, ~m329_6
# 329| m329_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r329_3
# 329| m329_9(unknown) = Chi : total:m329_6, partial:m329_8
# 330| r330_1(glval<unknown>) = FunctionAddress[sink] :
# 330| r330_2(glval<char *>) = VariableAddress[ptr1] :
# 330| r330_3(char *) = Load[ptr1] : &:r330_2, ~m329_6
# 330| v330_4(void) = Call[sink] : func:r330_1, 0:r330_3
# 330| m330_5(unknown) = ^CallSideEffect : ~m329_9
# 330| m330_6(unknown) = Chi : total:m329_9, partial:m330_5
# 330| v330_7(void) = ^BufferReadSideEffect[0] : &:r330_3, ~m330_6
# 330| m330_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r330_3
# 330| m330_9(unknown) = Chi : total:m330_6, partial:m330_8
# 331| r331_1(glval<unknown>) = FunctionAddress[sink] :
# 331| r331_2(glval<char **>) = VariableAddress[ptr2] :
# 331| r331_3(char **) = Load[ptr2] : &:r331_2, m326_4
# 331| v331_4(void) = Call[sink] : func:r331_1, 0:r331_3
# 331| m331_5(unknown) = ^CallSideEffect : ~m330_9
# 331| m331_6(unknown) = Chi : total:m330_9, partial:m331_5
# 331| v331_7(void) = ^BufferReadSideEffect[0] : &:r331_3, ~m331_6
# 331| m331_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r331_3
# 331| m331_9(unknown) = Chi : total:m331_6, partial:m331_8
# 332| r332_1(glval<unknown>) = FunctionAddress[sink] :
# 332| r332_2(glval<char **>) = VariableAddress[ptr2] :
# 332| r332_3(char **) = Load[ptr2] : &:r332_2, m326_4
# 332| r332_4(char *) = Load[?] : &:r332_3, ~m331_9
# 332| v332_5(void) = Call[sink] : func:r332_1, 0:r332_4
# 332| m332_6(unknown) = ^CallSideEffect : ~m331_9
# 332| m332_7(unknown) = Chi : total:m331_9, partial:m332_6
# 332| v332_8(void) = ^BufferReadSideEffect[0] : &:r332_4, ~m332_7
# 332| m332_9(unknown) = ^BufferMayWriteSideEffect[0] : &:r332_4
# 332| m332_10(unknown) = Chi : total:m332_7, partial:m332_9
# 333| v333_1(void) = NoOp :
# 319| v319_9(void) = ReturnIndirection[s] : &:r319_7, m319_8
# 319| v319_10(void) = ReturnVoid :
# 319| v319_11(void) = AliasedUse : ~m332_10
# 319| v319_12(void) = ExitFunction :

View File

@@ -1495,3 +1495,87 @@ ssa.cpp:
# 310| v310_12(void) = ReturnVoid :
# 310| v310_13(void) = AliasedUse : m310_3
# 310| v310_14(void) = ExitFunction :
# 319| void DoubleIndirectionEscapes(char*)
# 319| Block 0
# 319| v319_1(void) = EnterFunction :
# 319| m319_2(unknown) = AliasedDefinition :
# 319| m319_3(unknown) = InitializeNonLocal :
# 319| m319_4(unknown) = Chi : total:m319_2, partial:m319_3
# 319| r319_5(glval<char *>) = VariableAddress[s] :
# 319| m319_6(char *) = InitializeParameter[s] : &:r319_5
# 319| r319_7(char *) = Load[s] : &:r319_5, m319_6
# 319| m319_8(unknown) = InitializeIndirection[s] : &:r319_7
# 321| r321_1(glval<char[1024]>) = VariableAddress[buffer] :
# 321| m321_2(char[1024]) = Uninitialized[buffer] : &:r321_1
# 322| r322_1(glval<char *>) = VariableAddress[ptr1] :
# 322| m322_2(char *) = Uninitialized[ptr1] : &:r322_1
# 322| r322_3(glval<char **>) = VariableAddress[ptr2] :
# 322| m322_4(char **) = Uninitialized[ptr2] : &:r322_3
# 323| r323_1(glval<char *>) = VariableAddress[ptr3] :
# 323| m323_2(char *) = Uninitialized[ptr3] : &:r323_1
# 323| r323_3(glval<char **>) = VariableAddress[ptr4] :
# 323| m323_4(char **) = Uninitialized[ptr4] : &:r323_3
# 325| r325_1(glval<char[1024]>) = VariableAddress[buffer] :
# 325| r325_2(char *) = Convert : r325_1
# 325| r325_3(glval<char *>) = VariableAddress[ptr1] :
# 325| m325_4(char *) = Store[ptr1] : &:r325_3, r325_2
# 326| r326_1(glval<char *>) = VariableAddress[ptr1] :
# 326| r326_2(char **) = CopyValue : r326_1
# 326| r326_3(glval<char **>) = VariableAddress[ptr2] :
# 326| m326_4(char **) = Store[ptr2] : &:r326_3, r326_2
# 327| r327_1(glval<unknown>) = FunctionAddress[memcpy] :
# 327| r327_2(glval<char **>) = VariableAddress[ptr2] :
# 327| r327_3(char **) = Load[ptr2] : &:r327_2, m326_4
# 327| r327_4(char *) = Load[?] : &:r327_3, m325_4
# 327| r327_5(void *) = Convert : r327_4
# 327| r327_6(glval<char *>) = VariableAddress[s] :
# 327| r327_7(char *) = Load[s] : &:r327_6, m319_6
# 327| r327_8(void *) = Convert : r327_7
# 327| r327_9(int) = Constant[1024] :
# 327| r327_10(void *) = Call[memcpy] : func:r327_1, 0:r327_5, 1:r327_8, 2:r327_9
# 327| v327_11(void) = ^SizedBufferReadSideEffect[1] : &:r327_8, r327_9, ~m319_8
# 327| m327_12(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r327_5, r327_9
# 327| m327_13(unknown) = Chi : total:m319_4, partial:m327_12
# 329| r329_1(glval<unknown>) = FunctionAddress[sink] :
# 329| r329_2(glval<char[1024]>) = VariableAddress[buffer] :
# 329| r329_3(char *) = Convert : r329_2
# 329| v329_4(void) = Call[sink] : func:r329_1, 0:r329_3
# 329| m329_5(unknown) = ^CallSideEffect : ~m327_13
# 329| m329_6(unknown) = Chi : total:m327_13, partial:m329_5
# 329| v329_7(void) = ^BufferReadSideEffect[0] : &:r329_3, ~m321_2
# 329| m329_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r329_3
# 329| m329_9(char[1024]) = Chi : total:m321_2, partial:m329_8
# 330| r330_1(glval<unknown>) = FunctionAddress[sink] :
# 330| r330_2(glval<char *>) = VariableAddress[ptr1] :
# 330| r330_3(char *) = Load[ptr1] : &:r330_2, m325_4
# 330| v330_4(void) = Call[sink] : func:r330_1, 0:r330_3
# 330| m330_5(unknown) = ^CallSideEffect : ~m329_6
# 330| m330_6(unknown) = Chi : total:m329_6, partial:m330_5
# 330| v330_7(void) = ^BufferReadSideEffect[0] : &:r330_3, ~m329_9
# 330| m330_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r330_3
# 330| m330_9(char[1024]) = Chi : total:m329_9, partial:m330_8
# 331| r331_1(glval<unknown>) = FunctionAddress[sink] :
# 331| r331_2(glval<char **>) = VariableAddress[ptr2] :
# 331| r331_3(char **) = Load[ptr2] : &:r331_2, m326_4
# 331| v331_4(void) = Call[sink] : func:r331_1, 0:r331_3
# 331| m331_5(unknown) = ^CallSideEffect : ~m330_6
# 331| m331_6(unknown) = Chi : total:m330_6, partial:m331_5
# 331| v331_7(void) = ^BufferReadSideEffect[0] : &:r331_3, ~m325_4
# 331| m331_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r331_3
# 331| m331_9(char *) = Chi : total:m325_4, partial:m331_8
# 332| r332_1(glval<unknown>) = FunctionAddress[sink] :
# 332| r332_2(glval<char **>) = VariableAddress[ptr2] :
# 332| r332_3(char **) = Load[ptr2] : &:r332_2, m326_4
# 332| r332_4(char *) = Load[?] : &:r332_3, m331_9
# 332| v332_5(void) = Call[sink] : func:r332_1, 0:r332_4
# 332| m332_6(unknown) = ^CallSideEffect : ~m331_6
# 332| m332_7(unknown) = Chi : total:m331_6, partial:m332_6
# 332| v332_8(void) = ^BufferReadSideEffect[0] : &:r332_4, ~m332_7
# 332| m332_9(unknown) = ^BufferMayWriteSideEffect[0] : &:r332_4
# 332| m332_10(unknown) = Chi : total:m332_7, partial:m332_9
# 333| v333_1(void) = NoOp :
# 319| v319_9(void) = ReturnIndirection[s] : &:r319_7, m319_8
# 319| v319_10(void) = ReturnVoid :
# 319| v319_11(void) = AliasedUse : ~m332_10
# 319| v319_12(void) = ExitFunction :

View File

@@ -311,3 +311,23 @@ class ThisAliasTest {
this->x = arg;
}
};
void sink(char **);
void sink(char *);
// This test case comes from DefaultTaintTracking.
void DoubleIndirectionEscapes(char *s)
{
char buffer[1024];
char *ptr1, **ptr2;
char *ptr3, **ptr4;
ptr1 = buffer;
ptr2 = &ptr1;
memcpy(*ptr2, s, 1024);
sink(buffer); // $ MISSING: ast,ir
sink(ptr1); // $ ast MISSING: ir
sink(ptr2); // $ SPURIOUS: ast
sink(*ptr2); // $ ast MISSING: ir
}

View File

@@ -1376,3 +1376,77 @@ ssa.cpp:
# 310| v310_11(void) = ReturnVoid :
# 310| v310_12(void) = AliasedUse : ~m?
# 310| v310_13(void) = ExitFunction :
# 319| void DoubleIndirectionEscapes(char*)
# 319| Block 0
# 319| v319_1(void) = EnterFunction :
# 319| mu319_2(unknown) = AliasedDefinition :
# 319| mu319_3(unknown) = InitializeNonLocal :
# 319| r319_4(glval<char *>) = VariableAddress[s] :
# 319| m319_5(char *) = InitializeParameter[s] : &:r319_4
# 319| r319_6(char *) = Load[s] : &:r319_4, m319_5
# 319| mu319_7(unknown) = InitializeIndirection[s] : &:r319_6
# 321| r321_1(glval<char[1024]>) = VariableAddress[buffer] :
# 321| mu321_2(char[1024]) = Uninitialized[buffer] : &:r321_1
# 322| r322_1(glval<char *>) = VariableAddress[ptr1] :
# 322| mu322_2(char *) = Uninitialized[ptr1] : &:r322_1
# 322| r322_3(glval<char **>) = VariableAddress[ptr2] :
# 322| m322_4(char **) = Uninitialized[ptr2] : &:r322_3
# 323| r323_1(glval<char *>) = VariableAddress[ptr3] :
# 323| m323_2(char *) = Uninitialized[ptr3] : &:r323_1
# 323| r323_3(glval<char **>) = VariableAddress[ptr4] :
# 323| m323_4(char **) = Uninitialized[ptr4] : &:r323_3
# 325| r325_1(glval<char[1024]>) = VariableAddress[buffer] :
# 325| r325_2(char *) = Convert : r325_1
# 325| r325_3(glval<char *>) = VariableAddress[ptr1] :
# 325| mu325_4(char *) = Store[ptr1] : &:r325_3, r325_2
# 326| r326_1(glval<char *>) = VariableAddress[ptr1] :
# 326| r326_2(char **) = CopyValue : r326_1
# 326| r326_3(glval<char **>) = VariableAddress[ptr2] :
# 326| m326_4(char **) = Store[ptr2] : &:r326_3, r326_2
# 327| r327_1(glval<unknown>) = FunctionAddress[memcpy] :
# 327| r327_2(glval<char **>) = VariableAddress[ptr2] :
# 327| r327_3(char **) = Load[ptr2] : &:r327_2, m326_4
# 327| r327_4(char *) = Load[?] : &:r327_3, ~m?
# 327| r327_5(void *) = Convert : r327_4
# 327| r327_6(glval<char *>) = VariableAddress[s] :
# 327| r327_7(char *) = Load[s] : &:r327_6, m319_5
# 327| r327_8(void *) = Convert : r327_7
# 327| r327_9(int) = Constant[1024] :
# 327| r327_10(void *) = Call[memcpy] : func:r327_1, 0:r327_5, 1:r327_8, 2:r327_9
# 327| v327_11(void) = ^SizedBufferReadSideEffect[1] : &:r327_8, r327_9, ~m?
# 327| mu327_12(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r327_5, r327_9
# 329| r329_1(glval<unknown>) = FunctionAddress[sink] :
# 329| r329_2(glval<char[1024]>) = VariableAddress[buffer] :
# 329| r329_3(char *) = Convert : r329_2
# 329| v329_4(void) = Call[sink] : func:r329_1, 0:r329_3
# 329| mu329_5(unknown) = ^CallSideEffect : ~m?
# 329| v329_6(void) = ^BufferReadSideEffect[0] : &:r329_3, ~m?
# 329| mu329_7(unknown) = ^BufferMayWriteSideEffect[0] : &:r329_3
# 330| r330_1(glval<unknown>) = FunctionAddress[sink] :
# 330| r330_2(glval<char *>) = VariableAddress[ptr1] :
# 330| r330_3(char *) = Load[ptr1] : &:r330_2, ~m?
# 330| v330_4(void) = Call[sink] : func:r330_1, 0:r330_3
# 330| mu330_5(unknown) = ^CallSideEffect : ~m?
# 330| v330_6(void) = ^BufferReadSideEffect[0] : &:r330_3, ~m?
# 330| mu330_7(unknown) = ^BufferMayWriteSideEffect[0] : &:r330_3
# 331| r331_1(glval<unknown>) = FunctionAddress[sink] :
# 331| r331_2(glval<char **>) = VariableAddress[ptr2] :
# 331| r331_3(char **) = Load[ptr2] : &:r331_2, m326_4
# 331| v331_4(void) = Call[sink] : func:r331_1, 0:r331_3
# 331| mu331_5(unknown) = ^CallSideEffect : ~m?
# 331| v331_6(void) = ^BufferReadSideEffect[0] : &:r331_3, ~m?
# 331| mu331_7(unknown) = ^BufferMayWriteSideEffect[0] : &:r331_3
# 332| r332_1(glval<unknown>) = FunctionAddress[sink] :
# 332| r332_2(glval<char **>) = VariableAddress[ptr2] :
# 332| r332_3(char **) = Load[ptr2] : &:r332_2, m326_4
# 332| r332_4(char *) = Load[?] : &:r332_3, ~m?
# 332| v332_5(void) = Call[sink] : func:r332_1, 0:r332_4
# 332| mu332_6(unknown) = ^CallSideEffect : ~m?
# 332| v332_7(void) = ^BufferReadSideEffect[0] : &:r332_4, ~m?
# 332| mu332_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r332_4
# 333| v333_1(void) = NoOp :
# 319| v319_8(void) = ReturnIndirection[s] : &:r319_6, ~m?
# 319| v319_9(void) = ReturnVoid :
# 319| v319_10(void) = AliasedUse : ~m?
# 319| v319_11(void) = ExitFunction :

View File

@@ -1376,3 +1376,77 @@ ssa.cpp:
# 310| v310_11(void) = ReturnVoid :
# 310| v310_12(void) = AliasedUse : ~m?
# 310| v310_13(void) = ExitFunction :
# 319| void DoubleIndirectionEscapes(char*)
# 319| Block 0
# 319| v319_1(void) = EnterFunction :
# 319| mu319_2(unknown) = AliasedDefinition :
# 319| mu319_3(unknown) = InitializeNonLocal :
# 319| r319_4(glval<char *>) = VariableAddress[s] :
# 319| m319_5(char *) = InitializeParameter[s] : &:r319_4
# 319| r319_6(char *) = Load[s] : &:r319_4, m319_5
# 319| mu319_7(unknown) = InitializeIndirection[s] : &:r319_6
# 321| r321_1(glval<char[1024]>) = VariableAddress[buffer] :
# 321| mu321_2(char[1024]) = Uninitialized[buffer] : &:r321_1
# 322| r322_1(glval<char *>) = VariableAddress[ptr1] :
# 322| m322_2(char *) = Uninitialized[ptr1] : &:r322_1
# 322| r322_3(glval<char **>) = VariableAddress[ptr2] :
# 322| m322_4(char **) = Uninitialized[ptr2] : &:r322_3
# 323| r323_1(glval<char *>) = VariableAddress[ptr3] :
# 323| m323_2(char *) = Uninitialized[ptr3] : &:r323_1
# 323| r323_3(glval<char **>) = VariableAddress[ptr4] :
# 323| m323_4(char **) = Uninitialized[ptr4] : &:r323_3
# 325| r325_1(glval<char[1024]>) = VariableAddress[buffer] :
# 325| r325_2(char *) = Convert : r325_1
# 325| r325_3(glval<char *>) = VariableAddress[ptr1] :
# 325| m325_4(char *) = Store[ptr1] : &:r325_3, r325_2
# 326| r326_1(glval<char *>) = VariableAddress[ptr1] :
# 326| r326_2(char **) = CopyValue : r326_1
# 326| r326_3(glval<char **>) = VariableAddress[ptr2] :
# 326| m326_4(char **) = Store[ptr2] : &:r326_3, r326_2
# 327| r327_1(glval<unknown>) = FunctionAddress[memcpy] :
# 327| r327_2(glval<char **>) = VariableAddress[ptr2] :
# 327| r327_3(char **) = Load[ptr2] : &:r327_2, m326_4
# 327| r327_4(char *) = Load[?] : &:r327_3, ~m?
# 327| r327_5(void *) = Convert : r327_4
# 327| r327_6(glval<char *>) = VariableAddress[s] :
# 327| r327_7(char *) = Load[s] : &:r327_6, m319_5
# 327| r327_8(void *) = Convert : r327_7
# 327| r327_9(int) = Constant[1024] :
# 327| r327_10(void *) = Call[memcpy] : func:r327_1, 0:r327_5, 1:r327_8, 2:r327_9
# 327| v327_11(void) = ^SizedBufferReadSideEffect[1] : &:r327_8, r327_9, ~m?
# 327| mu327_12(unknown) = ^SizedBufferMustWriteSideEffect[0] : &:r327_5, r327_9
# 329| r329_1(glval<unknown>) = FunctionAddress[sink] :
# 329| r329_2(glval<char[1024]>) = VariableAddress[buffer] :
# 329| r329_3(char *) = Convert : r329_2
# 329| v329_4(void) = Call[sink] : func:r329_1, 0:r329_3
# 329| mu329_5(unknown) = ^CallSideEffect : ~m?
# 329| v329_6(void) = ^BufferReadSideEffect[0] : &:r329_3, ~m?
# 329| mu329_7(unknown) = ^BufferMayWriteSideEffect[0] : &:r329_3
# 330| r330_1(glval<unknown>) = FunctionAddress[sink] :
# 330| r330_2(glval<char *>) = VariableAddress[ptr1] :
# 330| r330_3(char *) = Load[ptr1] : &:r330_2, m325_4
# 330| v330_4(void) = Call[sink] : func:r330_1, 0:r330_3
# 330| mu330_5(unknown) = ^CallSideEffect : ~m?
# 330| v330_6(void) = ^BufferReadSideEffect[0] : &:r330_3, ~m?
# 330| mu330_7(unknown) = ^BufferMayWriteSideEffect[0] : &:r330_3
# 331| r331_1(glval<unknown>) = FunctionAddress[sink] :
# 331| r331_2(glval<char **>) = VariableAddress[ptr2] :
# 331| r331_3(char **) = Load[ptr2] : &:r331_2, m326_4
# 331| v331_4(void) = Call[sink] : func:r331_1, 0:r331_3
# 331| mu331_5(unknown) = ^CallSideEffect : ~m?
# 331| v331_6(void) = ^BufferReadSideEffect[0] : &:r331_3, ~m?
# 331| mu331_7(unknown) = ^BufferMayWriteSideEffect[0] : &:r331_3
# 332| r332_1(glval<unknown>) = FunctionAddress[sink] :
# 332| r332_2(glval<char **>) = VariableAddress[ptr2] :
# 332| r332_3(char **) = Load[ptr2] : &:r332_2, m326_4
# 332| r332_4(char *) = Load[?] : &:r332_3, ~m?
# 332| v332_5(void) = Call[sink] : func:r332_1, 0:r332_4
# 332| mu332_6(unknown) = ^CallSideEffect : ~m?
# 332| v332_7(void) = ^BufferReadSideEffect[0] : &:r332_4, ~m?
# 332| mu332_8(unknown) = ^BufferMayWriteSideEffect[0] : &:r332_4
# 333| v333_1(void) = NoOp :
# 319| v319_8(void) = ReturnIndirection[s] : &:r319_6, ~m?
# 319| v319_9(void) = ReturnVoid :
# 319| v319_10(void) = AliasedUse : ~m?
# 319| v319_11(void) = ExitFunction :