From 62408d8518eb3c8a498ec198376f165c19777740 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 16 Jul 2026 11:05:49 +0200 Subject: [PATCH 1/5] C#: Add some generic override modelgenerator test cases. --- .../modelgenerator/dataflow/Summaries.cs | 71 +++++++++++++++++++ 1 file changed, 71 insertions(+) diff --git a/csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs b/csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs index 4c85b397ac1f..0ccfe69b7a98 100644 --- a/csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs +++ b/csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs @@ -278,6 +278,77 @@ public void AddToGenericList(List input, S data) } } +public class GenericWithVirtual1 +{ + // heuristic-summary=Models;GenericWithVirtual1;true;ReturnParam;(T);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=Models;GenericWithVirtual1;true;ReturnParam;(T);;Argument[0];ReturnValue;value;dfc-generated + public virtual T ReturnParam(T input) + { + return input; + } + + // Missing model. Should have been lifted. + // SPURIOUS-neutral=Models;GenericWithVirtual1;StubImplementation;(T);summary;df-generated + public virtual T StubImplementation(T input) + { + throw null; + } +} + +public class DerivedGenericWithVirtual : GenericWithVirtual1 +{ + // SPURIOUS-heuristic-summary=Models;DerivedGenericWithVirtual;true;ReturnParam;(System.String);;Argument[0];ReturnValue;value;df-generated + // SPURIOUS-contentbased-summary=Models;DerivedGenericWithVirtual;true;ReturnParam;(System.String);;Argument[0];ReturnValue;value;dfc-generated + public override string ReturnParam(string input) + { + return input; + } + + // SPURIOUS-heuristic-summary=Models;DerivedGenericWithVirtual;true;StubImplementation;(System.String);;Argument[0];ReturnValue;value;df-generated + // SPURIOUS-contentbased-summary=Models;DerivedGenericWithVirtual;true;StubImplementation;(System.String);;Argument[0];ReturnValue;value;dfc-generated + public override string StubImplementation(string input) + { + return input; + } +} + +public class GenericWithVirtual2 +{ + // heuristic-summary=Models;GenericWithVirtual2;true;ReturnParam;(T);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=Models;GenericWithVirtual2;true;ReturnParam;(T);;Argument[0];ReturnValue;value;dfc-generated + public virtual T ReturnParam(T input) + { + return input; + } + + // Missing model. Should have been lifted. + // SPURIOUS-neutral=Models;GenericWithVirtual2;StubImplementation;(T);summary;df-generated + + public virtual T StubImplementation(T input) + { + throw null; + } +} + +public class NestedGenericWithVirtual : GenericWithVirtual2 { } + +public class DerivedNestedGenericWithVirtual : NestedGenericWithVirtual +{ + // SPURIOUS-heuristic-summary=Models;DerivedNestedGenericWithVirtual;true;ReturnParam;(System.String);;Argument[0];ReturnValue;value;df-generated + // SPURIOUS-contentbased-summary=Models;DerivedNestedGenericWithVirtual;true;ReturnParam;(System.String);;Argument[0];ReturnValue;value;dfc-generated + public override string ReturnParam(string input) + { + return input; + } + + // SPURIOUS-heuristic-summary=Models;DerivedNestedGenericWithVirtual;true;StubImplementation;(System.String);;Argument[0];ReturnValue;value;df-generated + // SPURIOUS-contentbased-summary=Models;DerivedNestedGenericWithVirtual;true;StubImplementation;(System.String);;Argument[0];ReturnValue;value;dfc-generated + public override string StubImplementation(string input) + { + return input; + } +} + public abstract class BaseClassFlow { // heuristic-summary=Models;BaseClassFlow;true;ReturnParam;(System.Object);;Argument[0];ReturnValue;value;df-generated From 541cde98e0bb554f174efeb29bb03f02407c8b9c Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 16 Jul 2026 12:23:53 +0200 Subject: [PATCH 2/5] C#: Lift models to unbound declarations. --- csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll b/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll index 5b1b9e4ae65c..df030529550a 100644 --- a/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll +++ b/csharp/ql/src/utils/modelgenerator/internal/CaptureModels.qll @@ -213,7 +213,8 @@ module SummaryModelGeneratorInput implements SummaryModelGeneratorInputSig { } private Callable getARelevantOverrideeOrImplementee(Overridable m) { - m.overridesOrImplements(result) and relevant(result) + exists(Callable c | m.overridesOrImplements(c) and result = c.getUnboundDeclaration()) and + relevant(result) } /** From 3fca6734f3d81a77275f5e966690d76eb1117a6d Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 16 Jul 2026 12:24:33 +0200 Subject: [PATCH 3/5] C#: Update model generator expected test output. --- .../modelgenerator/dataflow/Summaries.cs | 21 +++++++------------ 1 file changed, 8 insertions(+), 13 deletions(-) diff --git a/csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs b/csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs index 0ccfe69b7a98..afab366f2158 100644 --- a/csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs +++ b/csharp/ql/test/utils/modelgenerator/dataflow/Summaries.cs @@ -287,8 +287,6 @@ public virtual T ReturnParam(T input) return input; } - // Missing model. Should have been lifted. - // SPURIOUS-neutral=Models;GenericWithVirtual1;StubImplementation;(T);summary;df-generated public virtual T StubImplementation(T input) { throw null; @@ -297,15 +295,15 @@ public virtual T StubImplementation(T input) public class DerivedGenericWithVirtual : GenericWithVirtual1 { - // SPURIOUS-heuristic-summary=Models;DerivedGenericWithVirtual;true;ReturnParam;(System.String);;Argument[0];ReturnValue;value;df-generated - // SPURIOUS-contentbased-summary=Models;DerivedGenericWithVirtual;true;ReturnParam;(System.String);;Argument[0];ReturnValue;value;dfc-generated + // heuristic-summary=Models;GenericWithVirtual1;true;ReturnParam;(T);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=Models;GenericWithVirtual1;true;ReturnParam;(T);;Argument[0];ReturnValue;value;dfc-generated public override string ReturnParam(string input) { return input; } - // SPURIOUS-heuristic-summary=Models;DerivedGenericWithVirtual;true;StubImplementation;(System.String);;Argument[0];ReturnValue;value;df-generated - // SPURIOUS-contentbased-summary=Models;DerivedGenericWithVirtual;true;StubImplementation;(System.String);;Argument[0];ReturnValue;value;dfc-generated + // heuristic-summary=Models;GenericWithVirtual1;true;StubImplementation;(T);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=Models;GenericWithVirtual1;true;StubImplementation;(T);;Argument[0];ReturnValue;value;dfc-generated public override string StubImplementation(string input) { return input; @@ -321,9 +319,6 @@ public virtual T ReturnParam(T input) return input; } - // Missing model. Should have been lifted. - // SPURIOUS-neutral=Models;GenericWithVirtual2;StubImplementation;(T);summary;df-generated - public virtual T StubImplementation(T input) { throw null; @@ -334,15 +329,15 @@ public class NestedGenericWithVirtual : GenericWithVirtual2 { } public class DerivedNestedGenericWithVirtual : NestedGenericWithVirtual { - // SPURIOUS-heuristic-summary=Models;DerivedNestedGenericWithVirtual;true;ReturnParam;(System.String);;Argument[0];ReturnValue;value;df-generated - // SPURIOUS-contentbased-summary=Models;DerivedNestedGenericWithVirtual;true;ReturnParam;(System.String);;Argument[0];ReturnValue;value;dfc-generated + // heuristic-summary=Models;GenericWithVirtual2;true;ReturnParam;(T);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=Models;GenericWithVirtual2;true;ReturnParam;(T);;Argument[0];ReturnValue;value;dfc-generated public override string ReturnParam(string input) { return input; } - // SPURIOUS-heuristic-summary=Models;DerivedNestedGenericWithVirtual;true;StubImplementation;(System.String);;Argument[0];ReturnValue;value;df-generated - // SPURIOUS-contentbased-summary=Models;DerivedNestedGenericWithVirtual;true;StubImplementation;(System.String);;Argument[0];ReturnValue;value;dfc-generated + // heuristic-summary=Models;GenericWithVirtual2;true;StubImplementation;(T);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=Models;GenericWithVirtual2;true;StubImplementation;(T);;Argument[0];ReturnValue;value;dfc-generated public override string StubImplementation(string input) { return input; From 0b365b3622bcaf72e7da345ebbf99b6a39d06257 Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 16 Jul 2026 12:26:07 +0200 Subject: [PATCH 4/5] Java: Lift models to source (unbound) declarations. --- java/ql/src/utils/modelgenerator/internal/CaptureModels.qll | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll b/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll index f02f9a5b623d..2fe9079a9f7f 100644 --- a/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll +++ b/java/ql/src/utils/modelgenerator/internal/CaptureModels.qll @@ -167,7 +167,7 @@ module SummaryModelGeneratorInput implements SummaryModelGeneratorInputSig { Parameter asParameter(NodeExtended node) { result = node.asParameter() } private J::Method getARelevantOverride(J::Method m) { - result = m.getAnOverride() and + result = m.getAnOverride().getSourceDeclaration() and relevant(result) and // Other exclusions for overrides. not m instanceof J::ToStringMethod From f184d28ddae49ad9efd200e25c6eaf909b06442b Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Thu, 16 Jul 2026 14:39:28 +0200 Subject: [PATCH 5/5] Java: Add java generics test cases. --- .../modelgenerator/dataflow/p/Generics.java | 62 +++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 java/ql/test/utils/modelgenerator/dataflow/p/Generics.java diff --git a/java/ql/test/utils/modelgenerator/dataflow/p/Generics.java b/java/ql/test/utils/modelgenerator/dataflow/p/Generics.java new file mode 100644 index 000000000000..46d81c8bb7ae --- /dev/null +++ b/java/ql/test/utils/modelgenerator/dataflow/p/Generics.java @@ -0,0 +1,62 @@ +package p; + +public class Generics { + + public class Generic1 { + // heuristic-summary=p;Generics$Generic1;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=p;Generics$Generic1;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;dfc-generated + public T ReturnParam(T input) { + return input; + } + + public T StubImplementation(T input) { + return null; + } + } + + public class DerivedGeneric extends Generic1 { + // heuristic-summary=p;Generics$Generic1;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=p;Generics$Generic1;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;dfc-generated + @Override + public String ReturnParam(String input) { + return input; + } + + // heuristic-summary=p;Generics$Generic1;true;StubImplementation;(Object);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=p;Generics$Generic1;true;StubImplementation;(Object);;Argument[0];ReturnValue;value;dfc-generated + @Override + public String StubImplementation(String input) { + return input; + } + } + + public class Generic2 { + // heuristic-summary=p;Generics$Generic2;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=p;Generics$Generic2;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;dfc-generated + public T ReturnParam(T input) { + return input; + } + + public T StubImplementation(T input) { + return null; + } + } + + public class NestedGeneric extends Generic2 { } + + public class DerivedNestedGeneric extends NestedGeneric { + // heuristic-summary=p;Generics$Generic2;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=p;Generics$Generic2;true;ReturnParam;(Object);;Argument[0];ReturnValue;value;dfc-generated + @Override + public String ReturnParam(String input) { + return input; + } + + // heuristic-summary=p;Generics$Generic2;true;StubImplementation;(Object);;Argument[0];ReturnValue;value;df-generated + // contentbased-summary=p;Generics$Generic2;true;StubImplementation;(Object);;Argument[0];ReturnValue;value;dfc-generated + @Override + public String StubImplementation(String input) { + return input; + } + } +}