mirror of
https://github.com/github/codeql.git
synced 2025-12-22 11:46:32 +01:00
C++: IR data flow through inheritance conversions
This makes IR data flow behave more like AST data flow, and it makes IR virtual dispatch work without further changes.
This commit is contained in:
@@ -205,7 +205,8 @@ private predicate simpleInstructionLocalFlowStep(Instruction iFrom, Instruction
|
|||||||
iTo.(CopyInstruction).getSourceValue() = iFrom or
|
iTo.(CopyInstruction).getSourceValue() = iFrom or
|
||||||
iTo.(PhiInstruction).getAnOperand().getDef() = iFrom or
|
iTo.(PhiInstruction).getAnOperand().getDef() = iFrom or
|
||||||
// Treat all conversions as flow, even conversions between different numeric types.
|
// Treat all conversions as flow, even conversions between different numeric types.
|
||||||
iTo.(ConvertInstruction).getUnary() = iFrom
|
iTo.(ConvertInstruction).getUnary() = iFrom or
|
||||||
|
iTo.(InheritanceConversionInstruction).getUnary() = iFrom
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -28,17 +28,17 @@ struct Bottom : Middle {
|
|||||||
void VirtualDispatch(Bottom *bottomPtr, Bottom &bottomRef) {
|
void VirtualDispatch(Bottom *bottomPtr, Bottom &bottomRef) {
|
||||||
Top *topPtr = bottomPtr, &topRef = bottomRef;
|
Top *topPtr = bottomPtr, &topRef = bottomRef;
|
||||||
|
|
||||||
sink(topPtr->isSource1()); // flow [NOT DETECTED]
|
sink(topPtr->isSource1()); // flow [NOT DETECTED by AST]
|
||||||
sink(topPtr->isSource2()); // flow [NOT DETECTED by AST]
|
sink(topPtr->isSource2()); // flow [NOT DETECTED by AST]
|
||||||
topPtr->isSink(source()); // flow [NOT DETECTED]
|
topPtr->isSink(source()); // flow [NOT DETECTED by AST]
|
||||||
|
|
||||||
sink(topPtr->notSource1()); // no flow [FALSE POSITIVE]
|
sink(topPtr->notSource1()); // no flow [FALSE POSITIVE]
|
||||||
sink(topPtr->notSource2()); // no flow [FALSE POSITIVE]
|
sink(topPtr->notSource2()); // no flow [FALSE POSITIVE]
|
||||||
topPtr->notSink(source()); // no flow [FALSE POSITIVE]
|
topPtr->notSink(source()); // no flow [FALSE POSITIVE]
|
||||||
|
|
||||||
sink(topRef.isSource1()); // flow [NOT DETECTED]
|
sink(topRef.isSource1()); // flow [NOT DETECTED by AST]
|
||||||
sink(topRef.isSource2()); // flow [NOT DETECTED by AST]
|
sink(topRef.isSource2()); // flow [NOT DETECTED by AST]
|
||||||
topRef.isSink(source()); // flow [NOT DETECTED]
|
topRef.isSink(source()); // flow [NOT DETECTED by AST]
|
||||||
|
|
||||||
sink(topRef.notSource1()); // no flow [FALSE POSITIVE]
|
sink(topRef.notSource1()); // no flow [FALSE POSITIVE]
|
||||||
sink(topRef.notSource2()); // no flow [FALSE POSITIVE]
|
sink(topRef.notSource2()); // no flow [FALSE POSITIVE]
|
||||||
|
|||||||
@@ -7,6 +7,10 @@
|
|||||||
| clang.cpp:39:42:39:47 | clang.cpp:41:18:41:19 | IR only |
|
| clang.cpp:39:42:39:47 | clang.cpp:41:18:41:19 | IR only |
|
||||||
| dispatch.cpp:16:37:16:42 | dispatch.cpp:32:16:32:24 | IR only |
|
| dispatch.cpp:16:37:16:42 | dispatch.cpp:32:16:32:24 | IR only |
|
||||||
| dispatch.cpp:16:37:16:42 | dispatch.cpp:40:15:40:23 | IR only |
|
| dispatch.cpp:16:37:16:42 | dispatch.cpp:40:15:40:23 | IR only |
|
||||||
|
| dispatch.cpp:22:37:22:42 | dispatch.cpp:31:16:31:24 | IR only |
|
||||||
|
| dispatch.cpp:22:37:22:42 | dispatch.cpp:39:15:39:23 | IR only |
|
||||||
|
| dispatch.cpp:33:18:33:23 | dispatch.cpp:23:38:23:38 | IR only |
|
||||||
|
| dispatch.cpp:41:17:41:22 | dispatch.cpp:23:38:23:38 | IR only |
|
||||||
| lambdas.cpp:8:10:8:15 | lambdas.cpp:14:3:14:6 | AST only |
|
| lambdas.cpp:8:10:8:15 | lambdas.cpp:14:3:14:6 | AST only |
|
||||||
| lambdas.cpp:8:10:8:15 | lambdas.cpp:18:8:18:8 | AST only |
|
| lambdas.cpp:8:10:8:15 | lambdas.cpp:18:8:18:8 | AST only |
|
||||||
| lambdas.cpp:8:10:8:15 | lambdas.cpp:21:3:21:6 | AST only |
|
| lambdas.cpp:8:10:8:15 | lambdas.cpp:21:3:21:6 | AST only |
|
||||||
|
|||||||
@@ -14,9 +14,13 @@
|
|||||||
| clang.cpp:45:17:45:18 | Load: m2 | clang.cpp:43:35:43:40 | Call: call to source |
|
| clang.cpp:45:17:45:18 | Load: m2 | clang.cpp:43:35:43:40 | Call: call to source |
|
||||||
| dispatch.cpp:11:38:11:38 | Load: x | dispatch.cpp:37:19:37:24 | Call: call to source |
|
| dispatch.cpp:11:38:11:38 | Load: x | dispatch.cpp:37:19:37:24 | Call: call to source |
|
||||||
| dispatch.cpp:11:38:11:38 | Load: x | dispatch.cpp:45:18:45:23 | Call: call to source |
|
| dispatch.cpp:11:38:11:38 | Load: x | dispatch.cpp:45:18:45:23 | Call: call to source |
|
||||||
|
| dispatch.cpp:23:38:23:38 | Load: x | dispatch.cpp:33:18:33:23 | Call: call to source |
|
||||||
|
| dispatch.cpp:23:38:23:38 | Load: x | dispatch.cpp:41:17:41:22 | Call: call to source |
|
||||||
|
| dispatch.cpp:31:16:31:24 | Call: call to isSource1 | dispatch.cpp:22:37:22:42 | Call: call to source |
|
||||||
| dispatch.cpp:32:16:32:24 | Call: call to isSource2 | dispatch.cpp:16:37:16:42 | Call: call to source |
|
| dispatch.cpp:32:16:32:24 | Call: call to isSource2 | dispatch.cpp:16:37:16:42 | Call: call to source |
|
||||||
| dispatch.cpp:35:16:35:25 | Call: call to notSource1 | dispatch.cpp:9:37:9:42 | Call: call to source |
|
| dispatch.cpp:35:16:35:25 | Call: call to notSource1 | dispatch.cpp:9:37:9:42 | Call: call to source |
|
||||||
| dispatch.cpp:36:16:36:25 | Call: call to notSource2 | dispatch.cpp:10:37:10:42 | Call: call to source |
|
| dispatch.cpp:36:16:36:25 | Call: call to notSource2 | dispatch.cpp:10:37:10:42 | Call: call to source |
|
||||||
|
| dispatch.cpp:39:15:39:23 | Call: call to isSource1 | dispatch.cpp:22:37:22:42 | Call: call to source |
|
||||||
| dispatch.cpp:40:15:40:23 | Call: call to isSource2 | dispatch.cpp:16:37:16:42 | Call: call to source |
|
| dispatch.cpp:40:15:40:23 | Call: call to isSource2 | dispatch.cpp:16:37:16:42 | Call: call to source |
|
||||||
| dispatch.cpp:43:15:43:24 | Call: call to notSource1 | dispatch.cpp:9:37:9:42 | Call: call to source |
|
| dispatch.cpp:43:15:43:24 | Call: call to notSource1 | dispatch.cpp:9:37:9:42 | Call: call to source |
|
||||||
| dispatch.cpp:44:15:44:24 | Call: call to notSource2 | dispatch.cpp:10:37:10:42 | Call: call to source |
|
| dispatch.cpp:44:15:44:24 | Call: call to notSource2 | dispatch.cpp:10:37:10:42 | Call: call to source |
|
||||||
|
|||||||
Reference in New Issue
Block a user