Skip to content

Commit 18cde3b

Browse files
authored
Merge pull request #16873 from michaelnebel/csharp/narrowsourcegeneration
C#: Narrow source model generation.
2 parents 1c33698 + 8eba4a3 commit 18cde3b

File tree

3 files changed

+48
-12
lines changed

3 files changed

+48
-12
lines changed

csharp/ql/src/utils/modelgenerator/internal/CaptureModelsSpecific.qll

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -130,7 +130,13 @@ class SinkTargetApi extends SourceOrSinkTargetApi {
130130
* A class of callables that are potentially relevant for generating source models.
131131
*/
132132
class SourceTargetApi extends SourceOrSinkTargetApi {
133-
SourceTargetApi() { not hasManualSourceModel(this) }
133+
SourceTargetApi() {
134+
not hasManualSourceModel(this) and
135+
// Do not generate source models for overridable callables
136+
// as virtual dispatch implies that too many methods
137+
// will be considered sources.
138+
not this.(Overridable).overridesOrImplements(_)
139+
}
134140
}
135141

136142
/**

csharp/ql/test/utils/modelgenerator/dataflow/Sources.cs

Lines changed: 40 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -52,25 +52,38 @@ public bool WrapConsoleReadLineGetBool()
5252
return s == "hello";
5353
}
5454

55-
public class MyConsoleReader
55+
public abstract class ValueReader
5656
{
57-
// source=Sources;NewSources+MyConsoleReader;false;ToString;();;ReturnValue;local;df-generated
58-
// neutral=Sources;NewSources+MyConsoleReader;ToString;();summary;df-generated
59-
public override string ToString()
57+
// neutral=Sources;NewSources+ValueReader;GetValue;();summary;df-generated
58+
public abstract string GetValue();
59+
}
60+
61+
public class MyConsoleReader : ValueReader
62+
{
63+
// neutral=Sources;NewSources+MyConsoleReader;GetValue;();summary;df-generated
64+
public override string GetValue()
6065
{
6166
return Console.ReadLine();
6267
}
6368
}
6469

70+
public class MyOtherReader : ValueReader
71+
{
72+
// neutral=Sources;NewSources+MyOtherReader;GetValue;();summary;df-generated
73+
public override string GetValue()
74+
{
75+
return "";
76+
}
77+
}
6578

66-
public class MyContainer<T>
79+
public class MyContainer<T> where T : ValueReader
6780
{
6881
public T Value { get; set; }
6982

70-
// summary=Sources;NewSources+MyContainer<T>;false;Read;();;Argument[this];ReturnValue;taint;df-generated
83+
// neutral=Sources;NewSources+MyContainer<T>;Read;();summary;df-generated
7184
public string Read()
7285
{
73-
return Value.ToString();
86+
return Value.GetValue();
7487
}
7588
}
7689

@@ -97,21 +110,38 @@ public abstract class DataReader
97110

98111
public class DataReaderKind1 : DataReader
99112
{
100-
// source=Sources;NewSources+DataReaderKind1;true;Read;();;ReturnValue;source-kind-1;df-generated
101113
// neutral=Sources;NewSources+DataReaderKind1;Read;();summary;df-generated
102114
public override string Read()
103115
{
104116
return Source1();
105117
}
106118
}
107119

108-
public class DataReaderKind2 : DataReader
120+
public sealed class DataReaderKind2 : DataReader
109121
{
110-
// source=Sources;NewSources+DataReaderKind2;true;Read;();;ReturnValue;source-kind-2;df-generated
111122
// neutral=Sources;NewSources+DataReaderKind2;Read;();summary;df-generated
112123
public override string Read()
113124
{
114125
return Source2();
115126
}
116127
}
128+
129+
public class C1
130+
{
131+
// neutral=Sources;NewSources+C1;ToString;();summary;df-generated
132+
public override string ToString()
133+
{
134+
return Source1();
135+
}
136+
}
137+
138+
public sealed class C2
139+
{
140+
// neutral=Sources;NewSources+C2;ToString;();summary;df-generated
141+
public override string ToString()
142+
{
143+
return Source1();
144+
}
145+
}
146+
117147
}

misc/scripts/models-as-data/generate_flow_model.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -193,7 +193,7 @@ def run(self):
193193
print("Models as data extensions generated, but not written to file.")
194194
sys.exit(0)
195195

196-
if self.generateSinks or self.generateSinks or self.generateSummaries:
196+
if self.generateSinks or self.generateSources or self.generateSummaries or self.generateNeutrals:
197197
self.save(content, ".model.yml")
198198

199199
if self.generateTypeBasedSummaries:

0 commit comments

Comments
 (0)