Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit bfba95f

Browse files
committed
C++: Fix performance of 'cpp/upcast-array-pointer-arithmetic'.
1 parent 3c49447 commit bfba95f

1 file changed

Lines changed: 14 additions & 6 deletions

File tree

cpp/ql/src/Likely Bugs/Conversion/CastArrayPointerArithmetic.ql

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,21 +20,29 @@ import cpp
2020
import semmle.code.cpp.dataflow.DataFlow
2121
import DataFlow::PathGraph
2222

23+
Type getFullyConvertedType(DataFlow::Node node) {
24+
result = node.asExpr().getFullyConverted().getUnspecifiedType()
25+
}
26+
2327
class 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

6775
pragma[nomagic]
6876
predicate hasFullyConvertedType(DataFlow::PathNode node, Type t) {
69-
t = node.getNode().asExpr().getFullyConverted().getUnspecifiedType()
77+
getFullyConvertedType(node.getNode()) = t
7078
}
7179

7280
from DataFlow::PathNode source, DataFlow::PathNode sink, CastToPointerArithFlow cfg, Type t

0 commit comments

Comments
 (0)