Commit Graph

3427 Commits

Author SHA1 Message Date
Robert Marsh
6f7f68fee8 Merge branch 'main' into rdmarsh2/cpp/ir-synthetic-destructors 2024-02-22 18:10:13 +00:00
Robert Marsh
942a4ed925 C++: move handlesDestructorsExplicitly up to TranslatedReturnStmt 2024-02-22 16:46:19 +00:00
Mathias Vorreiter Pedersen
0bf29f0a62 Merge branch 'main' into model-experiments 2024-02-22 15:05:53 +00:00
Mathias Vorreiter Pedersen
350d5bf0ce C++: Update QLDoc on 'modeledFlowBarrier'. 2024-02-22 13:30:39 +00:00
Mathias Vorreiter Pedersen
671904d58c C++: Fix QLoc on 'PartialFlowFunction'. 2024-02-22 13:27:10 +00:00
Mathias Vorreiter Pedersen
aca3970c33 C++: Fix QLoc on 'isPartialWrite'. 2024-02-22 13:25:13 +00:00
Robert Marsh
875ab74c28 Merge branch 'main' into rdmarsh2/cpp/ir-synthetic-destructors
Fixes conflicts in C++ IR tests and Stmt.qll
2024-02-21 21:34:49 +00:00
Robert Marsh
66743fb0db C++: refactor TranslatedReturnStmt 2024-02-21 20:50:30 +00:00
Robert Marsh
e0c7849f52 C++: fix incorrect use of getChildInternal 2024-02-21 20:35:58 +00:00
github-actions[bot]
37f8fa3413 Post-release preparation for codeql-cli-2.16.3 2024-02-20 16:50:47 +00:00
Geoffrey White
5787dcc82d C++: Make getStaticCallTarget() return a DataFlowCallable. 2024-02-20 14:49:51 +00:00
Geoffrey White
356214c11b C++: Implement SummaryReturnNode. 2024-02-20 14:48:02 +00:00
Geoffrey White
5683092d6a C++: Implement SummaryParameterNode. 2024-02-20 14:48:02 +00:00
Geoffrey White
1ace9ee50f C++: Create a proper class for DataFlowCallable, that includes summarized callables. 2024-02-20 14:48:02 +00:00
Geoffrey White
e1a5a84253 C++: Create a proper class for DataFlowCall, that includes summarized callables. 2024-02-20 14:48:02 +00:00
github-actions[bot]
6d061fbc35 Release preparation for version 2.16.3 2024-02-20 14:26:23 +00:00
Jeroen Ketema
2becb3043e Merge pull request #15638 from jketema/destructors5
C++: Support C++20 range-based for initializers
2024-02-19 16:22:23 +01:00
Robert Marsh
2494b7d801 C++: fix for IR CFG problem with return in if 2024-02-16 21:08:21 +00:00
Geoffrey White
6e13b877bb C++: Add FlowSummaryNode and test it. 2024-02-16 18:06:57 +00:00
Jeroen Ketema
dd39fa0bde C++: Support C++20 range-based for initializers 2024-02-16 15:20:14 +01:00
Mathias Vorreiter Pedersen
06ff46091d C++: Fix joins in 'controlsBlock'. 2024-02-16 14:49:20 +01:00
Mathias Vorreiter Pedersen
b407c86d03 C++: Make Code Scanning happy. 2024-02-16 13:51:34 +01:00
Mathias Vorreiter Pedersen
57c1bf5835 C++: Add file-level QLDoc. 2024-02-16 13:47:02 +01:00
Geoffrey White
e187a4a7d6 C++: Add flow summaries to simpleLocalFlowStep. 2024-02-16 12:31:17 +00:00
Mathias Vorreiter Pedersen
499ab0892f C++: Currently, to catch flow in an example such as:
```cpp
char* source();
void sink(const char*);
int sprintf(char *, const char *, ...);

void call_sprintf(char* path, char* data) {
        sprintf(path, "%s", "abc"); // (1)
        sprintf(path, "%s", data); // (2)
}

void foo() {
        char path[10];
        call_sprintf(path, source()); // (3)
        sink(path);
}
```
we identify that the `*path [post update]` node at `// (2)` is a
`ReturnNodeExt` and since `*data` flows to that node flow will be carried
out to `*path [post update]` at // (3) and thus reach `sink(path)`.

The reason `*path [post update]` at `// 2` is recognized as a `ReturnNodeExt`
is because it satisfies the following condition (which is identified by the
shared dataflow library):
There is flow from the parameter node `*path` to the pre-update node of the
post-update node `*path [post update]` at `// (2)`.

However, when we start recognizing that the call to `sprintf(path, ...)` at
`// (1)` overrides the value of `*path` and no longer provide use-use flow out
of `*path` the `*path [post update]` node at `// (2)` is no longer recognized
as a `ReturnNodeExt` (because it doesn't satisfy the above criteria).

Thus, we need to identify the flow above without relying on the dataflow
library's summary mechanism. That is, instead of relying on the dataflow
library's mechanism to summarize the `*data -> *path` flow for `call_sprintf`
we need to:
- Ensure that the write to `*path` at `// (2)` is recognized as the "final"
write to the parameter, and
- Ensure that there's flow out of that parameter and back to
`*path [post update]` at `// (3)`.

Luckiky, we do all of this already to support flow out of writes to parameters
that don't have post-update nodes. For example, in something like:
```cpp
void set(int* x, int y) {
  *x = y;
}

void test() {
  int x;
  set(&x, source());
  sink(x);
}
```
So in order to make the original example work, all we need to do is to remove
the restrictions on this mechanism so that the same mechanism that makes the
above example work also makes the original example work!
2024-02-16 13:09:45 +01:00
Mathias Vorreiter Pedersen
7e9bf2a880 C++: Add a model for 'partial updating' and extend models appropriately. 2024-02-16 12:56:19 +01:00
Mathias Vorreiter Pedersen
24a63ae94d C++: Block flow by default. 2024-02-16 12:56:19 +01:00
Mathias Vorreiter Pedersen
c19ed4c17e Merge pull request #15626 from MathiasVP/fix-constness-checking
C++: Don't strip specifiers away in `TFinalParameterUse`
2024-02-16 10:09:43 +01:00
Jeroen Ketema
da3ff4813f Merge pull request #15612 from jketema/destructors4a
C++: Support `constexpr if` in the IR
2024-02-15 17:29:56 +01:00
Mathias Vorreiter Pedersen
532e8dac45 C++: Don't strip specifiers in 'TFinalParameterUse'. 2024-02-15 14:08:12 +01:00
Jeroen Ketema
33413129a5 C++: For unnamed local variable declaration entries consider the name of the variable 2024-02-14 15:03:04 +01:00
Jeroen Ketema
46bc311111 C++: Support constexpr if in the IR 2024-02-14 13:37:56 +01:00
Jeroen Ketema
caf09e0735 C++: Update IR comment that no longer applies 2024-02-13 21:30:58 +01:00
Jeroen Ketema
b3aea0f893 C++: Do not print the qualifier of OverloadedPointerDereferenceExpr twice in PrintAST 2024-02-13 21:29:21 +01:00
Robert Marsh
7e23ccd383 Merge branch 'main' into rdmarsh2/cpp/ir-synthetic-destructors 2024-02-13 15:45:51 +00:00
Robert Marsh
128bc99f90 C++: delete some FIXMEs that turned out fine 2024-02-13 15:34:36 +00:00
Mathias Vorreiter Pedersen
fb4bd53ec5 Revert "Merge pull request #15528 from MathiasVP/flow-barrier-interface"
This reverts commit c5dc88345d, reversing
changes made to 781486172e.
2024-02-13 13:42:58 +00:00
Mathias Vorreiter Pedersen
cb7fe16ced Revert "Merge pull request #15537 from MathiasVP/swap-also-clears-first-argument"
This reverts commit 23677b23c2, reversing
changes made to c5dc88345d.
2024-02-13 13:42:58 +00:00
Robert Marsh
b9785ea7b2 C++: autoformat 2024-02-13 01:07:41 +00:00
Robert Marsh
f791b0ebbf C++: Model for smart pointer destructors 2024-02-13 01:00:46 +00:00
Robert Marsh
b6cf64cff3 C++: simplify TranslatedBlock::getLastChild 2024-02-13 00:46:53 +00:00
Robert Marsh
7d8872bb99 C++: Fix for multiple for-loop variables with destructors 2024-02-13 00:40:19 +00:00
Robert Marsh
b94c4a6e1b C++: fix for destructor of while-loop condition 2024-02-13 00:13:22 +00:00
Mathias Vorreiter Pedersen
70c7c1a5e7 C++: Add flow from the fill character to the output pointer. 2024-02-12 16:51:16 +00:00
Robert Marsh
d1160f86e1 C++: Autoformat for named destructors in IR 2024-02-09 22:35:12 +00:00
Geoffrey White
8bdb67cc15 C++: Allow member variables to be picked as input nodes. 2024-02-09 14:24:37 +00:00
Mathias Vorreiter Pedersen
4728cf5a12 C++: Allow the 'x' in 'x = source()' to be marked as a sink in MaD. 2024-02-09 14:07:48 +00:00
Mathias Vorreiter Pedersen
3719e10ce8 C++: Add a case for global or namespace variables in 'interpretElement0'. 2024-02-09 13:27:32 +00:00
Mathias Vorreiter Pedersen
52a1d905f1 C++: Qualified import of 'cpp' to make the file compile. 2024-02-09 13:25:17 +00:00
Anders Schack-Mulligen
566351a49a Merge pull request #15549 from aschackmull/dataflow/empty-provenance
Dataflow: Add empty provenance column to PathGraph.
2024-02-09 12:58:09 +01:00