@@ -21,9 +21,10 @@ predicate isFreeExpr(Expr e, StackVariable v) {
2121 exists ( VariableAccess va | va .getTarget ( ) = v and freeExprOrIndirect ( e , va , _) )
2222}
2323
24- /** `e` is an expression that (may) dereference `v`. */
25- predicate isDerefExpr ( Expr e , StackVariable v ) {
26- v .getAnAccess ( ) = e and dereferenced ( e )
24+ /** `e` is an expression that accesses `v` but is not the lvalue of an assignment. */
25+ predicate isAccessExpr ( Expr e , StackVariable v ) {
26+ v .getAnAccess ( ) = e and
27+ not exists ( Assignment a | a .getLValue ( ) = e )
2728 or
2829 isDerefByCallExpr ( _, _, e , v )
2930}
@@ -38,26 +39,28 @@ predicate isDerefByCallExpr(Call c, int i, VariableAccess va, StackVariable v) {
3839 v .getAnAccess ( ) = va and
3940 va = c .getAnArgumentSubExpr ( i ) and
4041 not c .passesByReference ( i , va ) and
41- ( c .getTarget ( ) .hasEntryPoint ( ) implies isDerefExpr ( _, c .getTarget ( ) .getParameter ( i ) ) )
42+ ( c .getTarget ( ) .hasEntryPoint ( ) implies isAccessExpr ( _, c .getTarget ( ) .getParameter ( i ) ) )
4243}
4344
4445class UseAfterFreeReachability extends StackVariableReachability {
4546 UseAfterFreeReachability ( ) { this = "UseAfterFree" }
4647
4748 override predicate isSource ( ControlFlowNode node , StackVariable v ) { isFreeExpr ( node , v ) }
4849
49- override predicate isSink ( ControlFlowNode node , StackVariable v ) { isDerefExpr ( node , v ) }
50+ override predicate isSink ( ControlFlowNode node , StackVariable v ) { isAccessExpr ( node , v ) }
5051
5152 override predicate isBarrier ( ControlFlowNode node , StackVariable v ) {
5253 definitionBarrier ( v , node ) or
5354 isFreeExpr ( node , v )
5455 }
5556}
5657
58+ // This query is a modified version of the `UseAfterFree.ql`
59+ // (cpp/use-after-free) query from the CodeQL standard library.
5760from UseAfterFreeReachability r , StackVariable v , Expr free , Expr e
5861where
5962 not isExcluded ( e , InvalidMemory1Package:: doNotAccessFreedMemoryQuery ( ) ) and
6063 r .reaches ( free , v , e )
6164select e ,
62- "Memory pointed to by '" + v .getName ( ) .toString ( ) +
63- "' accessed but may have been previously freed $@." , free , "here"
65+ "Pointer '" + v .getName ( ) .toString ( ) + "' accessed but may have been previously freed $@." , free ,
66+ "here"
0 commit comments