mirror of
https://github.com/github/codeql.git
synced 2025-12-17 01:03:14 +01:00
C#: Improve CFG for assignments
Write accesses in assignments, such as the access to `x` in `x = 0` are not evaluated, so they should not have entries in the control flow graph. However, qualifiers (and indexer arguments) should still be evaluated, for example in ``` x.Foo.Bar = 0; ``` the CFG should be `x --> x.Foo --> 0 --> x.Foo.Bar = 0` (as opposed to `x --> x.Foo --> x.Foo.Bar --> 0 --> x.Foo.Bar = 0`, prior to this change). A special case is assignments via acessors (properties, indexers, and event adders), where we do want to include the access in the control flow graph, as it represents the accessor call: ``` x.Prop = 0; ``` But instead of `x --> x.set_Prop --> 0 --> x.Prop = 0` the CFG should be `x --> 0 --> x.set_Prop --> x.Prop = 0`, as the setter is called *after* the assigned value has been evaluated. An even more special case is tuple assignments via accessors: ``` (x.Prop1, y.Prop2) = (0, 1); ``` Here the CFG should be `x --> y --> 0 --> 1 --> x.set_Prop1 --> y.set_Prop2 --> (x.Prop1, y.Prop2) = (0, 1)`.
This commit is contained in:
@@ -17,7 +17,6 @@
|
||||
| CSharp7.cs:72:13:72:19 | SSA def(z) | CSharp7.cs:75:16:75:16 | access to local variable z |
|
||||
| CSharp7.cs:72:17:72:19 | call to method F | CSharp7.cs:72:13:72:19 | SSA def(z) |
|
||||
| CSharp7.cs:74:13:74:15 | call to method F | CSharp7.cs:74:13:74:21 | access to field Item1 |
|
||||
| CSharp7.cs:75:16:75:16 | access to local variable z | CSharp7.cs:75:16:75:22 | access to field Item1 |
|
||||
| CSharp7.cs:75:16:75:16 | access to local variable z | CSharp7.cs:77:39:77:39 | access to local variable z |
|
||||
| CSharp7.cs:75:28:75:28 | 1 | CSharp7.cs:75:27:75:35 | (..., ...) |
|
||||
| CSharp7.cs:75:31:75:31 | 2 | CSharp7.cs:75:27:75:35 | (..., ...) |
|
||||
@@ -82,7 +81,6 @@
|
||||
| CSharp7.cs:114:61:114:66 | (..., ...) | CSharp7.cs:114:49:114:67 | (..., ...) |
|
||||
| CSharp7.cs:114:62:114:62 | 0 | CSharp7.cs:114:61:114:66 | (..., ...) |
|
||||
| CSharp7.cs:114:65:114:65 | 1 | CSharp7.cs:114:61:114:66 | (..., ...) |
|
||||
| CSharp7.cs:118:9:118:10 | access to local variable m2 | CSharp7.cs:118:9:118:16 | access to field Item2 |
|
||||
| CSharp7.cs:118:9:118:10 | access to local variable m2 | CSharp7.cs:119:19:119:20 | access to local variable m2 |
|
||||
| CSharp7.cs:119:19:119:20 | access to local variable m2 | CSharp7.cs:119:19:119:26 | access to field Item1 |
|
||||
| CSharp7.cs:123:28:123:36 | "DefUse3" | CSharp7.cs:123:22:123:36 | ... = ... |
|
||||
|
||||
Reference in New Issue
Block a user