@@ -17,7 +17,7 @@ import semmle.code.cpp.controlflow.IRGuards
1717import semmle.code.cpp.security.FlowSources
1818import semmle.code.cpp.ir.dataflow.TaintTracking
1919import semmle.code.cpp.rangeanalysis.RangeAnalysisUtils
20- import DataFlow :: PathGraph
20+ import ImproperArrayIndexValidation :: PathGraph
2121import semmle.code.cpp.security.Security
2222
2323predicate hasUpperBound ( VariableAccess offsetExpr ) {
@@ -65,12 +65,10 @@ predicate predictableInstruction(Instruction instr) {
6565 predictableInstruction ( instr .( UnaryInstruction ) .getUnary ( ) )
6666}
6767
68- class ImproperArrayIndexValidationConfig extends TaintTracking :: Configuration {
69- ImproperArrayIndexValidationConfig ( ) { this = "ImproperArrayIndexValidationConfig" }
68+ module ImproperArrayIndexValidationConfig implements DataFlow :: ConfigSig {
69+ predicate isSource ( DataFlow :: Node source ) { isFlowSource ( source , _ ) }
7070
71- override predicate isSource ( DataFlow:: Node source ) { isFlowSource ( source , _) }
72-
73- override predicate isSanitizer ( DataFlow:: Node node ) {
71+ predicate isBarrier ( DataFlow:: Node node ) {
7472 hasUpperBound ( node .asExpr ( ) )
7573 or
7674 // These barriers are ported from `DefaultTaintTracking` because this query is quite noisy
@@ -107,7 +105,7 @@ class ImproperArrayIndexValidationConfig extends TaintTracking::Configuration {
107105 )
108106 }
109107
110- override predicate isSink ( DataFlow:: Node sink ) {
108+ predicate isSink ( DataFlow:: Node sink ) {
111109 exists ( ArrayExpr arrayExpr , VariableAccess offsetExpr |
112110 offsetExpr = arrayExpr .getArrayOffset ( ) and
113111 sink .asExpr ( ) = offsetExpr and
@@ -116,11 +114,13 @@ class ImproperArrayIndexValidationConfig extends TaintTracking::Configuration {
116114 }
117115}
118116
117+ module ImproperArrayIndexValidation = TaintTracking:: Make< ImproperArrayIndexValidationConfig > ;
118+
119119from
120- ImproperArrayIndexValidationConfig conf , DataFlow :: PathNode source , DataFlow :: PathNode sink ,
120+ ImproperArrayIndexValidation :: PathNode source , ImproperArrayIndexValidation :: PathNode sink ,
121121 string sourceType
122122where
123- conf . hasFlowPath ( source , sink ) and
123+ ImproperArrayIndexValidation :: hasFlowPath ( source , sink ) and
124124 isFlowSource ( source .getNode ( ) , sourceType )
125125select sink .getNode ( ) , source , sink ,
126126 "An array indexing expression depends on $@ that might be outside the bounds of the array." ,
0 commit comments