@@ -367,9 +367,11 @@ module API {
367367
368368 Node methodEdge ( string name ) { none ( ) }
369369
370+ Node instanceEdge ( ) { none ( ) }
371+
370372 final predicate isImplicit ( ) { not this .isExplicit ( _) }
371373
372- predicate isExplicit ( DataFlow:: TypeNameNode typeName ) { none ( ) }
374+ predicate isExplicit ( DataFlow:: Node node ) { none ( ) }
373375 }
374376
375377 final class TypeNameNode = AbstractTypeNameNode ;
@@ -392,8 +394,8 @@ module API {
392394 )
393395 }
394396
395- final override predicate isExplicit ( DataFlow:: TypeNameNode typeName ) {
396- Specific:: needsExplicitTypeNameNode ( typeName , prefix )
397+ final override predicate isExplicit ( DataFlow:: Node node ) {
398+ Specific:: needsExplicitTypeNameNode ( node , prefix )
397399 }
398400 }
399401
@@ -424,6 +426,26 @@ module API {
424426 }
425427 }
426428
429+ class NewObjectTypeNameNode extends AbstractTypeNameNode , Impl:: MkNewObjectTypeNameNode {
430+ NewObjectTypeNameNode ( ) { this = Impl:: MkNewObjectTypeNameNode ( prefix ) }
431+
432+ final override Node getSuccessor ( string name ) {
433+ result = Impl:: MkNewObjectTypeNameNode ( prefix + "." + name )
434+ }
435+
436+ final override Node instanceEdge ( ) {
437+ exists ( DataFlow:: ObjectCreationNode creation |
438+ prefix = creation .getLowerCaseConstructedTypeName ( ) and
439+ Specific:: needsNewObjectTypeNameNode ( creation , prefix ) and
440+ result = getForwardStartNode ( creation )
441+ )
442+ }
443+
444+ final override predicate isExplicit ( DataFlow:: Node node ) {
445+ Specific:: needsNewObjectTypeNameNode ( node , prefix )
446+ }
447+ }
448+
427449 /**
428450 * An API entry point.
429451 *
@@ -517,6 +539,7 @@ module API {
517539 MkMethodAccessNode ( DataFlow:: CallNode call ) or
518540 MkExplicitTypeNameNode ( string prefix ) { Specific:: needsExplicitTypeNameNode ( _, prefix ) } or
519541 MkImplicitTypeNameNode ( string prefix ) { Specific:: needsImplicitTypeNameNode ( prefix ) } or
542+ MkNewObjectTypeNameNode ( string prefix ) { Specific:: needsNewObjectTypeNameNode ( _, prefix ) } or
520543 MkForwardNode ( DataFlow:: LocalSourceNode node , TypeTracker t ) { isReachable ( node , t ) } or
521544 /** Intermediate node for following backward data flow. */
522545 MkBackwardNode ( DataFlow:: LocalSourceNode node , TypeTracker t ) { isReachable ( node , t ) } or
@@ -565,7 +588,7 @@ module API {
565588 )
566589 or
567590 exists ( DataFlow:: Node qualifier | pred = getForwardEndNode ( getALocalSourceStrict ( qualifier ) ) |
568- exists ( CfgNodes:: ExprNodes:: MemberExprReadAccessCfgNode read |
591+ exists ( CfgNodes:: ExprNodes:: MemberExprCfgNode read |
569592 read .getQualifier ( ) = qualifier .asExpr ( ) and
570593 read .getLowerCaseMemberName ( ) = name and
571594 succ = getForwardStartNode ( DataFlow:: exprNode ( read ) )
@@ -678,13 +701,28 @@ module API {
678701 positionalParameterEdge ( pred , n , succ )
679702 }
680703
704+ pragma [ nomagic]
705+ private DataFlow:: CallNode getStaticConstructorLikeCall ( ) {
706+ exists ( string type |
707+ typeModel ( type , type + "!" , "Method[" + result .getLowerCaseName ( ) + "].ReturnValue" )
708+ )
709+ }
710+
681711 cached
682712 predicate instanceEdge ( Node pred , Node succ ) {
683713 // TODO: Also model parameters with a given type here
684714 exists ( DataFlow:: ObjectCreationNode objCreation |
685715 pred = getForwardEndNode ( objCreation .getConstructedTypeNode ( ) ) and
686716 succ = getForwardStartNode ( objCreation )
687717 )
718+ or
719+ exists ( DataFlow:: CallNode call |
720+ call = getStaticConstructorLikeCall ( ) and
721+ pred = getForwardEndNode ( call .getQualifier ( ) ) and
722+ succ = getForwardStartNode ( call )
723+ )
724+ or
725+ pred .( TypeNameNode ) .instanceEdge ( ) = succ
688726 }
689727
690728 cached
0 commit comments