mirror of
https://github.com/github/codeql.git
synced 2026-04-30 11:15:13 +02:00
C++: Add IR test for strcpy/strcat.
This commit is contained in:
@@ -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:
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user