Merge pull request #7809 from michaelnebel/csharp/test-pattern-match-flow

C#: Add flow test cases for undetected value flow, when making variable bindings in pattern matching.
This commit is contained in:
Michael Nebel
2022-02-07 14:05:50 +01:00
committed by GitHub
3 changed files with 70 additions and 0 deletions

View File

@@ -0,0 +1,5 @@
failures
edges
nodes
subpaths
#select

View File

@@ -0,0 +1,11 @@
/**
* @kind path-problem
*/
import csharp
import DataFlow::PathGraph
import TestUtilities.InlineFlowTest
from DataFlow::PathNode source, DataFlow::PathNode sink, DefaultValueFlowConf conf
where conf.hasFlowPath(source, sink)
select sink, source, sink, "$@", source, source.toString()

View File

@@ -0,0 +1,54 @@
using System;
public record class RecordClass2(object Prop) { }
public record class Nested(RecordClass2 Record) { }
public class K
{
private void M1()
{
var o = Source<object>(1);
var r = new RecordClass2(o);
if (r is RecordClass2 { Prop: object p })
{
Sink(p); // $ MISSING: hasValueFlow=1
}
}
private void M2()
{
var o = Source<object>(2);
var r = new RecordClass2(o);
switch (r)
{
case RecordClass2 { Prop: object p }:
Sink(p); // $ MISSING: hasValueFlow=2
break;
}
}
private void M3()
{
var o = Source<object>(3);
var s = new Nested(new RecordClass2(o));
if (s is Nested { Record: { Prop: object p } })
{
Sink(p); // $ MISSING: hasValueFlow=3
}
}
private void M4()
{
var o = Source<object>(4);
var s = new Nested(new RecordClass2(o));
if (s is Nested { Record.Prop: object p })
{
Sink(p); // $ MISSING: hasValueFlow=4
}
}
public static void Sink(object o) { }
static T Source<T>(object source) => throw null;
}