Skip to content

Commit 0c94666

Browse files
committed
C++: Add IR test for strcpy/strcat.
1 parent 17c57dc commit 0c94666

File tree

3 files changed

+138
-0
lines changed

3 files changed

+138
-0
lines changed

cpp/ql/test/library-tests/ir/ir/PrintAST.expected

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8303,6 +8303,76 @@ ir.cpp:
83038303
# 1219| Type = [IntType] int
83048304
# 1219| ValueCategory = prvalue(load)
83058305
# 1220| 4: [ReturnStmt] return ...
8306+
# 1224| [TopLevelFunction] char* strcpy(char*, char const*)
8307+
# 1224| params:
8308+
# 1224| 0: [Parameter] destination
8309+
# 1224| Type = [CharPointerType] char *
8310+
# 1224| 1: [Parameter] source
8311+
# 1224| Type = [PointerType] const char *
8312+
# 1225| [TopLevelFunction] char* strcat(char*, char const*)
8313+
# 1225| params:
8314+
# 1225| 0: [Parameter] destination
8315+
# 1225| Type = [CharPointerType] char *
8316+
# 1225| 1: [Parameter] source
8317+
# 1225| Type = [PointerType] const char *
8318+
# 1227| [TopLevelFunction] void test_strings(char*, char*)
8319+
# 1227| params:
8320+
# 1227| 0: [Parameter] s1
8321+
# 1227| Type = [CharPointerType] char *
8322+
# 1227| 1: [Parameter] s2
8323+
# 1227| Type = [CharPointerType] char *
8324+
# 1227| body: [Block] { ... }
8325+
# 1228| 0: [DeclStmt] declaration
8326+
# 1228| 0: [VariableDeclarationEntry] definition of buffer
8327+
# 1228| Type = [ArrayType] char[1024]
8328+
# 1228| init: [Initializer] initializer for buffer
8329+
# 1228| expr: [ArrayAggregateLiteral] {...}
8330+
# 1228| Type = [ArrayType] char[1024]
8331+
# 1228| ValueCategory = prvalue
8332+
# 1228| [0]: [CStyleCast] (char)...
8333+
# 1228| Conversion = [IntegralConversion] integral conversion
8334+
# 1228| Type = [PlainCharType] char
8335+
# 1228| Value = [CStyleCast] 0
8336+
# 1228| ValueCategory = prvalue
8337+
# 1228| expr: [Literal] 0
8338+
# 1228| Type = [IntType] int
8339+
# 1228| Value = [Literal] 0
8340+
# 1228| ValueCategory = prvalue
8341+
# 1230| 1: [ExprStmt] ExprStmt
8342+
# 1230| 0: [FunctionCall] call to strcpy
8343+
# 1230| Type = [CharPointerType] char *
8344+
# 1230| ValueCategory = prvalue
8345+
# 1230| 0: [ArrayToPointerConversion] array to pointer conversion
8346+
# 1230| Type = [CharPointerType] char *
8347+
# 1230| ValueCategory = prvalue
8348+
# 1230| expr: [VariableAccess] buffer
8349+
# 1230| Type = [ArrayType] char[1024]
8350+
# 1230| ValueCategory = lvalue
8351+
# 1230| 1: [CStyleCast] (const char *)...
8352+
# 1230| Conversion = [PointerConversion] pointer conversion
8353+
# 1230| Type = [PointerType] const char *
8354+
# 1230| ValueCategory = prvalue
8355+
# 1230| expr: [VariableAccess] s1
8356+
# 1230| Type = [CharPointerType] char *
8357+
# 1230| ValueCategory = prvalue(load)
8358+
# 1231| 2: [ExprStmt] ExprStmt
8359+
# 1231| 0: [FunctionCall] call to strcat
8360+
# 1231| Type = [CharPointerType] char *
8361+
# 1231| ValueCategory = prvalue
8362+
# 1231| 0: [ArrayToPointerConversion] array to pointer conversion
8363+
# 1231| Type = [CharPointerType] char *
8364+
# 1231| ValueCategory = prvalue
8365+
# 1231| expr: [VariableAccess] buffer
8366+
# 1231| Type = [ArrayType] char[1024]
8367+
# 1231| ValueCategory = lvalue
8368+
# 1231| 1: [CStyleCast] (const char *)...
8369+
# 1231| Conversion = [PointerConversion] pointer conversion
8370+
# 1231| Type = [PointerType] const char *
8371+
# 1231| ValueCategory = prvalue
8372+
# 1231| expr: [VariableAccess] s2
8373+
# 1231| Type = [CharPointerType] char *
8374+
# 1231| ValueCategory = prvalue(load)
8375+
# 1232| 3: [ReturnStmt] return ...
83068376
perf-regression.cpp:
83078377
# 4| [CopyAssignmentOperator] Big& Big::operator=(Big const&)
83088378
# 4| params:

cpp/ql/test/library-tests/ir/ir/ir.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1219,4 +1219,16 @@ void switch2Case_default(int x) {
12191219
int z = y;
12201220
}
12211221

1222+
// --- strings ---
1223+
1224+
char *strcpy(char *destination, const char *source);
1225+
char *strcat(char *destination, const char *source);
1226+
1227+
void test_strings(char *s1, char *s2) {
1228+
char buffer[1024] = {0};
1229+
1230+
strcpy(buffer, s1);
1231+
strcat(buffer, s2);
1232+
}
1233+
12221234
// semmle-extractor-options: -std=c++17 --clang

cpp/ql/test/library-tests/ir/ir/raw_ir.expected

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6228,6 +6228,62 @@ ir.cpp:
62286228
# 1205| v1205_9(void) = AliasedUse : ~mu1205_4
62296229
# 1205| v1205_10(void) = ExitFunction :
62306230

6231+
# 1227| void test_strings(char*, char*)
6232+
# 1227| Block 0
6233+
# 1227| v1227_1(void) = EnterFunction :
6234+
# 1227| mu1227_2(unknown) = AliasedDefinition :
6235+
# 1227| mu1227_3(unknown) = InitializeNonLocal :
6236+
# 1227| mu1227_4(unknown) = UnmodeledDefinition :
6237+
# 1227| r1227_5(glval<char *>) = VariableAddress[s1] :
6238+
# 1227| mu1227_6(char *) = InitializeParameter[s1] : &:r1227_5
6239+
# 1227| r1227_7(char *) = Load : &:r1227_5, ~mu1227_6
6240+
# 1227| mu1227_8(unknown) = InitializeIndirection[s1] : &:r1227_7
6241+
# 1227| r1227_9(glval<char *>) = VariableAddress[s2] :
6242+
# 1227| mu1227_10(char *) = InitializeParameter[s2] : &:r1227_9
6243+
# 1227| r1227_11(char *) = Load : &:r1227_9, ~mu1227_10
6244+
# 1227| mu1227_12(unknown) = InitializeIndirection[s2] : &:r1227_11
6245+
# 1228| r1228_1(glval<char[1024]>) = VariableAddress[buffer] :
6246+
# 1228| mu1228_2(char[1024]) = Uninitialized[buffer] : &:r1228_1
6247+
# 1228| r1228_3(int) = Constant[0] :
6248+
# 1228| r1228_4(glval<char>) = PointerAdd[1] : r1228_1, r1228_3
6249+
# 1228| r1228_5(char) = Constant[0] :
6250+
# 1228| mu1228_6(char) = Store : &:r1228_4, r1228_5
6251+
# 1228| r1228_7(int) = Constant[1] :
6252+
# 1228| r1228_8(glval<char>) = PointerAdd[1] : r1228_1, r1228_7
6253+
# 1228| r1228_9(unknown[1023]) = Constant[0] :
6254+
# 1228| mu1228_10(unknown[1023]) = Store : &:r1228_8, r1228_9
6255+
# 1230| r1230_1(glval<unknown>) = FunctionAddress[strcpy] :
6256+
# 1230| r1230_2(glval<char[1024]>) = VariableAddress[buffer] :
6257+
# 1230| r1230_3(char *) = Convert : r1230_2
6258+
# 1230| r1230_4(glval<char *>) = VariableAddress[s1] :
6259+
# 1230| r1230_5(char *) = Load : &:r1230_4, ~mu1227_4
6260+
# 1230| r1230_6(char *) = Convert : r1230_5
6261+
# 1230| r1230_7(char *) = Call : func:r1230_1, 0:r1230_3, 1:r1230_6
6262+
# 1230| mu1230_8(unknown) = ^CallSideEffect : ~mu1227_4
6263+
# 1230| v1230_9(void) = ^BufferReadSideEffect[0] : &:r1230_3, ~mu1227_4
6264+
# 1230| v1230_10(void) = ^BufferReadSideEffect[1] : &:r1230_6, ~mu1227_4
6265+
# 1230| mu1230_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r1230_3
6266+
# 1230| mu1230_12(unknown) = ^BufferMayWriteSideEffect[1] : &:r1230_6
6267+
# 1231| r1231_1(glval<unknown>) = FunctionAddress[strcat] :
6268+
# 1231| r1231_2(glval<char[1024]>) = VariableAddress[buffer] :
6269+
# 1231| r1231_3(char *) = Convert : r1231_2
6270+
# 1231| r1231_4(glval<char *>) = VariableAddress[s2] :
6271+
# 1231| r1231_5(char *) = Load : &:r1231_4, ~mu1227_4
6272+
# 1231| r1231_6(char *) = Convert : r1231_5
6273+
# 1231| r1231_7(char *) = Call : func:r1231_1, 0:r1231_3, 1:r1231_6
6274+
# 1231| mu1231_8(unknown) = ^CallSideEffect : ~mu1227_4
6275+
# 1231| v1231_9(void) = ^BufferReadSideEffect[0] : &:r1231_3, ~mu1227_4
6276+
# 1231| v1231_10(void) = ^BufferReadSideEffect[1] : &:r1231_6, ~mu1227_4
6277+
# 1231| mu1231_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r1231_3
6278+
# 1231| mu1231_12(unknown) = ^BufferMayWriteSideEffect[1] : &:r1231_6
6279+
# 1232| v1232_1(void) = NoOp :
6280+
# 1227| v1227_13(void) = ReturnIndirection : &:r1227_7, ~mu1227_4
6281+
# 1227| v1227_14(void) = ReturnIndirection : &:r1227_11, ~mu1227_4
6282+
# 1227| v1227_15(void) = ReturnVoid :
6283+
# 1227| v1227_16(void) = UnmodeledUse : mu*
6284+
# 1227| v1227_17(void) = AliasedUse : ~mu1227_4
6285+
# 1227| v1227_18(void) = ExitFunction :
6286+
62316287
perf-regression.cpp:
62326288
# 6| void Big::Big()
62336289
# 6| Block 0

0 commit comments

Comments
 (0)