Skip to content

Commit 96a7eaf

Browse files
committed
WIP: Side effects
1 parent 9138e19 commit 96a7eaf

File tree

4 files changed

+50
-15
lines changed

4 files changed

+50
-15
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: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -921,11 +921,20 @@ newtype TTranslatedElement =
921921
} or
922922
// Constructor calls lack a qualifier (`this`) expression, so we need to handle the side effects
923923
// on `*this` without an `Expr`.
924-
TTranslatedStructorQualifierSideEffect(Call call, SideEffectOpcode opcode) {
924+
TTranslatedStructorQualifierSideEffect(CallOrAllocationExpr call, SideEffectOpcode opcode) {
925925
not ignoreExpr(call) and
926926
not ignoreSideEffects(call) and
927-
call instanceof ConstructorCall and
928-
opcode = getASideEffectOpcode(call, -1)
927+
(
928+
call instanceof ConstructorCall and
929+
opcode = getASideEffectOpcode(call, -1)
930+
or
931+
call instanceof ConstructorFieldInit and
932+
(
933+
opcode instanceof Opcode::IndirectReadSideEffect
934+
or
935+
opcode instanceof Opcode::IndirectMayWriteSideEffect
936+
)
937+
)
929938
} or
930939
// The side effect that initializes newly-allocated memory.
931940
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
@@ -640,13 +640,22 @@ class TranslatedDefaultFieldInitialization extends TranslatedFieldInitialization
640640
kind instanceof GotoEdge
641641
}
642642

643-
override Instruction getALastInstructionInternal() { result = this.getInstruction(CallTag()) }
643+
override Instruction getALastInstructionInternal() {
644+
result = this.getSideEffects().getALastInstruction()
645+
}
646+
647+
override TranslatedElement getLastChild() { result = this.getSideEffects() }
644648

645649
override Instruction getInstructionSuccessorInternal(InstructionTag tag, EdgeKind kind) {
646650
tag = CallTargetTag() and
647651
result = this.getInstruction(CallTag())
648652
or
649653
tag = CallTag() and
654+
result = this.getSideEffects().getFirstInstruction(kind)
655+
}
656+
657+
override Instruction getChildSuccessorInternal(TranslatedElement child, EdgeKind kind) {
658+
child = this.getSideEffects() and
650659
result = this.getParent().getChildSuccessor(this, kind)
651660
}
652661

@@ -676,7 +685,9 @@ class TranslatedDefaultFieldInitialization extends TranslatedFieldInitialization
676685
result = field
677686
}
678687

679-
override TranslatedElement getChild(int id) { none() }
688+
override TranslatedElement getChild(int id) { id = 0 and result = this.getSideEffects() }
689+
690+
final TranslatedSideEffects getSideEffects() { result.getExpr() = ast }
680691
}
681692

682693
private string getZeroValue(Type type) {

0 commit comments

Comments
 (0)