Skip to content

Commit 4e31516

Browse files
authored
Merge pull request #22192 from michaelnebel/shared/modelgengeneric
C#/Java: Modelgenerator. Lift models to unbound generic implementations.
2 parents b326ed8 + f184d28 commit 4e31516

4 files changed

Lines changed: 131 additions & 2 deletions

File tree

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

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -213,7 +213,8 @@ module SummaryModelGeneratorInput implements SummaryModelGeneratorInputSig {
213213
}
214214

215215
private Callable getARelevantOverrideeOrImplementee(Overridable m) {
216-
m.overridesOrImplements(result) and relevant(result)
216+
exists(Callable c | m.overridesOrImplements(c) and result = c.getUnboundDeclaration()) and
217+
relevant(result)
217218
}
218219

219220
/**

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

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,72 @@ public void AddToGenericList<S>(List<S> input, S data)
278278
}
279279
}
280280

281+
public class GenericWithVirtual1<T>
282+
{
283+
// heuristic-summary=Models;GenericWithVirtual1<T>;true;ReturnParam;(T);;Argument[0];ReturnValue;value;df-generated
284+
// contentbased-summary=Models;GenericWithVirtual1<T>;true;ReturnParam;(T);;Argument[0];ReturnValue;value;dfc-generated
285+
public virtual T ReturnParam(T input)
286+
{
287+
return input;
288+
}
289+
290+
public virtual T StubImplementation(T input)
291+
{
292+
throw null;
293+
}
294+
}
295+
296+
public class DerivedGenericWithVirtual : GenericWithVirtual1<string>
297+
{
298+
// heuristic-summary=Models;GenericWithVirtual1<T>;true;ReturnParam;(T);;Argument[0];ReturnValue;value;df-generated
299+
// contentbased-summary=Models;GenericWithVirtual1<T>;true;ReturnParam;(T);;Argument[0];ReturnValue;value;dfc-generated
300+
public override string ReturnParam(string input)
301+
{
302+
return input;
303+
}
304+
305+
// heuristic-summary=Models;GenericWithVirtual1<T>;true;StubImplementation;(T);;Argument[0];ReturnValue;value;df-generated
306+
// contentbased-summary=Models;GenericWithVirtual1<T>;true;StubImplementation;(T);;Argument[0];ReturnValue;value;dfc-generated
307+
public override string StubImplementation(string input)
308+
{
309+
return input;
310+
}
311+
}
312+
313+
public class GenericWithVirtual2<T>
314+
{
315+
// heuristic-summary=Models;GenericWithVirtual2<T>;true;ReturnParam;(T);;Argument[0];ReturnValue;value;df-generated
316+
// contentbased-summary=Models;GenericWithVirtual2<T>;true;ReturnParam;(T);;Argument[0];ReturnValue;value;dfc-generated
317+
public virtual T ReturnParam(T input)
318+
{
319+
return input;
320+
}
321+
322+
public virtual T StubImplementation(T input)
323+
{
324+
throw null;
325+
}
326+
}
327+
328+
public class NestedGenericWithVirtual<T> : GenericWithVirtual2<string> { }
329+
330+
public class DerivedNestedGenericWithVirtual : NestedGenericWithVirtual<int>
331+
{
332+
// heuristic-summary=Models;GenericWithVirtual2<T>;true;ReturnParam;(T);;Argument[0];ReturnValue;value;df-generated
333+
// contentbased-summary=Models;GenericWithVirtual2<T>;true;ReturnParam;(T);;Argument[0];ReturnValue;value;dfc-generated
334+
public override string ReturnParam(string input)
335+
{
336+
return input;
337+
}
338+
339+
// heuristic-summary=Models;GenericWithVirtual2<T>;true;StubImplementation;(T);;Argument[0];ReturnValue;value;df-generated
340+
// contentbased-summary=Models;GenericWithVirtual2<T>;true;StubImplementation;(T);;Argument[0];ReturnValue;value;dfc-generated
341+
public override string StubImplementation(string input)
342+
{
343+
return input;
344+
}
345+
}
346+
281347
public abstract class BaseClassFlow
282348
{
283349
// heuristic-summary=Models;BaseClassFlow;true;ReturnParam;(System.Object);;Argument[0];ReturnValue;value;df-generated

java/ql/src/utils/modelgenerator/internal/CaptureModels.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ module SummaryModelGeneratorInput implements SummaryModelGeneratorInputSig {
167167
Parameter asParameter(NodeExtended node) { result = node.asParameter() }
168168

169169
private J::Method getARelevantOverride(J::Method m) {
170-
result = m.getAnOverride() and
170+
result = m.getAnOverride().getSourceDeclaration() and
171171
relevant(result) and
172172
// Other exclusions for overrides.
173173
not m instanceof J::ToStringMethod
Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
package p;
2+
3+
public class Generics {
4+
5+
public class Generic1<T> {
6+
// heuristic-summary=p;Generics$Generic1;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;df-generated
7+
// contentbased-summary=p;Generics$Generic1;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;dfc-generated
8+
public T ReturnParam(T input) {
9+
return input;
10+
}
11+
12+
public T StubImplementation(T input) {
13+
return null;
14+
}
15+
}
16+
17+
public class DerivedGeneric extends Generic1<String> {
18+
// heuristic-summary=p;Generics$Generic1;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;df-generated
19+
// contentbased-summary=p;Generics$Generic1;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;dfc-generated
20+
@Override
21+
public String ReturnParam(String input) {
22+
return input;
23+
}
24+
25+
// heuristic-summary=p;Generics$Generic1;true;StubImplementation;(Object);;Argument[0];ReturnValue;value;df-generated
26+
// contentbased-summary=p;Generics$Generic1;true;StubImplementation;(Object);;Argument[0];ReturnValue;value;dfc-generated
27+
@Override
28+
public String StubImplementation(String input) {
29+
return input;
30+
}
31+
}
32+
33+
public class Generic2<T> {
34+
// heuristic-summary=p;Generics$Generic2;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;df-generated
35+
// contentbased-summary=p;Generics$Generic2;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;dfc-generated
36+
public T ReturnParam(T input) {
37+
return input;
38+
}
39+
40+
public T StubImplementation(T input) {
41+
return null;
42+
}
43+
}
44+
45+
public class NestedGeneric<T> extends Generic2<String> { }
46+
47+
public class DerivedNestedGeneric extends NestedGeneric<Integer> {
48+
// heuristic-summary=p;Generics$Generic2;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;df-generated
49+
// contentbased-summary=p;Generics$Generic2;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;dfc-generated
50+
@Override
51+
public String ReturnParam(String input) {
52+
return input;
53+
}
54+
55+
// heuristic-summary=p;Generics$Generic2;true;StubImplementation;(Object);;Argument[0];ReturnValue;value;df-generated
56+
// contentbased-summary=p;Generics$Generic2;true;StubImplementation;(Object);;Argument[0];ReturnValue;value;dfc-generated
57+
@Override
58+
public String StubImplementation(String input) {
59+
return input;
60+
}
61+
}
62+
}

0 commit comments

Comments
 (0)