@@ -31,12 +31,18 @@ module AccessAfterLifetime {
3131
3232 /**
3333 * A data flow sink for accesses to a pointer after its lifetime has ended,
34- * that is, a dereference.
34+ * that is, a dereference. We re-use the same sinks as for the accesses to
35+ * invalid pointers query.
3536 */
36- abstract class Sink extends QuerySink:: Range {
37- override string getSinkType ( ) { result = "AccessAfterLifetime" }
38- }
37+ class Sink = AccessInvalidPointer:: Sink ;
3938
39+ // /**
40+ // * A data flow sink for accesses to a pointer after its lifetime has ended,
41+ // * that is, a dereference.
42+ // */
43+ // abstract class Sink extends QuerySink::Range {
44+ // override string getSinkType() { result = "AccessAfterLifetime" }
45+ // }
4046 /**
4147 * A barrier for accesses to a pointer after its lifetime has ended.
4248 */
@@ -115,23 +121,14 @@ module AccessAfterLifetime {
115121 private class RefExprSource extends Source {
116122 Expr targetValue ;
117123
118- RefExprSource ( ) { this .asExpr ( ) .( RefExpr ) .getExpr ( ) = targetValue }
124+ RefExprSource ( ) {
125+ this .asExpr ( ) .( RefExpr ) .getExpr ( ) = targetValue and
126+ this .asExpr ( ) .( RefExpr ) .isRaw ( )
127+ }
119128
120129 override Expr getTarget ( ) { result = targetValue }
121130 }
122131
123- /**
124- * A pointer access using the unary `*` operator.
125- */
126- private class DereferenceSink extends Sink {
127- DereferenceSink ( ) { any ( DerefExpr p ) .getExpr ( ) = this .asExpr ( ) }
128- }
129-
130- /** A pointer access from model data. */
131- private class ModelsAsDataSink extends Sink {
132- ModelsAsDataSink ( ) { sinkNode ( this , "pointer-access" ) }
133- }
134-
135132 /**
136133 * A barrier for nodes inside closures, as we don't model lifetimes of
137134 * variables through closures properly.
0 commit comments