mirror of
https://github.com/github/codeql.git
synced 2025-12-16 08:43:11 +01:00
(Refactor) Make lookThroughImplicitFieldRead public
This commit is contained in:
@@ -1588,4 +1588,9 @@ module IR {
|
||||
* in a field/method access, element access, or slice expression.
|
||||
*/
|
||||
EvalImplicitDerefInstruction implicitDerefInstruction(Expr e) { result = MkImplicitDeref(e) }
|
||||
|
||||
/** Gets the base of `insn`, if `insn` is an implicit field read. */
|
||||
Instruction lookThroughImplicitFieldRead(Instruction insn) {
|
||||
result = insn.(ImplicitFieldReadInstruction).getBaseInstruction()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -384,17 +384,13 @@ module SourceSinkInterpretationInput implements
|
||||
}
|
||||
|
||||
private DataFlow::Node skipImplicitFieldReads(DataFlow::Node n) {
|
||||
not exists(lookThroughImplicitFieldRead(n)) and result = n
|
||||
not exists(IR::lookThroughImplicitFieldRead(n.asInstruction())) and result = n
|
||||
or
|
||||
result = skipImplicitFieldReads(lookThroughImplicitFieldRead(n))
|
||||
}
|
||||
|
||||
private DataFlow::Node lookThroughImplicitFieldRead(DataFlow::Node n) {
|
||||
result.asInstruction() =
|
||||
n.(DataFlow::InstructionNode)
|
||||
.asInstruction()
|
||||
.(IR::ImplicitFieldReadInstruction)
|
||||
.getBaseInstruction()
|
||||
exists(DataFlow::Node mid |
|
||||
mid.asInstruction() = IR::lookThroughImplicitFieldRead(n.asInstruction())
|
||||
|
|
||||
result = skipImplicitFieldReads(mid)
|
||||
)
|
||||
}
|
||||
|
||||
/** Provides additional sink specification logic. */
|
||||
|
||||
Reference in New Issue
Block a user