Skip to content

Commit 4012813

Browse files
committed
C++: Fix IR edge case where there are no function calls taking an argument
1 parent 96bd9a9 commit 4012813

File tree

2 files changed

+14
-8
lines changed

2 files changed

+14
-8
lines changed

cpp/ql/lib/semmle/code/cpp/ir/internal/IRCppLanguage.qll

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,8 +67,13 @@ class Class = Cpp::Class; // Used for inheritance conversions
6767
predicate hasCaseEdge(string minValue, string maxValue) { hasCaseEdge(_, minValue, maxValue) }
6868

6969
predicate hasPositionalArgIndex(int argIndex) {
70-
exists(Cpp::FunctionCall call | exists(call.getArgument(argIndex))) or
70+
exists(Cpp::FunctionCall call | exists(call.getArgument(argIndex)))
71+
or
7172
exists(Cpp::BuiltInOperation op | exists(op.getChild(argIndex)))
73+
or
74+
// Ensure we are always able to output the argument of a call to the delete operator.
75+
exists(Cpp::DeleteExpr d) and
76+
argIndex = 0
7277
}
7378

7479
predicate hasAsmOperandIndex(int operandIndex) {

cpp/ql/test/library-tests/ir/no-function-calls/aliased_ir.expected

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,17 +9,18 @@ test.cpp:
99
# 5| m5_6(int *) = InitializeParameter[x] : &:r5_5
1010
# 5| r5_7(int *) = Load[x] : &:r5_5, m5_6
1111
# 5| m5_8(unknown) = InitializeIndirection[x] : &:r5_7
12+
# 5| m5_9(unknown) = Chi : total:m5_4, partial:m5_8
1213
# 6| r6_1(glval<unknown>) = FunctionAddress[operator delete] :
1314
# 6| r6_2(glval<int *>) = VariableAddress[x] :
1415
# 6| r6_3(int *) = Load[x] : &:r6_2, m5_6
15-
# 6| v6_4(void) = Call[operator delete] : func:r6_1
16-
# 6| m6_5(unknown) = ^CallSideEffect : ~m5_4
17-
# 6| m6_6(unknown) = Chi : total:m5_4, partial:m6_5
16+
# 6| v6_4(void) = Call[operator delete] : func:r6_1, 0:r6_3
17+
# 6| m6_5(unknown) = ^CallSideEffect : ~m5_9
18+
# 6| m6_6(unknown) = Chi : total:m5_9, partial:m6_5
1819
# 7| v7_1(void) = NoOp :
19-
# 5| v5_9(void) = ReturnIndirection[x] : &:r5_7, m5_8
20-
# 5| v5_10(void) = ReturnVoid :
21-
# 5| v5_11(void) = AliasedUse : ~m6_6
22-
# 5| v5_12(void) = ExitFunction :
20+
# 5| v5_10(void) = ReturnIndirection[x] : &:r5_7, ~m6_6
21+
# 5| v5_11(void) = ReturnVoid :
22+
# 5| v5_12(void) = AliasedUse : ~m6_6
23+
# 5| v5_13(void) = ExitFunction :
2324

2425
# 11| void jazz()
2526
# 11| Block 0

0 commit comments

Comments
 (0)