@@ -712,6 +712,11 @@ private class CapturedVariableContent extends Content, TCapturedVariableContent
712712 override string toString ( ) { result = "captured " + v }
713713}
714714
715+ /** A value refered to by a reference. */
716+ final class ReferenceContent extends Content , TReferenceContent {
717+ override string toString ( ) { result = "&ref" }
718+ }
719+
715720/**
716721 * An element in an array.
717722 */
@@ -1040,6 +1045,13 @@ module RustDataFlow implements InputSig<Location> {
10401045 [ "crate::option::Option::Some" , "crate::result::Result::Ok" ]
10411046 )
10421047 or
1048+ exists ( PrefixExprCfgNode deref |
1049+ c instanceof ReferenceContent and
1050+ deref .getOperatorName ( ) = "*" and
1051+ node1 .asExpr ( ) = deref .getExpr ( ) and
1052+ node2 .asExpr ( ) = deref
1053+ )
1054+ or
10431055 VariableCapture:: readStep ( node1 , c , node2 )
10441056 )
10451057 or
@@ -1123,6 +1135,12 @@ module RustDataFlow implements InputSig<Location> {
11231135 node2 .( PostUpdateNode ) .getPreUpdateNode ( ) .asExpr ( ) = index .getBase ( )
11241136 )
11251137 or
1138+ exists ( RefExprCfgNode ref |
1139+ c instanceof ReferenceContent and
1140+ node1 .asExpr ( ) = ref .getExpr ( ) and
1141+ node2 .asExpr ( ) = ref
1142+ )
1143+ or
11261144 VariableCapture:: storeStep ( node1 , c , node2 )
11271145 )
11281146 or
@@ -1382,7 +1400,8 @@ private module Cached {
13821400 e =
13831401 [
13841402 any ( IndexExprCfgNode i ) .getBase ( ) , any ( FieldExprCfgNode access ) .getExpr ( ) ,
1385- any ( TryExprCfgNode try ) .getExpr ( )
1403+ any ( TryExprCfgNode try ) .getExpr ( ) ,
1404+ any ( PrefixExprCfgNode pe | pe .getOperatorName ( ) = "*" ) .getExpr ( )
13861405 ]
13871406 } or
13881407 TSsaNode ( SsaImpl:: DataFlowIntegration:: SsaNode node ) or
@@ -1482,7 +1501,8 @@ private module Cached {
14821501 TStructFieldContent ( StructCanonicalPath s , string field ) {
14831502 field = s .getStruct ( ) .getFieldList ( ) .( RecordFieldList ) .getAField ( ) .getName ( ) .getText ( )
14841503 } or
1485- TCapturedVariableContent ( VariableCapture:: CapturedVariable v )
1504+ TCapturedVariableContent ( VariableCapture:: CapturedVariable v ) or
1505+ TReferenceContent ( )
14861506
14871507 cached
14881508 newtype TContentSet = TSingletonContentSet ( Content c )
0 commit comments