mirror of
https://github.com/github/codeql.git
synced 2026-04-30 11:15:13 +02:00
C++: Generate additional loads for non-reference structured bindings
This commit is contained in:
@@ -71,7 +71,8 @@ newtype TInstructionTag =
|
||||
AsmTag() or
|
||||
AsmInputTag(int elementIndex) { exists(AsmStmt asm | exists(asm.getChild(elementIndex))) } or
|
||||
ThisAddressTag() or
|
||||
ThisLoadTag()
|
||||
ThisLoadTag() or
|
||||
StructuredBindingAccessTag()
|
||||
|
||||
class InstructionTag extends TInstructionTag {
|
||||
final string toString() { result = "Tag" }
|
||||
@@ -221,4 +222,6 @@ string getInstructionTagId(TInstructionTag tag) {
|
||||
tag = ThisAddressTag() and result = "ThisAddress"
|
||||
or
|
||||
tag = ThisLoadTag() and result = "ThisLoad"
|
||||
or
|
||||
tag = StructuredBindingAccessTag() and result = "StructuredBindingAccess"
|
||||
}
|
||||
|
||||
@@ -3,6 +3,7 @@ private import semmle.code.cpp.ir.implementation.IRType
|
||||
private import semmle.code.cpp.ir.implementation.Opcode
|
||||
private import semmle.code.cpp.ir.implementation.internal.OperandTag
|
||||
private import semmle.code.cpp.ir.internal.CppType
|
||||
private import semmle.code.cpp.ir.internal.IRUtilities
|
||||
private import semmle.code.cpp.ir.internal.TempVariableTag
|
||||
private import InstructionTag
|
||||
private import TranslatedCondition
|
||||
@@ -813,7 +814,9 @@ abstract class TranslatedVariableAccess extends TranslatedNonConstantExpr {
|
||||
}
|
||||
|
||||
class TranslatedNonFieldVariableAccess extends TranslatedVariableAccess {
|
||||
TranslatedNonFieldVariableAccess() { not expr instanceof FieldAccess }
|
||||
TranslatedNonFieldVariableAccess() {
|
||||
not expr instanceof FieldAccess and not isNonReferenceStructuredBinding(expr.getTarget())
|
||||
}
|
||||
|
||||
override Instruction getFirstInstruction() {
|
||||
if exists(this.getQualifier())
|
||||
@@ -860,6 +863,61 @@ class TranslatedFieldAccess extends TranslatedVariableAccess {
|
||||
}
|
||||
}
|
||||
|
||||
class TranslatedStructuredBindingVariableAccess extends TranslatedNonConstantExpr {
|
||||
override VariableAccess expr;
|
||||
|
||||
TranslatedStructuredBindingVariableAccess() { isNonReferenceStructuredBinding(expr.getTarget()) }
|
||||
|
||||
override Instruction getFirstInstruction() {
|
||||
// Structured bindings cannot be qualified.
|
||||
result = this.getInstruction(StructuredBindingAccessTag())
|
||||
}
|
||||
|
||||
override TranslatedElement getChild(int id) {
|
||||
// Structured bindings cannot be qualified.
|
||||
none()
|
||||
}
|
||||
|
||||
override Instruction getResult() { result = this.getInstruction(LoadTag()) }
|
||||
|
||||
override Instruction getInstructionSuccessor(InstructionTag tag, EdgeKind kind) {
|
||||
tag = StructuredBindingAccessTag() and
|
||||
kind instanceof GotoEdge and
|
||||
result = this.getInstruction(LoadTag())
|
||||
or
|
||||
tag = LoadTag() and
|
||||
kind instanceof GotoEdge and
|
||||
result = this.getParent().getChildSuccessor(this)
|
||||
}
|
||||
|
||||
override Instruction getChildSuccessor(TranslatedElement child) { none() }
|
||||
|
||||
override predicate hasInstruction(Opcode opcode, InstructionTag tag, CppType resultType) {
|
||||
tag = StructuredBindingAccessTag() and
|
||||
opcode instanceof Opcode::VariableAddress and
|
||||
resultType = getTypeForGLValue(this.getReferenceType())
|
||||
or
|
||||
tag = LoadTag() and
|
||||
opcode instanceof Opcode::Load and
|
||||
resultType = getTypeForPRValue(this.getReferenceType())
|
||||
}
|
||||
|
||||
private Type getReferenceType() {
|
||||
result.(ReferenceType).getBaseType() = expr.getUnderlyingType()
|
||||
}
|
||||
|
||||
override Instruction getInstructionRegisterOperand(InstructionTag tag, OperandTag operandTag) {
|
||||
tag = LoadTag() and
|
||||
operandTag instanceof AddressOperandTag and
|
||||
result = this.getInstruction(StructuredBindingAccessTag())
|
||||
}
|
||||
|
||||
override IRVariable getInstructionVariable(InstructionTag tag) {
|
||||
tag = StructuredBindingAccessTag() and
|
||||
result = getIRUserVariable(expr.getEnclosingFunction(), expr.getTarget())
|
||||
}
|
||||
}
|
||||
|
||||
class TranslatedFunctionAccess extends TranslatedNonConstantExpr {
|
||||
override FunctionAccess expr;
|
||||
|
||||
|
||||
@@ -6694,16 +6694,22 @@
|
||||
| ir.cpp:1466:26:1466:27 | StoreValue | r1466_3 |
|
||||
| ir.cpp:1466:26:1466:27 | Unary | r1466_2 |
|
||||
| ir.cpp:1467:9:1467:10 | Address | &:r1467_2 |
|
||||
| ir.cpp:1467:9:1467:14 | ChiPartial | partial:m1467_3 |
|
||||
| ir.cpp:1467:9:1467:14 | ChiTotal | total:m0_14 |
|
||||
| ir.cpp:1467:9:1467:10 | Address | &:r1467_3 |
|
||||
| ir.cpp:1467:9:1467:10 | Load | m0_14 |
|
||||
| ir.cpp:1467:9:1467:14 | ChiPartial | partial:m1467_4 |
|
||||
| ir.cpp:1467:9:1467:14 | ChiTotal | total:m1463_12 |
|
||||
| ir.cpp:1467:14:1467:14 | StoreValue | r1467_1 |
|
||||
| ir.cpp:1468:14:1468:16 | Address | &:r1468_1 |
|
||||
| ir.cpp:1468:20:1468:21 | StoreValue | r1468_3 |
|
||||
| ir.cpp:1468:20:1468:21 | Unary | r1468_2 |
|
||||
| ir.cpp:1468:20:1468:21 | Address | &:r1468_2 |
|
||||
| ir.cpp:1468:20:1468:21 | Load | m0_14 |
|
||||
| ir.cpp:1468:20:1468:21 | StoreValue | r1468_4 |
|
||||
| ir.cpp:1468:20:1468:21 | Unary | r1468_3 |
|
||||
| ir.cpp:1469:13:1469:13 | Address | &:r1469_1 |
|
||||
| ir.cpp:1469:17:1469:18 | Address | &:r1469_2 |
|
||||
| ir.cpp:1469:17:1469:18 | Load | m1467_3 |
|
||||
| ir.cpp:1469:17:1469:18 | StoreValue | r1469_3 |
|
||||
| ir.cpp:1469:17:1469:18 | Address | &:r1469_3 |
|
||||
| ir.cpp:1469:17:1469:18 | Load | m0_14 |
|
||||
| ir.cpp:1469:17:1469:18 | Load | m1467_4 |
|
||||
| ir.cpp:1469:17:1469:18 | StoreValue | r1469_4 |
|
||||
| ir.cpp:1473:15:1473:36 | Address | &:r1473_1 |
|
||||
| ir.cpp:1473:40:1473:41 | StoreValue | r1473_3 |
|
||||
| ir.cpp:1473:40:1473:41 | Unary | r1473_2 |
|
||||
@@ -6730,7 +6736,7 @@
|
||||
| ir.cpp:1476:9:1476:10 | Load | m1475_9 |
|
||||
| ir.cpp:1476:9:1476:10 | Unary | r1476_3 |
|
||||
| ir.cpp:1476:9:1476:14 | ChiPartial | partial:m1476_5 |
|
||||
| ir.cpp:1476:9:1476:14 | ChiTotal | total:m1463_12 |
|
||||
| ir.cpp:1476:9:1476:14 | ChiTotal | total:m1467_5 |
|
||||
| ir.cpp:1476:14:1476:14 | StoreValue | r1476_1 |
|
||||
| ir.cpp:1477:14:1477:16 | Address | &:r1477_1 |
|
||||
| ir.cpp:1477:20:1477:21 | Address | &:r1477_2 |
|
||||
@@ -6809,35 +6815,53 @@
|
||||
| ir.cpp:1503:47:1503:47 | Unary | r1503_34 |
|
||||
| ir.cpp:1503:47:1503:47 | Unary | r1503_38 |
|
||||
| ir.cpp:1504:9:1504:9 | Address | &:r1504_2 |
|
||||
| ir.cpp:1504:9:1504:9 | Address | &:r1504_3 |
|
||||
| ir.cpp:1504:9:1504:9 | Load | m1503_12 |
|
||||
| ir.cpp:1504:9:1504:15 | ChiPartial | partial:m1504_4 |
|
||||
| ir.cpp:1504:9:1504:15 | ChiTotal | total:m1503_4 |
|
||||
| ir.cpp:1504:13:1504:15 | StoreValue | r1504_1 |
|
||||
| ir.cpp:1505:17:1505:18 | Address | &:r1505_1 |
|
||||
| ir.cpp:1505:22:1505:22 | StoreValue | r1505_3 |
|
||||
| ir.cpp:1505:22:1505:22 | Unary | r1505_2 |
|
||||
| ir.cpp:1505:22:1505:22 | Address | &:r1505_2 |
|
||||
| ir.cpp:1505:22:1505:22 | Load | m1503_12 |
|
||||
| ir.cpp:1505:22:1505:22 | StoreValue | r1505_4 |
|
||||
| ir.cpp:1505:22:1505:22 | Unary | r1505_3 |
|
||||
| ir.cpp:1506:13:1506:13 | Address | &:r1506_1 |
|
||||
| ir.cpp:1506:17:1506:17 | Address | &:r1506_2 |
|
||||
| ir.cpp:1506:17:1506:17 | Load | ~m1503_8 |
|
||||
| ir.cpp:1506:17:1506:17 | StoreValue | r1506_3 |
|
||||
| ir.cpp:1506:17:1506:17 | Address | &:r1506_3 |
|
||||
| ir.cpp:1506:17:1506:17 | Load | m1503_8 |
|
||||
| ir.cpp:1506:17:1506:17 | Load | ~m1503_4 |
|
||||
| ir.cpp:1506:17:1506:17 | StoreValue | r1506_4 |
|
||||
| ir.cpp:1507:9:1507:9 | Address | &:r1507_2 |
|
||||
| ir.cpp:1507:9:1507:13 | ChiPartial | partial:m1507_3 |
|
||||
| ir.cpp:1507:9:1507:13 | ChiTotal | total:m1503_22 |
|
||||
| ir.cpp:1507:9:1507:9 | Address | &:r1507_3 |
|
||||
| ir.cpp:1507:9:1507:9 | Load | m1503_22 |
|
||||
| ir.cpp:1507:9:1507:13 | ChiPartial | partial:m1507_4 |
|
||||
| ir.cpp:1507:9:1507:13 | ChiTotal | total:m1500_6 |
|
||||
| ir.cpp:1507:13:1507:13 | StoreValue | r1507_1 |
|
||||
| ir.cpp:1508:9:1508:10 | Address | &:r1508_4 |
|
||||
| ir.cpp:1508:9:1508:14 | ChiPartial | partial:m1508_5 |
|
||||
| ir.cpp:1508:9:1508:14 | ChiTotal | total:m1503_4 |
|
||||
| ir.cpp:1508:9:1508:10 | Address | &:r1508_5 |
|
||||
| ir.cpp:1508:9:1508:14 | ChiPartial | partial:m1508_6 |
|
||||
| ir.cpp:1508:9:1508:14 | ChiTotal | total:m1507_5 |
|
||||
| ir.cpp:1508:10:1508:10 | Address | &:r1508_2 |
|
||||
| ir.cpp:1508:10:1508:10 | Address | &:r1508_3 |
|
||||
| ir.cpp:1508:10:1508:10 | Load | m1503_26 |
|
||||
| ir.cpp:1508:10:1508:10 | Unary | r1508_3 |
|
||||
| ir.cpp:1508:10:1508:10 | Load | ~m1503_4 |
|
||||
| ir.cpp:1508:10:1508:10 | Unary | r1508_4 |
|
||||
| ir.cpp:1508:14:1508:14 | StoreValue | r1508_1 |
|
||||
| ir.cpp:1509:14:1509:15 | Address | &:r1509_1 |
|
||||
| ir.cpp:1509:19:1509:19 | StoreValue | r1509_3 |
|
||||
| ir.cpp:1509:19:1509:19 | Unary | r1509_2 |
|
||||
| ir.cpp:1509:19:1509:19 | Address | &:r1509_2 |
|
||||
| ir.cpp:1509:19:1509:19 | Load | m1503_22 |
|
||||
| ir.cpp:1509:19:1509:19 | StoreValue | r1509_4 |
|
||||
| ir.cpp:1509:19:1509:19 | Unary | r1509_3 |
|
||||
| ir.cpp:1510:14:1510:15 | Address | &:r1510_1 |
|
||||
| ir.cpp:1510:19:1510:20 | StoreValue | r1510_3 |
|
||||
| ir.cpp:1510:20:1510:20 | Unary | r1510_2 |
|
||||
| ir.cpp:1510:19:1510:20 | StoreValue | r1510_4 |
|
||||
| ir.cpp:1510:20:1510:20 | Address | &:r1510_2 |
|
||||
| ir.cpp:1510:20:1510:20 | Load | m1503_22 |
|
||||
| ir.cpp:1510:20:1510:20 | Unary | r1510_3 |
|
||||
| ir.cpp:1511:13:1511:13 | Address | &:r1511_1 |
|
||||
| ir.cpp:1511:17:1511:17 | Address | &:r1511_2 |
|
||||
| ir.cpp:1511:17:1511:17 | Load | m1507_3 |
|
||||
| ir.cpp:1511:17:1511:17 | StoreValue | r1511_3 |
|
||||
| ir.cpp:1511:17:1511:17 | Address | &:r1511_3 |
|
||||
| ir.cpp:1511:17:1511:17 | Load | m1503_22 |
|
||||
| ir.cpp:1511:17:1511:17 | Load | ~m1508_7 |
|
||||
| ir.cpp:1511:17:1511:17 | StoreValue | r1511_4 |
|
||||
| ir.cpp:1515:14:1515:35 | Address | &:r1515_1 |
|
||||
| ir.cpp:1515:39:1515:39 | Address | &:r1515_2 |
|
||||
| ir.cpp:1515:39:1515:39 | Load | m1500_8 |
|
||||
@@ -6885,7 +6909,7 @@
|
||||
| ir.cpp:1524:9:1524:9 | Load | m1519_7 |
|
||||
| ir.cpp:1524:9:1524:9 | Unary | r1524_3 |
|
||||
| ir.cpp:1524:9:1524:13 | ChiPartial | partial:m1524_5 |
|
||||
| ir.cpp:1524:9:1524:13 | ChiTotal | total:m1500_6 |
|
||||
| ir.cpp:1524:9:1524:13 | ChiTotal | total:m1508_7 |
|
||||
| ir.cpp:1524:13:1524:13 | StoreValue | r1524_1 |
|
||||
| ir.cpp:1525:9:1525:10 | Address | &:r1525_5 |
|
||||
| ir.cpp:1525:9:1525:14 | ChiPartial | partial:m1525_6 |
|
||||
|
||||
@@ -7932,16 +7932,19 @@ ir.cpp:
|
||||
#-----| r0_13(glval<int>) = PointerAdd[4] : r0_11, r0_12
|
||||
#-----| mu0_14(int &) = Store[x1] : &:r1466_6, r0_13
|
||||
# 1467| r1467_1(int) = Constant[3] :
|
||||
# 1467| r1467_2(glval<int>) = VariableAddress[x1] :
|
||||
# 1467| mu1467_3(int) = Store[x1] : &:r1467_2, r1467_1
|
||||
# 1467| r1467_2(glval<int &>) = VariableAddress[x1] :
|
||||
# 1467| r1467_3(int &) = Load[x1] : &:r1467_2, ~m?
|
||||
# 1467| mu1467_4(int) = Store[?] : &:r1467_3, r1467_1
|
||||
# 1468| r1468_1(glval<int &>) = VariableAddress[rx1] :
|
||||
# 1468| r1468_2(glval<int>) = VariableAddress[x1] :
|
||||
# 1468| r1468_3(int &) = CopyValue : r1468_2
|
||||
# 1468| mu1468_4(int &) = Store[rx1] : &:r1468_1, r1468_3
|
||||
# 1468| r1468_2(glval<int &>) = VariableAddress[x1] :
|
||||
# 1468| r1468_3(int &) = Load[x1] : &:r1468_2, ~m?
|
||||
# 1468| r1468_4(int &) = CopyValue : r1468_3
|
||||
# 1468| mu1468_5(int &) = Store[rx1] : &:r1468_1, r1468_4
|
||||
# 1469| r1469_1(glval<int>) = VariableAddress[x] :
|
||||
# 1469| r1469_2(glval<int>) = VariableAddress[x1] :
|
||||
# 1469| r1469_3(int) = Load[x1] : &:r1469_2, ~m?
|
||||
# 1469| mu1469_4(int) = Store[x] : &:r1469_1, r1469_3
|
||||
# 1469| r1469_2(glval<int &>) = VariableAddress[x1] :
|
||||
# 1469| r1469_3(int &) = Load[x1] : &:r1469_2, ~m?
|
||||
# 1469| r1469_4(int) = Load[?] : &:r1469_3, ~m?
|
||||
# 1469| mu1469_5(int) = Store[x] : &:r1469_1, r1469_4
|
||||
# 1473| r1473_1(glval<int(&)[2]>) = VariableAddress[unnamed_local_variable] :
|
||||
# 1473| r1473_2(glval<int[2]>) = VariableAddress[xs] :
|
||||
# 1473| r1473_3(int(&)[2]) = CopyValue : r1473_2
|
||||
@@ -8078,36 +8081,44 @@ ir.cpp:
|
||||
# 1503| r1503_39(glval<StructuredBindingDataMemberMemberStruct>) = FieldAddress[m] : r1503_38
|
||||
# 1503| mu1503_40(StructuredBindingDataMemberMemberStruct &) = Store[m] : &:r1503_37, r1503_39
|
||||
# 1504| r1504_1(double) = Constant[4.0] :
|
||||
# 1504| r1504_2(glval<double>) = VariableAddress[d] :
|
||||
# 1504| mu1504_3(double) = Store[d] : &:r1504_2, r1504_1
|
||||
# 1504| r1504_2(glval<double &>) = VariableAddress[d] :
|
||||
# 1504| r1504_3(double &) = Load[d] : &:r1504_2, ~m?
|
||||
# 1504| mu1504_4(double) = Store[?] : &:r1504_3, r1504_1
|
||||
# 1505| r1505_1(glval<double &>) = VariableAddress[rd] :
|
||||
# 1505| r1505_2(glval<double>) = VariableAddress[d] :
|
||||
# 1505| r1505_3(double &) = CopyValue : r1505_2
|
||||
# 1505| mu1505_4(double &) = Store[rd] : &:r1505_1, r1505_3
|
||||
# 1505| r1505_2(glval<double &>) = VariableAddress[d] :
|
||||
# 1505| r1505_3(double &) = Load[d] : &:r1505_2, ~m?
|
||||
# 1505| r1505_4(double &) = CopyValue : r1505_3
|
||||
# 1505| mu1505_5(double &) = Store[rd] : &:r1505_1, r1505_4
|
||||
# 1506| r1506_1(glval<int>) = VariableAddress[v] :
|
||||
# 1506| r1506_2(glval<int>) = VariableAddress[i] :
|
||||
# 1506| r1506_3(int) = Load[i] : &:r1506_2, ~m?
|
||||
# 1506| mu1506_4(int) = Store[v] : &:r1506_1, r1506_3
|
||||
# 1506| r1506_2(glval<int &>) = VariableAddress[i] :
|
||||
# 1506| r1506_3(int &) = Load[i] : &:r1506_2, ~m?
|
||||
# 1506| r1506_4(int) = Load[?] : &:r1506_3, ~m?
|
||||
# 1506| mu1506_5(int) = Store[v] : &:r1506_1, r1506_4
|
||||
# 1507| r1507_1(int) = Constant[5] :
|
||||
# 1507| r1507_2(glval<int>) = VariableAddress[r] :
|
||||
# 1507| mu1507_3(int) = Store[r] : &:r1507_2, r1507_1
|
||||
# 1507| r1507_2(glval<int &>) = VariableAddress[r] :
|
||||
# 1507| r1507_3(int &) = Load[r] : &:r1507_2, ~m?
|
||||
# 1507| mu1507_4(int) = Store[?] : &:r1507_3, r1507_1
|
||||
# 1508| r1508_1(int) = Constant[6] :
|
||||
# 1508| r1508_2(glval<int *>) = VariableAddress[p] :
|
||||
# 1508| r1508_3(int *) = Load[p] : &:r1508_2, ~m?
|
||||
# 1508| r1508_4(glval<int>) = CopyValue : r1508_3
|
||||
# 1508| mu1508_5(int) = Store[?] : &:r1508_4, r1508_1
|
||||
# 1508| r1508_2(glval<int *&>) = VariableAddress[p] :
|
||||
# 1508| r1508_3(int *&) = Load[p] : &:r1508_2, ~m?
|
||||
# 1508| r1508_4(int *) = Load[?] : &:r1508_3, ~m?
|
||||
# 1508| r1508_5(glval<int>) = CopyValue : r1508_4
|
||||
# 1508| mu1508_6(int) = Store[?] : &:r1508_5, r1508_1
|
||||
# 1509| r1509_1(glval<int &>) = VariableAddress[rr] :
|
||||
# 1509| r1509_2(glval<int>) = VariableAddress[r] :
|
||||
# 1509| r1509_3(int &) = CopyValue : r1509_2
|
||||
# 1509| mu1509_4(int &) = Store[rr] : &:r1509_1, r1509_3
|
||||
# 1509| r1509_2(glval<int &>) = VariableAddress[r] :
|
||||
# 1509| r1509_3(int &) = Load[r] : &:r1509_2, ~m?
|
||||
# 1509| r1509_4(int &) = CopyValue : r1509_3
|
||||
# 1509| mu1509_5(int &) = Store[rr] : &:r1509_1, r1509_4
|
||||
# 1510| r1510_1(glval<int *>) = VariableAddress[pr] :
|
||||
# 1510| r1510_2(glval<int>) = VariableAddress[r] :
|
||||
# 1510| r1510_3(int *) = CopyValue : r1510_2
|
||||
# 1510| mu1510_4(int *) = Store[pr] : &:r1510_1, r1510_3
|
||||
# 1510| r1510_2(glval<int &>) = VariableAddress[r] :
|
||||
# 1510| r1510_3(int &) = Load[r] : &:r1510_2, ~m?
|
||||
# 1510| r1510_4(int *) = CopyValue : r1510_3
|
||||
# 1510| mu1510_5(int *) = Store[pr] : &:r1510_1, r1510_4
|
||||
# 1511| r1511_1(glval<int>) = VariableAddress[w] :
|
||||
# 1511| r1511_2(glval<int>) = VariableAddress[r] :
|
||||
# 1511| r1511_3(int) = Load[r] : &:r1511_2, ~m?
|
||||
# 1511| mu1511_4(int) = Store[w] : &:r1511_1, r1511_3
|
||||
# 1511| r1511_2(glval<int &>) = VariableAddress[r] :
|
||||
# 1511| r1511_3(int &) = Load[r] : &:r1511_2, ~m?
|
||||
# 1511| r1511_4(int) = Load[?] : &:r1511_3, ~m?
|
||||
# 1511| mu1511_5(int) = Store[w] : &:r1511_1, r1511_4
|
||||
# 1515| r1515_1(glval<StructuredBindingDataMemberStruct>) = VariableAddress[unnamed_local_variable] :
|
||||
# 1515| r1515_2(glval<StructuredBindingDataMemberStruct>) = VariableAddress[s] :
|
||||
# 1515| r1515_3(StructuredBindingDataMemberStruct) = Load[s] : &:r1515_2, ~m?
|
||||
|
||||
Reference in New Issue
Block a user