C++: Add IR test for strcpy/strcat.

This commit is contained in:
Geoffrey White
2020-03-18 16:26:30 +00:00
parent 17c57dcb4c
commit 0c9466640a
3 changed files with 138 additions and 0 deletions

View File

@@ -8303,6 +8303,76 @@ ir.cpp:
# 1219| Type = [IntType] int
# 1219| ValueCategory = prvalue(load)
# 1220| 4: [ReturnStmt] return ...
# 1224| [TopLevelFunction] char* strcpy(char*, char const*)
# 1224| params:
# 1224| 0: [Parameter] destination
# 1224| Type = [CharPointerType] char *
# 1224| 1: [Parameter] source
# 1224| Type = [PointerType] const char *
# 1225| [TopLevelFunction] char* strcat(char*, char const*)
# 1225| params:
# 1225| 0: [Parameter] destination
# 1225| Type = [CharPointerType] char *
# 1225| 1: [Parameter] source
# 1225| Type = [PointerType] const char *
# 1227| [TopLevelFunction] void test_strings(char*, char*)
# 1227| params:
# 1227| 0: [Parameter] s1
# 1227| Type = [CharPointerType] char *
# 1227| 1: [Parameter] s2
# 1227| Type = [CharPointerType] char *
# 1227| body: [Block] { ... }
# 1228| 0: [DeclStmt] declaration
# 1228| 0: [VariableDeclarationEntry] definition of buffer
# 1228| Type = [ArrayType] char[1024]
# 1228| init: [Initializer] initializer for buffer
# 1228| expr: [ArrayAggregateLiteral] {...}
# 1228| Type = [ArrayType] char[1024]
# 1228| ValueCategory = prvalue
# 1228| [0]: [CStyleCast] (char)...
# 1228| Conversion = [IntegralConversion] integral conversion
# 1228| Type = [PlainCharType] char
# 1228| Value = [CStyleCast] 0
# 1228| ValueCategory = prvalue
# 1228| expr: [Literal] 0
# 1228| Type = [IntType] int
# 1228| Value = [Literal] 0
# 1228| ValueCategory = prvalue
# 1230| 1: [ExprStmt] ExprStmt
# 1230| 0: [FunctionCall] call to strcpy
# 1230| Type = [CharPointerType] char *
# 1230| ValueCategory = prvalue
# 1230| 0: [ArrayToPointerConversion] array to pointer conversion
# 1230| Type = [CharPointerType] char *
# 1230| ValueCategory = prvalue
# 1230| expr: [VariableAccess] buffer
# 1230| Type = [ArrayType] char[1024]
# 1230| ValueCategory = lvalue
# 1230| 1: [CStyleCast] (const char *)...
# 1230| Conversion = [PointerConversion] pointer conversion
# 1230| Type = [PointerType] const char *
# 1230| ValueCategory = prvalue
# 1230| expr: [VariableAccess] s1
# 1230| Type = [CharPointerType] char *
# 1230| ValueCategory = prvalue(load)
# 1231| 2: [ExprStmt] ExprStmt
# 1231| 0: [FunctionCall] call to strcat
# 1231| Type = [CharPointerType] char *
# 1231| ValueCategory = prvalue
# 1231| 0: [ArrayToPointerConversion] array to pointer conversion
# 1231| Type = [CharPointerType] char *
# 1231| ValueCategory = prvalue
# 1231| expr: [VariableAccess] buffer
# 1231| Type = [ArrayType] char[1024]
# 1231| ValueCategory = lvalue
# 1231| 1: [CStyleCast] (const char *)...
# 1231| Conversion = [PointerConversion] pointer conversion
# 1231| Type = [PointerType] const char *
# 1231| ValueCategory = prvalue
# 1231| expr: [VariableAccess] s2
# 1231| Type = [CharPointerType] char *
# 1231| ValueCategory = prvalue(load)
# 1232| 3: [ReturnStmt] return ...
perf-regression.cpp:
# 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&)
# 4| params:

View File

@@ -1219,4 +1219,16 @@ void switch2Case_default(int x) {
int z = y;
}
// --- strings ---
char *strcpy(char *destination, const char *source);
char *strcat(char *destination, const char *source);
void test_strings(char *s1, char *s2) {
char buffer[1024] = {0};
strcpy(buffer, s1);
strcat(buffer, s2);
}
// semmle-extractor-options: -std=c++17 --clang

View File

@@ -6228,6 +6228,62 @@ ir.cpp:
# 1205| v1205_9(void) = AliasedUse : ~mu1205_4
# 1205| v1205_10(void) = ExitFunction :
# 1227| void test_strings(char*, char*)
# 1227| Block 0
# 1227| v1227_1(void) = EnterFunction :
# 1227| mu1227_2(unknown) = AliasedDefinition :
# 1227| mu1227_3(unknown) = InitializeNonLocal :
# 1227| mu1227_4(unknown) = UnmodeledDefinition :
# 1227| r1227_5(glval<char *>) = VariableAddress[s1] :
# 1227| mu1227_6(char *) = InitializeParameter[s1] : &:r1227_5
# 1227| r1227_7(char *) = Load : &:r1227_5, ~mu1227_6
# 1227| mu1227_8(unknown) = InitializeIndirection[s1] : &:r1227_7
# 1227| r1227_9(glval<char *>) = VariableAddress[s2] :
# 1227| mu1227_10(char *) = InitializeParameter[s2] : &:r1227_9
# 1227| r1227_11(char *) = Load : &:r1227_9, ~mu1227_10
# 1227| mu1227_12(unknown) = InitializeIndirection[s2] : &:r1227_11
# 1228| r1228_1(glval<char[1024]>) = VariableAddress[buffer] :
# 1228| mu1228_2(char[1024]) = Uninitialized[buffer] : &:r1228_1
# 1228| r1228_3(int) = Constant[0] :
# 1228| r1228_4(glval<char>) = PointerAdd[1] : r1228_1, r1228_3
# 1228| r1228_5(char) = Constant[0] :
# 1228| mu1228_6(char) = Store : &:r1228_4, r1228_5
# 1228| r1228_7(int) = Constant[1] :
# 1228| r1228_8(glval<char>) = PointerAdd[1] : r1228_1, r1228_7
# 1228| r1228_9(unknown[1023]) = Constant[0] :
# 1228| mu1228_10(unknown[1023]) = Store : &:r1228_8, r1228_9
# 1230| r1230_1(glval<unknown>) = FunctionAddress[strcpy] :
# 1230| r1230_2(glval<char[1024]>) = VariableAddress[buffer] :
# 1230| r1230_3(char *) = Convert : r1230_2
# 1230| r1230_4(glval<char *>) = VariableAddress[s1] :
# 1230| r1230_5(char *) = Load : &:r1230_4, ~mu1227_4
# 1230| r1230_6(char *) = Convert : r1230_5
# 1230| r1230_7(char *) = Call : func:r1230_1, 0:r1230_3, 1:r1230_6
# 1230| mu1230_8(unknown) = ^CallSideEffect : ~mu1227_4
# 1230| v1230_9(void) = ^BufferReadSideEffect[0] : &:r1230_3, ~mu1227_4
# 1230| v1230_10(void) = ^BufferReadSideEffect[1] : &:r1230_6, ~mu1227_4
# 1230| mu1230_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r1230_3
# 1230| mu1230_12(unknown) = ^BufferMayWriteSideEffect[1] : &:r1230_6
# 1231| r1231_1(glval<unknown>) = FunctionAddress[strcat] :
# 1231| r1231_2(glval<char[1024]>) = VariableAddress[buffer] :
# 1231| r1231_3(char *) = Convert : r1231_2
# 1231| r1231_4(glval<char *>) = VariableAddress[s2] :
# 1231| r1231_5(char *) = Load : &:r1231_4, ~mu1227_4
# 1231| r1231_6(char *) = Convert : r1231_5
# 1231| r1231_7(char *) = Call : func:r1231_1, 0:r1231_3, 1:r1231_6
# 1231| mu1231_8(unknown) = ^CallSideEffect : ~mu1227_4
# 1231| v1231_9(void) = ^BufferReadSideEffect[0] : &:r1231_3, ~mu1227_4
# 1231| v1231_10(void) = ^BufferReadSideEffect[1] : &:r1231_6, ~mu1227_4
# 1231| mu1231_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r1231_3
# 1231| mu1231_12(unknown) = ^BufferMayWriteSideEffect[1] : &:r1231_6
# 1232| v1232_1(void) = NoOp :
# 1227| v1227_13(void) = ReturnIndirection : &:r1227_7, ~mu1227_4
# 1227| v1227_14(void) = ReturnIndirection : &:r1227_11, ~mu1227_4
# 1227| v1227_15(void) = ReturnVoid :
# 1227| v1227_16(void) = UnmodeledUse : mu*
# 1227| v1227_17(void) = AliasedUse : ~mu1227_4
# 1227| v1227_18(void) = ExitFunction :
perf-regression.cpp:
# 6| void Big::Big()
# 6| Block 0