Skip to content

Commit d50e223

Browse files
committed
WIP: Side effects
1 parent 8171951 commit d50e223

File tree

4 files changed

+51
-13
lines changed

4 files changed

+51
-13
lines changed

cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/SideEffects.qll

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -142,15 +142,23 @@ class CallOrAllocationExpr extends Expr {
142142
this instanceof NewOrNewArrayExpr
143143
or
144144
this instanceof DeleteOrDeleteArrayExpr
145+
or
146+
exists(
147+
ConstructorFieldInit init |
148+
this = init and
149+
not exists(init.getExpr()) and
150+
exists(init.getTarget().getInitializer()))
145151
}
146152

147-
/** Gets the `Function` invoked by this expression, if known. */
148-
final Function getTarget() {
153+
/** Gets the `Declaration` invoked by this expression, if known. */
154+
final Declaration getTarget() {
149155
result = this.(Call).getTarget()
150156
or
151157
result = this.(NewOrNewArrayExpr).getAllocator()
152158
or
153159
result = this.(DeleteOrDeleteArrayExpr).getDeallocator()
160+
or
161+
result = this.(ConstructorFieldInit).getTarget()
154162
}
155163
}
156164

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

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ private import SideEffects
1010
private import TranslatedElement
1111
private import TranslatedExpr
1212
private import TranslatedFunction
13+
private import TranslatedInitialization
1314
private import DefaultOptions as DefaultOptions
1415

1516
/**
@@ -429,6 +430,9 @@ class TranslatedCallSideEffects extends TranslatedSideEffects, TTranslatedCallSi
429430
or
430431
expr instanceof DeleteOrDeleteArrayExpr and
431432
result = getTranslatedDeleteOrDeleteArray(expr).getInstruction(CallTag())
433+
or
434+
expr instanceof ConstructorFieldInit and
435+
result = getTranslatedConstructorFieldInitialization(expr).getInstruction(CallTag())
432436
}
433437
}
434438

@@ -508,7 +512,7 @@ abstract class TranslatedSideEffect extends TranslatedElement {
508512
* The IR translation of a single argument side effect for a call.
509513
*/
510514
abstract class TranslatedArgumentSideEffect extends TranslatedSideEffect {
511-
Call call;
515+
CallOrAllocationExpr callOrInit;
512516
int index;
513517
SideEffectOpcode sideEffectOpcode;
514518

@@ -524,7 +528,7 @@ abstract class TranslatedArgumentSideEffect extends TranslatedSideEffect {
524528
result = "(read side effect for " + this.getArgString() + ")"
525529
}
526530

527-
override Call getPrimaryExpr() { result = call }
531+
override Expr getPrimaryExpr() { result = callOrInit }
528532

529533
override predicate sortOrder(int group, int indexInGroup) {
530534
indexInGroup = index and
@@ -586,7 +590,7 @@ abstract class TranslatedArgumentSideEffect extends TranslatedSideEffect {
586590
tag instanceof OnlyInstructionTag and
587591
operandTag instanceof BufferSizeOperandTag and
588592
result =
589-
getTranslatedExpr(call.getArgument(call.getTarget()
593+
getTranslatedExpr(callOrInit.(Call).getArgument(callOrInit.getTarget()
590594
.(SideEffectFunction)
591595
.getParameterSizeIndex(index)).getFullyConverted()).getResult()
592596
}
@@ -616,7 +620,7 @@ class TranslatedArgumentExprSideEffect extends TranslatedArgumentSideEffect,
616620
Expr arg;
617621

618622
TranslatedArgumentExprSideEffect() {
619-
this = TTranslatedArgumentExprSideEffect(call, arg, index, sideEffectOpcode)
623+
this = TTranslatedArgumentExprSideEffect(callOrInit, arg, index, sideEffectOpcode)
620624
}
621625

622626
final override Locatable getAst() { result = arg }
@@ -647,21 +651,24 @@ class TranslatedStructorQualifierSideEffect extends TranslatedArgumentSideEffect
647651
TTranslatedStructorQualifierSideEffect
648652
{
649653
TranslatedStructorQualifierSideEffect() {
650-
this = TTranslatedStructorQualifierSideEffect(call, sideEffectOpcode) and
654+
this = TTranslatedStructorQualifierSideEffect(callOrInit, sideEffectOpcode) and
651655
index = -1
652656
}
653657

654-
final override Locatable getAst() { result = call }
658+
final override Locatable getAst() { result = callOrInit }
655659

656-
final override Type getIndirectionType() { result = call.getTarget().getDeclaringType() }
660+
final override Type getIndirectionType() { result = callOrInit.getTarget().getDeclaringType() }
657661

658662
final override string getArgString() { result = "this" }
659663

660664
final override Instruction getArgInstruction() {
661665
exists(TranslatedStructorCall structorCall |
662-
structorCall.getExpr() = call and
666+
structorCall.getExpr() = callOrInit and
663667
result = structorCall.getQualifierResult()
664668
)
669+
or
670+
callOrInit instanceof ConstructorFieldInit and
671+
result = getTranslatedFunction(callOrInit.getEnclosingFunction()).getLoadThisInstruction()
665672
}
666673
}
667674

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

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -920,11 +920,23 @@ newtype TTranslatedElement =
920920
} or
921921
// Constructor calls lack a qualifier (`this`) expression, so we need to handle the side effects
922922
// on `*this` without an `Expr`.
923-
TTranslatedStructorQualifierSideEffect(Call call, SideEffectOpcode opcode) {
923+
TTranslatedStructorQualifierSideEffect(CallOrAllocationExpr call, SideEffectOpcode opcode) {
924924
not ignoreExpr(call) and
925925
not ignoreSideEffects(call) and
926+
(
926927
call instanceof ConstructorCall and
927928
opcode = getASideEffectOpcode(call, -1)
929+
)
930+
or
931+
(
932+
call instanceof ConstructorFieldInit and
933+
(
934+
opcode instanceof Opcode::IndirectReadSideEffect
935+
or
936+
opcode instanceof Opcode::IndirectMayWriteSideEffect
937+
)
938+
939+
)
928940
} or
929941
// The side effect that initializes newly-allocated memory.
930942
TTranslatedAllocationSideEffect(AllocationExpr expr) { not ignoreSideEffects(expr) } or

cpp/ql/lib/semmle/code/cpp/ir/implementation/raw/internal/TranslatedInitialization.qll

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -631,13 +631,22 @@ class TranslatedDefaultFieldInitialization extends TranslatedElement,
631631
kind instanceof GotoEdge
632632
}
633633

634-
override Instruction getALastInstructionInternal() { result = this.getInstruction(CallTag()) }
634+
override Instruction getALastInstructionInternal() {
635+
result = this.getSideEffects().getALastInstruction()
636+
}
637+
638+
override TranslatedElement getLastChild() { result = this.getSideEffects() }
635639

636640
override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) {
637641
tag = CallTargetTag() and
638642
result = this.getInstruction(CallTag())
639643
or
640644
tag = CallTag() and
645+
result = this.getSideEffects().getFirstInstruction(kind)
646+
}
647+
648+
override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) {
649+
child = this.getSideEffects() and
641650
result = this.getParent().getChildSuccessor(this, kind)
642651
}
643652

@@ -667,9 +676,11 @@ class TranslatedDefaultFieldInitialization extends TranslatedElement,
667676
result = field
668677
}
669678

670-
override TranslatedElement getChild(int id) { none() }
679+
override TranslatedElement getChild(int id) { id = 0 and result = this.getSideEffects() }
671680

672681
final override Declaration getFunction() { result = getEnclosingFunction(ast) }
682+
683+
final TranslatedSideEffects getSideEffects() { result.getExpr() = ast }
673684
}
674685

675686
private string getZeroValue(Type type) {

0 commit comments

Comments
 (0)