@@ -3,6 +3,8 @@ private import rust
33private import rust as R
44private import codeql.rust.dataflow.DataFlow
55private import codeql.rust.dataflow.internal.DataFlowImpl
6+ private import codeql.rust.dataflow.FlowSource as FlowSource
7+ private import codeql.rust.dataflow.FlowSink as FlowSink
68private import codeql.rust.dataflow.internal.TaintTrackingImpl
79private import codeql.mad.modelgenerator.internal.ModelGeneratorImpl
810private import codeql.rust.dataflow.internal.FlowSummaryImpl as FlowSummary
@@ -105,14 +107,19 @@ module ModelGeneratorInput implements ModelGeneratorInputSig<Location, RustDataF
105107
106108 predicate sinkModelSanitizer ( DataFlow:: Node node ) { none ( ) }
107109
108- predicate apiSource ( DataFlow:: Node source ) { none ( ) }
110+ /**
111+ * Holds if `source` is an API entrypoint, i.e., a source of input where data
112+ * can flow in to a library. This is used for creating sink models, as we
113+ * only want to mark functions as sinks if input to the function can reach
114+ * (from an input source) a known sink.
115+ */
116+ predicate apiSource ( DataFlow:: Node source ) { source instanceof DataFlow:: ParameterNode }
109117
110118 bindingset [ sourceEnclosing, api]
111119 predicate irrelevantSourceSinkApi ( Callable sourceEnclosing , SourceTargetApi api ) { none ( ) }
112120
113121 string getInputArgument ( DataFlow:: Node source ) {
114- // TODO: Implement when we want to generate sources and sinks
115- result = "getInputArgument(" + source + ")"
122+ result = "Argument[" + source .( Node:: SourceParameterNode ) .getPosition ( ) .toString ( ) + "]"
116123 }
117124
118125 bindingset [ kind]
@@ -174,11 +181,9 @@ module ModelGeneratorInput implements ModelGeneratorInputSig<Location, RustDataF
174181
175182 string partialNeutralModelRow ( Callable api , int i ) { result = partialModelRow ( api , i ) }
176183
177- // TODO: Implement this when we want to generate sources.
178- predicate sourceNode ( DataFlow:: Node node , string kind ) { none ( ) }
184+ predicate sourceNode ( DataFlow:: Node node , string kind ) { FlowSource:: sourceNode ( node , kind ) }
179185
180- // TODO: Implement this when we want to generate sinks.
181- predicate sinkNode ( DataFlow:: Node node , string kind ) { none ( ) }
186+ predicate sinkNode ( DataFlow:: Node node , string kind ) { FlowSink:: sinkNode ( node , kind ) }
182187}
183188
184189import MakeModelGenerator< Location , RustDataFlow , RustTaintTracking , ModelGeneratorInput >
0 commit comments