Skip to content

Commit 7298b68

Browse files
committed
C++: Exclude 'this' params and read/write side effects from static member function calls through qualifiers, and accept tests
1 parent e4e0d3b commit 7298b68

File tree

3 files changed

+27
-30
lines changed

3 files changed

+27
-30
lines changed

cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedCall.qll

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -324,6 +324,15 @@ class TranslatedFunctionCall extends TranslatedCallExpr, TranslatedDirectCall {
324324
override predicate hasWriteSideEffect() {
325325
not expr.getTarget().(SideEffectFunction).hasOnlySpecificWriteSideEffects()
326326
}
327+
328+
override Instruction getQualifierResult() {
329+
hasQualifier() and
330+
result = getQualifier().getResult()
331+
}
332+
333+
override predicate hasQualifier() {
334+
not exists(MemberFunction func | expr.getTarget() = func and func.isStatic())
335+
}
327336
}
328337

329338
/**

cpp/ql/src/semmle/code/cpp/ir/implementation/raw/internal/TranslatedElement.qll

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -463,7 +463,9 @@ newtype TTranslatedElement =
463463
expr = call.getArgument(n).getFullyConverted()
464464
or
465465
expr = call.getQualifier().getFullyConverted() and
466-
n = -1
466+
n = -1 and
467+
// Exclude calls to static member functions. They don't modify the qualifier
468+
not exists(MemberFunction func | func = call.getTarget() and func.isStatic())
467469
) and
468470
(
469471
call.getTarget().(SideEffectFunction).hasSpecificReadSideEffect(n, _) and

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

Lines changed: 15 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -6550,10 +6550,8 @@ ir.cpp:
65506550
# 1272| r1272_1(glval<C>) = VariableAddress[c] :
65516551
# 1272| r1272_2(glval<unknown>) = FunctionAddress[StaticMemberFunction] :
65526552
# 1272| r1272_3(int) = Constant[10] :
6553-
# 1272| r1272_4(int) = Call : func:r1272_2, this:r1272_1, 0:r1272_3
6553+
# 1272| r1272_4(int) = Call : func:r1272_2, 0:r1272_3
65546554
# 1272| mu1272_5(unknown) = ^CallSideEffect : ~mu1270_4
6555-
# 1272| v1272_6(void) = ^BufferReadSideEffect[-1] : &:r1272_1, ~mu1270_4
6556-
# 1272| mu1272_7(C) = ^IndirectMayWriteSideEffect[-1] : &:r1272_1
65576555
# 1273| r1273_1(glval<unknown>) = FunctionAddress[StaticMemberFunction] :
65586556
# 1273| r1273_2(int) = Constant[10] :
65596557
# 1273| r1273_3(int) = Call : func:r1273_1, 0:r1273_2
@@ -6566,12 +6564,10 @@ ir.cpp:
65666564
# 1276| r1276_4(A *) = CopyValue : r1276_3
65676565
# 1276| r1276_5(glval<int>) = VariableAddress[int_arg] :
65686566
# 1276| r1276_6(int) = Load : &:r1276_5, ~mu1270_4
6569-
# 1276| v1276_7(void) = Call : func:r1276_2, this:r1276_1, 0:r1276_4, 1:r1276_6
6567+
# 1276| v1276_7(void) = Call : func:r1276_2, 0:r1276_4, 1:r1276_6
65706568
# 1276| mu1276_8(unknown) = ^CallSideEffect : ~mu1270_4
6571-
# 1276| v1276_9(void) = ^BufferReadSideEffect[-1] : &:r1276_1, ~mu1270_4
6572-
# 1276| v1276_10(void) = ^BufferReadSideEffect[0] : &:r1276_4, ~mu1270_4
6573-
# 1276| mu1276_11(A) = ^IndirectMayWriteSideEffect[-1] : &:r1276_1
6574-
# 1276| mu1276_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r1276_4
6569+
# 1276| v1276_9(void) = ^BufferReadSideEffect[0] : &:r1276_4, ~mu1270_4
6570+
# 1276| mu1276_10(unknown) = ^BufferMayWriteSideEffect[0] : &:r1276_4
65756571
# 1277| r1277_1(glval<unknown>) = FunctionAddress[static_member] :
65766572
# 1277| r1277_2(glval<A>) = VariableAddress[a] :
65776573
# 1277| r1277_3(A *) = CopyValue : r1277_2
@@ -6590,54 +6586,44 @@ ir.cpp:
65906586
# 1279| r1279_7(int) = Load : &:r1279_6, ~mu1270_4
65916587
# 1279| r1279_8(int) = Constant[2] :
65926588
# 1279| r1279_9(int) = Add : r1279_7, r1279_8
6593-
# 1279| v1279_10(void) = Call : func:r1279_3, this:r1279_2, 0:r1279_5, 1:r1279_9
6589+
# 1279| v1279_10(void) = Call : func:r1279_3, 0:r1279_5, 1:r1279_9
65946590
# 1279| mu1279_11(unknown) = ^CallSideEffect : ~mu1270_4
6595-
# 1279| v1279_12(void) = ^BufferReadSideEffect[-1] : &:r1279_2, ~mu1270_4
6596-
# 1279| v1279_13(void) = ^BufferReadSideEffect[0] : &:r1279_5, ~mu1270_4
6597-
# 1279| mu1279_14(A) = ^IndirectMayWriteSideEffect[-1] : &:r1279_2
6598-
# 1279| mu1279_15(unknown) = ^BufferMayWriteSideEffect[0] : &:r1279_5
6591+
# 1279| v1279_12(void) = ^BufferReadSideEffect[0] : &:r1279_5, ~mu1270_4
6592+
# 1279| mu1279_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r1279_5
65996593
# 1280| r1280_1(glval<A *>) = VariableAddress[a_arg] :
66006594
# 1280| r1280_2(A *) = Load : &:r1280_1, ~mu1270_4
66016595
# 1280| r1280_3(glval<A>) = CopyValue : r1280_2
66026596
# 1280| r1280_4(glval<unknown>) = FunctionAddress[static_member] :
66036597
# 1280| r1280_5(glval<A>) = VariableAddress[a] :
66046598
# 1280| r1280_6(A *) = CopyValue : r1280_5
66056599
# 1280| r1280_7(int) = Constant[99] :
6606-
# 1280| v1280_8(void) = Call : func:r1280_4, this:r1280_3, 0:r1280_6, 1:r1280_7
6600+
# 1280| v1280_8(void) = Call : func:r1280_4, 0:r1280_6, 1:r1280_7
66076601
# 1280| mu1280_9(unknown) = ^CallSideEffect : ~mu1270_4
6608-
# 1280| v1280_10(void) = ^BufferReadSideEffect[-1] : &:r1280_3, ~mu1270_4
6609-
# 1280| v1280_11(void) = ^BufferReadSideEffect[0] : &:r1280_6, ~mu1270_4
6610-
# 1280| mu1280_12(A) = ^IndirectMayWriteSideEffect[-1] : &:r1280_3
6611-
# 1280| mu1280_13(unknown) = ^BufferMayWriteSideEffect[0] : &:r1280_6
6602+
# 1280| v1280_10(void) = ^BufferReadSideEffect[0] : &:r1280_6, ~mu1270_4
6603+
# 1280| mu1280_11(unknown) = ^BufferMayWriteSideEffect[0] : &:r1280_6
66126604
# 1281| r1281_1(glval<A *>) = VariableAddress[a_arg] :
66136605
# 1281| r1281_2(A *) = Load : &:r1281_1, ~mu1270_4
66146606
# 1281| r1281_3(glval<unknown>) = FunctionAddress[static_member] :
66156607
# 1281| r1281_4(glval<A *>) = VariableAddress[a_arg] :
66166608
# 1281| r1281_5(A *) = Load : &:r1281_4, ~mu1270_4
66176609
# 1281| r1281_6(int) = Constant[-1] :
6618-
# 1281| v1281_7(void) = Call : func:r1281_3, this:r1281_2, 0:r1281_5, 1:r1281_6
6610+
# 1281| v1281_7(void) = Call : func:r1281_3, 0:r1281_5, 1:r1281_6
66196611
# 1281| mu1281_8(unknown) = ^CallSideEffect : ~mu1270_4
6620-
# 1281| v1281_9(void) = ^BufferReadSideEffect[-1] : &:r1281_2, ~mu1270_4
6621-
# 1281| v1281_10(void) = ^BufferReadSideEffect[0] : &:r1281_5, ~mu1270_4
6622-
# 1281| mu1281_11(A) = ^IndirectMayWriteSideEffect[-1] : &:r1281_2
6623-
# 1281| mu1281_12(unknown) = ^BufferMayWriteSideEffect[0] : &:r1281_5
6612+
# 1281| v1281_9(void) = ^BufferReadSideEffect[0] : &:r1281_5, ~mu1270_4
6613+
# 1281| mu1281_10(unknown) = ^BufferMayWriteSideEffect[0] : &:r1281_5
66246614
# 1283| r1283_1(glval<A>) = VariableAddress[a] :
66256615
# 1283| r1283_2(glval<unknown>) = FunctionAddress[static_member_without_def] :
6626-
# 1283| v1283_3(void) = Call : func:r1283_2, this:r1283_1
6616+
# 1283| v1283_3(void) = Call : func:r1283_2
66276617
# 1283| mu1283_4(unknown) = ^CallSideEffect : ~mu1270_4
6628-
# 1283| v1283_5(void) = ^BufferReadSideEffect[-1] : &:r1283_1, ~mu1270_4
6629-
# 1283| mu1283_6(A) = ^IndirectMayWriteSideEffect[-1] : &:r1283_1
66306618
# 1284| r1284_1(glval<unknown>) = FunctionAddress[static_member_without_def] :
66316619
# 1284| v1284_2(void) = Call : func:r1284_1
66326620
# 1284| mu1284_3(unknown) = ^CallSideEffect : ~mu1270_4
66336621
# 1286| r1286_1(glval<unknown>) = FunctionAddress[getAnInstanceOfA] :
66346622
# 1286| r1286_2(A *) = Call : func:r1286_1
66356623
# 1286| mu1286_3(unknown) = ^CallSideEffect : ~mu1270_4
66366624
# 1286| r1286_4(glval<unknown>) = FunctionAddress[static_member_without_def] :
6637-
# 1286| v1286_5(void) = Call : func:r1286_4, this:r1286_2
6625+
# 1286| v1286_5(void) = Call : func:r1286_4
66386626
# 1286| mu1286_6(unknown) = ^CallSideEffect : ~mu1270_4
6639-
# 1286| v1286_7(void) = ^BufferReadSideEffect[-1] : &:r1286_2, ~mu1270_4
6640-
# 1286| mu1286_8(A) = ^IndirectMayWriteSideEffect[-1] : &:r1286_2
66416627
# 1287| v1287_1(void) = NoOp :
66426628
# 1270| v1270_11(void) = ReturnIndirection : &:r1270_9, ~mu1270_4
66436629
# 1270| v1270_12(void) = ReturnVoid :

0 commit comments

Comments
 (0)