@@ -20,21 +20,29 @@ import cpp
2020import semmle.code.cpp.dataflow.DataFlow
2121import DataFlow:: PathGraph
2222
23+ Type getFullyConvertedType ( DataFlow:: Node node ) {
24+ result = node .asExpr ( ) .getFullyConverted ( ) .getUnspecifiedType ( )
25+ }
26+
2327class CastToPointerArithFlow extends DataFlow:: Configuration {
2428 CastToPointerArithFlow ( ) { this = "CastToPointerArithFlow" }
2529
26- override predicate isSource ( DataFlow:: Node node ) {
30+ override predicate isSource ( DataFlow:: Node node , DataFlow :: FlowState state ) {
2731 not node .asExpr ( ) instanceof Conversion and
2832 exists ( Type baseType1 , Type baseType2 |
2933 hasBaseType ( node .asExpr ( ) , baseType1 ) and
3034 hasBaseType ( node .asExpr ( ) .getConversion * ( ) , baseType2 ) and
3135 introducesNewField ( baseType1 , baseType2 )
32- )
36+ ) and
37+ getFullyConvertedType ( node ) .getName ( ) = state
3338 }
3439
35- override predicate isSink ( DataFlow:: Node node ) {
36- exists ( PointerAddExpr pae | pae .getAnOperand ( ) = node .asExpr ( ) ) or
37- exists ( ArrayExpr ae | ae .getArrayBase ( ) = node .asExpr ( ) )
40+ override predicate isSink ( DataFlow:: Node node , DataFlow:: FlowState state ) {
41+ (
42+ exists ( PointerAddExpr pae | pae .getAnOperand ( ) = node .asExpr ( ) ) or
43+ exists ( ArrayExpr ae | ae .getArrayBase ( ) = node .asExpr ( ) )
44+ ) and
45+ getFullyConvertedType ( node ) .getName ( ) = state
3846 }
3947}
4048
@@ -66,7 +74,7 @@ predicate introducesNewField(Class derived, Class base) {
6674
6775pragma [ nomagic]
6876predicate hasFullyConvertedType ( DataFlow:: PathNode node , Type t ) {
69- t = node .getNode ( ) . asExpr ( ) . getFullyConverted ( ) . getUnspecifiedType ( )
77+ getFullyConvertedType ( node .getNode ( ) ) = t
7078}
7179
7280from DataFlow:: PathNode source , DataFlow:: PathNode sink , CastToPointerArithFlow cfg , Type t
0 commit comments