mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
Address review comments
This commit is contained in:
@@ -164,20 +164,6 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
|
||||
module Impl<FullStateConfigSig Config> {
|
||||
private class FlowState = Config::FlowState;
|
||||
|
||||
private class NodeEx extends NodeExImpl {
|
||||
NodeEx() {
|
||||
Config::allowImplicitRead(any(Node n | this.isImplicitReadNode(n)), _)
|
||||
or
|
||||
not this.isImplicitReadNode(_)
|
||||
}
|
||||
}
|
||||
|
||||
private class ArgNodeEx extends NodeEx, ArgNodeExImpl { }
|
||||
|
||||
private class ParamNodeEx extends NodeEx, ParamNodeExImpl { }
|
||||
|
||||
private class RetNodeEx extends NodeEx, RetNodeExImpl { }
|
||||
|
||||
private module SourceSinkFiltering {
|
||||
private import codeql.util.AlertFiltering
|
||||
|
||||
@@ -1043,10 +1029,15 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
|
||||
bindingset[label1, label2]
|
||||
pragma[inline_late]
|
||||
private string mergeLabels(string label1, string label2) {
|
||||
// Big-step, hidden nodes, and summaries all may need to merge labels.
|
||||
// These cases are expected to involve at most one non-empty label, so
|
||||
// we'll just discard the 2nd+ label for now.
|
||||
if label1 = "" then result = label2 else result = label1
|
||||
if label2.matches("Sink:%")
|
||||
then if label1 = "" then result = label2 else result = label1 + " " + label2
|
||||
else
|
||||
// Big-step, hidden nodes, and summaries all may need to merge labels.
|
||||
// These cases are expected to involve at most one non-empty label, so
|
||||
// we'll just discard the 2nd+ label for now.
|
||||
if label1 = ""
|
||||
then result = label2
|
||||
else result = label1
|
||||
}
|
||||
|
||||
pragma[nomagic]
|
||||
@@ -2819,15 +2810,15 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
|
||||
pragma[nomagic]
|
||||
PathNodeImpl getAnImplicitReadSuccessorAtSink(string label) {
|
||||
exists(PathNodeMid readTarget |
|
||||
result = this.getASuccessorImpl(label) and
|
||||
result = this.getASuccessorImpl(_) and
|
||||
localStep(this, readTarget, _) and
|
||||
readTarget.getNodeEx().isImplicitReadNode(_)
|
||||
|
|
||||
// last implicit read, leaving the access path empty
|
||||
result = readTarget.projectToSink(_)
|
||||
result = readTarget.projectToSink(label)
|
||||
or
|
||||
// implicit read, leaving the access path non-empty
|
||||
exists(result.getAnImplicitReadSuccessorAtSink(_)) and
|
||||
exists(result.getAnImplicitReadSuccessorAtSink(label)) and
|
||||
result = readTarget
|
||||
)
|
||||
}
|
||||
@@ -2859,7 +2850,7 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
|
||||
// `x [Field]` -> `x`
|
||||
//
|
||||
// which the restriction below ensures.
|
||||
not result = this.getAnImplicitReadSuccessorAtSink(label)
|
||||
not result = this.getAnImplicitReadSuccessorAtSink(_)
|
||||
or
|
||||
exists(string l1, string l2 |
|
||||
result = this.getASuccessorFromNonHidden(l1).getASuccessorIfHidden(l2) and
|
||||
@@ -2980,18 +2971,15 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
|
||||
)
|
||||
or
|
||||
// a final step to a sink
|
||||
exists(string l2, string sinkmodel, string l2_ |
|
||||
result = this.getSuccMid(l2).projectToSink(sinkmodel) and
|
||||
if l2 = "" then l2_ = l2 else l2_ = l2 + " "
|
||||
exists(string l2, string sinkLabel |
|
||||
result = this.getSuccMid(l2).projectToSink(sinkLabel)
|
||||
|
|
||||
not this.isSourceWithLabel(_) and
|
||||
if sinkmodel != "" then label = l2_ + "Sink:" + sinkmodel else label = l2
|
||||
label = mergeLabels(l2, sinkLabel)
|
||||
or
|
||||
exists(string l1 |
|
||||
this.isSourceWithLabel(l1) and
|
||||
if sinkmodel != ""
|
||||
then label = l1 + l2_ + "Sink:" + sinkmodel
|
||||
else label = l1 + l2
|
||||
label = l1 + mergeLabels(l2, sinkLabel)
|
||||
)
|
||||
)
|
||||
}
|
||||
@@ -3057,11 +3045,14 @@ module MakeImpl<LocationSig Location, InputSig<Location> Lang> {
|
||||
else any()
|
||||
}
|
||||
|
||||
PathNodeSink projectToSink(string model) {
|
||||
this.isAtSink() and
|
||||
sinkModel(node, model) and
|
||||
result.getNodeEx() = this.toNormalSinkNodeEx() and
|
||||
result.getState() = state
|
||||
PathNodeSink projectToSink(string label) {
|
||||
exists(string model |
|
||||
this.isAtSink() and
|
||||
sinkModel(node, model) and
|
||||
result.getNodeEx() = this.toNormalSinkNodeEx() and
|
||||
result.getState() = state and
|
||||
if model != "" then label = "Sink:" + model else label = ""
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -850,7 +850,7 @@ module MakeImplCommon<LocationSig Location, InputSig<Location> Lang> {
|
||||
|
||||
class SndLevelScopeOption = SndLevelScopeOption::Option;
|
||||
|
||||
final class NodeExImpl extends TNodeEx {
|
||||
final class NodeEx extends TNodeEx {
|
||||
string toString() {
|
||||
result = this.asNode().toString()
|
||||
or
|
||||
@@ -899,14 +899,14 @@ module MakeImplCommon<LocationSig Location, InputSig<Location> Lang> {
|
||||
Location getLocation() { result = this.projectToNode().getLocation() }
|
||||
}
|
||||
|
||||
final class ArgNodeExImpl extends NodeExImpl {
|
||||
ArgNodeExImpl() { this.asNode() instanceof ArgNode }
|
||||
final class ArgNodeEx extends NodeEx {
|
||||
ArgNodeEx() { this.asNode() instanceof ArgNode }
|
||||
|
||||
DataFlowCall getCall() { this.asNode().(ArgNode).argumentOf(result, _) }
|
||||
}
|
||||
|
||||
final class ParamNodeExImpl extends NodeExImpl {
|
||||
ParamNodeExImpl() { this.asNode() instanceof ParamNode }
|
||||
final class ParamNodeEx extends NodeEx {
|
||||
ParamNodeEx() { this.asNode() instanceof ParamNode }
|
||||
|
||||
predicate isParameterOf(DataFlowCallable c, ParameterPosition pos) {
|
||||
this.asNode().(ParamNode).isParameterOf(c, pos)
|
||||
@@ -919,10 +919,10 @@ module MakeImplCommon<LocationSig Location, InputSig<Location> Lang> {
|
||||
* A node from which flow can return to the caller. This is either a regular
|
||||
* `ReturnNode` or a synthesized node for flow out via a parameter.
|
||||
*/
|
||||
final class RetNodeExImpl extends NodeExImpl {
|
||||
final class RetNodeEx extends NodeEx {
|
||||
private ReturnPosition pos;
|
||||
|
||||
RetNodeExImpl() { pos = getReturnPositionEx(this) }
|
||||
RetNodeEx() { pos = getReturnPositionEx(this) }
|
||||
|
||||
ReturnPosition getReturnPosition() { result = pos }
|
||||
|
||||
@@ -1713,7 +1713,7 @@ module MakeImplCommon<LocationSig Location, InputSig<Location> Lang> {
|
||||
* Holds if data can flow in one local step from `node1` to `node2`.
|
||||
*/
|
||||
cached
|
||||
predicate localFlowStepExImpl(NodeExImpl node1, NodeExImpl node2, string model) {
|
||||
predicate localFlowStepExImpl(NodeEx node1, NodeEx node2, string model) {
|
||||
exists(Node n1, Node n2 |
|
||||
node1.asNode() = n1 and
|
||||
node2.asNode() = n2 and
|
||||
@@ -1730,7 +1730,7 @@ module MakeImplCommon<LocationSig Location, InputSig<Location> Lang> {
|
||||
}
|
||||
|
||||
cached
|
||||
ReturnPosition getReturnPositionEx(NodeExImpl ret) {
|
||||
ReturnPosition getReturnPositionEx(NodeEx ret) {
|
||||
result = getValueReturnPosition(ret.asNode())
|
||||
or
|
||||
exists(ParamNode p |
|
||||
|
||||
Reference in New Issue
Block a user