diff --git a/java/ql/lib/semmle/code/java/Generics.qll b/java/ql/lib/semmle/code/java/Generics.qll index e0204b1beace..fbd979a03694 100644 --- a/java/ql/lib/semmle/code/java/Generics.qll +++ b/java/ql/lib/semmle/code/java/Generics.qll @@ -521,7 +521,13 @@ private predicate unificationTargets(RefType t1, Type t2) { t2 = a2.getComponentType() ) or - exists(ParameterizedType pt1, ParameterizedType pt2, int pos | + unificationTargetsParameterized(_, _, t1, t2) +} + +private predicate unificationTargetsParameterized( + ParameterizedType pt1, ParameterizedType pt2, RefType t1, RefType t2 +) { + exists(int pos | unificationTargets(pt1, pt2) and t1 = pt1.getTypeArgument(pos) and t2 = pt2.getTypeArgument(pos) @@ -565,10 +571,12 @@ private predicate hasParameterSubstitution( GenericType g1, ParameterizedType pt1, GenericType g2, ParameterizedType pt2, TypeVariable v, RefType subst ) { - unificationTargets(pt1, pt2) and - exists(int pos | hasSubstitution(pt1.getTypeArgument(pos), pt2.getTypeArgument(pos), v, subst)) and - g1 = pt1.getGenericType() and - g2 = pt2.getGenericType() + exists(RefType t1, RefType t2 | + unificationTargetsParameterized(pt1, pt2, t1, t2) and + hasSubstitution(t1, t2, v, subst) and + g1 = pt1.getGenericType() and + g2 = pt2.getGenericType() + ) } /** diff --git a/java/ql/lib/semmle/code/java/Type.qll b/java/ql/lib/semmle/code/java/Type.qll index aa1cc5fdc7f7..dd646e74285c 100644 --- a/java/ql/lib/semmle/code/java/Type.qll +++ b/java/ql/lib/semmle/code/java/Type.qll @@ -1261,14 +1261,21 @@ private Type erase(Type t) { * * For the definition of the notion of *erasure* see JLS v8, section 4.6 (Type Erasure). */ +bindingset[t1, t2] overlay[caller?] -pragma[inline] +pragma[inline_late] predicate haveIntersection(RefType t1, RefType t2) { exists(RefType e1, RefType e2 | e1 = erase(t1) and e2 = erase(t2) | - erasedHaveIntersection(e1, e2) + erasedHaveIntersectionFilter(e1, e2) ) } +bindingset[t1, t2] +pragma[inline_late] +private predicate erasedHaveIntersectionFilter(RefType t1, RefType t2) { + erasedHaveIntersection(t1, t2) +} + /** * Holds if there is no common (reflexive, transitive) subtype of the erasures * of types `t1` and `t2`. diff --git a/java/ql/src/Likely Bugs/Collections/ContainsTypeMismatch.ql b/java/ql/src/Likely Bugs/Collections/ContainsTypeMismatch.ql index d1a398d1322c..497aa10cb4de 100644 --- a/java/ql/src/Likely Bugs/Collections/ContainsTypeMismatch.ql +++ b/java/ql/src/Likely Bugs/Collections/ContainsTypeMismatch.ql @@ -103,8 +103,8 @@ class MismatchedContainerAccess extends MethodCall { | this.getCallee() .getDeclaringType() - .getASourceSupertype*() .getSourceDeclaration() + .getASourceSupertype*() .hasQualifiedName(package, type) and this.getCallee().getParameter(i).getType() instanceof TypeObject ) @@ -119,7 +119,7 @@ class MismatchedContainerAccess extends MethodCall { containerAccess(package, type, p, this.getCallee().getSignature(), i) | t = this.getCallee().getDeclaringType() and - t.getASourceSupertype*().getSourceDeclaration() = g and + t.getSourceDeclaration().getASourceSupertype*() = g and g.hasQualifiedName(package, type) and indirectlyInstantiates(t, g, p, result) ) pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy