@@ -1843,6 +1843,53 @@ class SystemThreadingTasksTaskTFlow extends LibraryTypeDataFlow, SystemThreading
18431843 sinkAp =
18441844 AccessPath:: field ( any ( SystemRuntimeCompilerServicesTaskAwaiterStruct s )
18451845 .getUnderlyingTaskField ( ) )
1846+ or
1847+ // var awaitable = task.ConfigureAwait(false); // <-- new ConfiguredTaskAwaitable<>(task, false)
1848+ // // m_configuredTaskAwaiter = new ConfiguredTaskAwaiter(task, false)
1849+ // // m_task = task
1850+ // var awaiter = awaitable.GetAwaiter();
1851+ // var result = awaiter.GetResult();
1852+ m = this .getConfigureAwaitMethod ( ) and
1853+ source = TCallableFlowSourceQualifier ( ) and
1854+ sourceAp = AccessPath:: empty ( ) and
1855+ sink = TCallableFlowSinkReturn ( ) and
1856+ sinkAp =
1857+ AccessPath:: cons ( any ( FieldContent fc |
1858+ fc .getField ( ) =
1859+ any ( SystemRuntimeCompilerServicesConfiguredTaskAwaitableTStruct t )
1860+ .getUnderlyingAwaiterField ( )
1861+ ) ,
1862+ AccessPath:: field ( any ( SystemRuntimeCompilerServicesConfiguredTaskAwaitableTConfiguredTaskAwaiterStruct s
1863+ ) .getUnderlyingTaskField ( ) ) )
1864+ }
1865+
1866+ override predicate requiresAccessPath ( Content head , AccessPath tail ) {
1867+ head .( FieldContent ) .getField ( ) =
1868+ any ( SystemRuntimeCompilerServicesConfiguredTaskAwaitableTStruct t ) .getUnderlyingAwaiterField ( ) and
1869+ tail =
1870+ AccessPath:: field ( any ( SystemRuntimeCompilerServicesConfiguredTaskAwaitableTConfiguredTaskAwaiterStruct s
1871+ ) .getUnderlyingTaskField ( ) )
1872+ }
1873+ }
1874+
1875+ /** Data flow for `System.Runtime.CompilerServices.ConfiguredTaskAwaitable<>`. */
1876+ private class SystemRuntimeCompilerServicesConfiguredTaskAwaitableTFlow extends LibraryTypeDataFlow ,
1877+ SystemRuntimeCompilerServicesConfiguredTaskAwaitableTStruct {
1878+ override predicate callableFlow (
1879+ CallableFlowSource source , AccessPath sourceAp , CallableFlowSink sink , AccessPath sinkAp ,
1880+ SourceDeclarationCallable c , boolean preservesValue
1881+ ) {
1882+ // var awaitable = task.ConfigureAwait(false);
1883+ // var awaiter = awaitable.GetAwaiter(); // <-- awaitable.m_configuredTaskAwaiter
1884+ // var result = awaiter.GetResult();
1885+ c = this .getGetAwaiterMethod ( ) and
1886+ source = TCallableFlowSourceQualifier ( ) and
1887+ sourceAp =
1888+ AccessPath:: field ( any ( SystemRuntimeCompilerServicesConfiguredTaskAwaitableTStruct s )
1889+ .getUnderlyingAwaiterField ( ) ) and
1890+ sink = TCallableFlowSinkReturn ( ) and
1891+ sinkAp = AccessPath:: empty ( ) and
1892+ preservesValue = true
18461893 }
18471894}
18481895
@@ -1950,6 +1997,32 @@ class SystemRuntimeCompilerServicesTaskAwaiterFlow extends LibraryTypeDataFlow,
19501997 }
19511998}
19521999
2000+ /** Data flow for `System.Runtime.CompilerServices.ConfiguredTaskAwaitable<>.ConfiguredTaskAwaiter`. */
2001+ class SystemRuntimeCompilerServicesConfiguredTaskAwaitableTConfiguredTaskAwaiterFlow extends LibraryTypeDataFlow ,
2002+ SystemRuntimeCompilerServicesConfiguredTaskAwaitableTConfiguredTaskAwaiterStruct {
2003+ override predicate callableFlow (
2004+ CallableFlowSource source , AccessPath sourceAp , CallableFlowSink sink , AccessPath sinkAp ,
2005+ SourceDeclarationCallable c , boolean preservesValue
2006+ ) {
2007+ // var awaitable = task.ConfigureAwait(false);
2008+ // var awaiter = awaitable.GetAwaiter();
2009+ // var result = awaiter.GetResult(); // <-- task.Result
2010+ preservesValue = true and
2011+ c = this .getGetResultMethod ( ) and
2012+ source = TCallableFlowSourceQualifier ( ) and
2013+ sourceAp =
2014+ AccessPath:: cons ( any ( FieldContent fc | fc .getField ( ) = this .getUnderlyingTaskField ( ) ) ,
2015+ AccessPath:: property ( any ( SystemThreadingTasksTaskTClass t ) .getResultProperty ( ) ) ) and
2016+ sink = TCallableFlowSinkReturn ( ) and
2017+ sinkAp = AccessPath:: empty ( )
2018+ }
2019+
2020+ override predicate requiresAccessPath ( Content head , AccessPath tail ) {
2021+ head .( FieldContent ) .getField ( ) = this .getUnderlyingTaskField ( ) and
2022+ tail = AccessPath:: property ( any ( SystemThreadingTasksTaskTClass t ) .getResultProperty ( ) )
2023+ }
2024+ }
2025+
19532026/** Data flow for `System.Text.Encoding`. */
19542027library class SystemTextEncodingFlow extends LibraryTypeDataFlow , SystemTextEncodingClass {
19552028 override predicate callableFlow (
0 commit comments