@@ -21,9 +21,10 @@ predicate isFreeExpr(Expr e, StackVariable v) {
21
21
exists ( VariableAccess va | va .getTarget ( ) = v and freeExprOrIndirect ( e , va , _) )
22
22
}
23
23
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 )
27
28
or
28
29
isDerefByCallExpr ( _, _, e , v )
29
30
}
@@ -38,26 +39,28 @@ predicate isDerefByCallExpr(Call c, int i, VariableAccess va, StackVariable v) {
38
39
v .getAnAccess ( ) = va and
39
40
va = c .getAnArgumentSubExpr ( i ) and
40
41
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 ) ) )
42
43
}
43
44
44
45
class UseAfterFreeReachability extends StackVariableReachability {
45
46
UseAfterFreeReachability ( ) { this = "UseAfterFree" }
46
47
47
48
override predicate isSource ( ControlFlowNode node , StackVariable v ) { isFreeExpr ( node , v ) }
48
49
49
- override predicate isSink ( ControlFlowNode node , StackVariable v ) { isDerefExpr ( node , v ) }
50
+ override predicate isSink ( ControlFlowNode node , StackVariable v ) { isAccessExpr ( node , v ) }
50
51
51
52
override predicate isBarrier ( ControlFlowNode node , StackVariable v ) {
52
53
definitionBarrier ( v , node ) or
53
54
isFreeExpr ( node , v )
54
55
}
55
56
}
56
57
58
+ // This query is a modified version of the `UseAfterFree.ql`
59
+ // (cpp/use-after-free) query from the CodeQL standard library.
57
60
from UseAfterFreeReachability r , StackVariable v , Expr free , Expr e
58
61
where
59
62
not isExcluded ( e , InvalidMemory1Package:: doNotAccessFreedMemoryQuery ( ) ) and
60
63
r .reaches ( free , v , e )
61
64
select 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