Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit 7dc30e3

Browse files
author
Robert Marsh
committed
C++: add output indirections for this
1 parent 0d8472b commit 7dc30e3

7 files changed

Lines changed: 334 additions & 234 deletions

File tree

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

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,8 +415,11 @@ newtype TTranslatedElement =
415415
} or
416416
TTranslatedEllipsisParameter(Function func) { translateFunction(func) and func.isVarargs() } or
417417
TTranslatedReadEffects(Function func) { translateFunction(func) } or
418+
TTranslatedThisReadEffect(Function func) {
419+
translateFunction(func) and func.isMember() and not func.isStatic()
420+
} or
418421
// The read side effects in a function's return block
419-
TTranslatedReadEffect(Parameter param) {
422+
TTranslatedParameterReadEffect(Parameter param) {
420423
translateFunction(param.getFunction()) and
421424
exists(Type t | t = param.getUnspecifiedType() |
422425
t instanceof ArrayType or

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

Lines changed: 51 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -676,14 +676,17 @@ class TranslatedReadEffects extends TranslatedElement, TTranslatedReadEffects {
676676
override string toString() { result = "read effects: " + func.toString() }
677677

678678
override TranslatedElement getChild(int id) {
679-
result = getTranslatedReadEffect(func.getParameter(id))
679+
result = getTranslatedThisReadEffect(func) and
680+
id = -1
681+
or
682+
result = getTranslatedParameterReadEffect(func.getParameter(id))
680683
}
681684

682685
override Instruction getFirstInstruction() {
683686
if exists(getAChild())
684687
then
685688
result =
686-
min(TranslatedReadEffect child, int id | child = getChild(id) | child order by id)
689+
min(TranslatedElement child, int id | child = getChild(id) | child order by id)
687690
.getFirstInstruction()
688691
else result = getParent().getChildSuccessor(this)
689692
}
@@ -709,17 +712,13 @@ class TranslatedReadEffects extends TranslatedElement, TTranslatedReadEffects {
709712
override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) { none() }
710713
}
711714

712-
private TranslatedReadEffect getTranslatedReadEffect(Parameter param) { result.getAST() = param }
713-
714-
class TranslatedReadEffect extends TranslatedElement, TTranslatedReadEffect {
715-
Parameter param;
716-
717-
TranslatedReadEffect() { this = TTranslatedReadEffect(param) }
718-
719-
override Locatable getAST() { result = param }
715+
private TranslatedThisReadEffect getTranslatedThisReadEffect(Function func) {
716+
result.getAST() = func
717+
}
720718

721-
override string toString() { result = "read effect: " + param.toString() }
719+
private TranslatedParameterReadEffect getTranslatedParameterReadEffect(Parameter param) { result.getAST() = param }
722720

721+
abstract class TranslatedReadEffect extends TranslatedElement {
723722
override TranslatedElement getChild(int id) { none() }
724723

725724
override Instruction getChildSuccessor(TranslatedElement child) { none() }
@@ -732,27 +731,60 @@ class TranslatedReadEffect extends TranslatedElement, TTranslatedReadEffect {
732731

733732
override Instruction getFirstInstruction() { result = getInstruction(OnlyInstructionTag()) }
734733

735-
override Function getFunction() { result = param.getFunction() }
736-
737734
override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
738735
opcode instanceof Opcode::ReturnIndirection and
739736
tag = OnlyInstructionTag() and
740737
resultType = getVoidType()
741738
}
742739

743-
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
744-
tag = OnlyInstructionTag() and
745-
operandTag = addressOperand() and
746-
result = getTranslatedParameter(param).getInstruction(InitializerIndirectAddressTag())
747-
}
748-
749740
final override CppType getInstructionMemoryOperandType(
750741
InstructionTag tag, TypedOperandTag operandTag
751742
) {
752743
tag = OnlyInstructionTag() and
753744
operandTag = sideEffectOperand() and
754745
result = getUnknownType()
755746
}
747+
}
748+
749+
750+
class TranslatedThisReadEffect extends TranslatedReadEffect, TTranslatedThisReadEffect {
751+
Function func;
752+
753+
TranslatedThisReadEffect() { this = TTranslatedThisReadEffect(func) }
754+
755+
override Locatable getAST() { result = func }
756+
757+
override Function getFunction() { result = func }
758+
759+
override string toString() { result = "read effect: this" }
760+
761+
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
762+
tag = OnlyInstructionTag() and
763+
operandTag = addressOperand() and
764+
result = getTranslatedThisParameter(func).getInstruction(InitializerIndirectAddressTag())
765+
}
766+
767+
final override IRVariable getInstructionVariable(InstructionTag tag) {
768+
tag = OnlyInstructionTag() and
769+
result = getTranslatedFunction(func).getThisVariable()
770+
}
771+
}
772+
class TranslatedParameterReadEffect extends TranslatedReadEffect, TTranslatedParameterReadEffect {
773+
Parameter param;
774+
775+
TranslatedParameterReadEffect() { this = TTranslatedParameterReadEffect(param) }
776+
777+
override Locatable getAST() { result = param }
778+
779+
override string toString() { result = "read effect: " + param.toString() }
780+
781+
override Function getFunction() { result = param.getFunction() }
782+
783+
final override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
784+
tag = OnlyInstructionTag() and
785+
operandTag = addressOperand() and
786+
result = getTranslatedParameter(param).getInstruction(InitializerIndirectAddressTag())
787+
}
756788

757789
final override IRVariable getInstructionVariable(InstructionTag tag) {
758790
tag = OnlyInstructionTag() and

0 commit comments

Comments
 (0)