Skip to content

Commit 98a3f2d

Browse files
committed
C++: Add new dataflow nodes for parameters without any Instructions associated with them.
1 parent 111ad8b commit 98a3f2d

File tree

2 files changed

+45
-0
lines changed

2 files changed

+45
-0
lines changed

cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowPrivate.qll

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,8 @@ module NodeStars {
7878
result = n.(PostUpdateNodeImpl).getIndirectionIndex()
7979
or
8080
result = n.(FinalParameterNode).getIndirectionIndex()
81+
or
82+
result = n.(BodyLessParameterNodeImpl).getIndirectionIndex()
8183
}
8284

8385
/**

cpp/ql/lib/semmle/code/cpp/ir/dataflow/internal/DataFlowUtil.qll

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,15 @@ private newtype TIRDataFlowNode =
6161
} or
6262
TFinalGlobalValue(Ssa::GlobalUse globalUse) or
6363
TInitialGlobalValue(Ssa::GlobalDef globalUse) or
64+
TBodyLessParameterNodeImpl(Parameter p, int indirectionIndex) {
65+
// Rule out parameters of catch blocks.
66+
not exists(p.getCatchBlock()) and
67+
// We subtract one because `getMaxIndirectionsForType` returns the maximum
68+
// indirection for a glvalue of a given type, and this doesn't apply to
69+
// parameters.
70+
indirectionIndex = [0 .. Ssa::getMaxIndirectionsForType(p.getUnspecifiedType()) - 1] and
71+
not any(InitializeParameterInstruction init).getParameter() = p
72+
} or
6473
TFlowSummaryNode(FlowSummaryImpl::Private::SummaryNode sn)
6574

6675
/**
@@ -737,6 +746,40 @@ class InitialGlobalValue extends Node, TInitialGlobalValue {
737746
override string toStringImpl() { result = globalDef.toString() }
738747
}
739748

749+
/**
750+
* INTERNAL: do not use.
751+
*
752+
* A node representing a parameter for a function with no body.
753+
*/
754+
class BodyLessParameterNodeImpl extends Node, TBodyLessParameterNodeImpl {
755+
Parameter p;
756+
int indirectionIndex;
757+
758+
BodyLessParameterNodeImpl() { this = TBodyLessParameterNodeImpl(p, indirectionIndex) }
759+
760+
override Declaration getEnclosingCallable() { result = this.getFunction() }
761+
762+
override Declaration getFunction() { result = p.getFunction() }
763+
764+
/** Gets the indirection index of this node. */
765+
int getIndirectionIndex() { result = indirectionIndex }
766+
767+
override DataFlowType getType() {
768+
result = getTypeImpl(p.getUnderlyingType(), this.getIndirectionIndex())
769+
}
770+
771+
final override Location getLocationImpl() {
772+
result = unique( | | p.getLocation())
773+
or
774+
count(p.getLocation()) != 1 and
775+
result instanceof UnknownDefaultLocation
776+
}
777+
778+
final override string toStringImpl() {
779+
exists(string prefix | prefix = stars(this) | result = prefix + p.toString())
780+
}
781+
}
782+
740783
/**
741784
* A data-flow node used to model flow summaries. That is, a dataflow node
742785
* that is synthesized to represent a parameter, return value, or other part

0 commit comments

Comments
 (0)