Add test to list all custom modifiers extracted from IL

This commit is contained in:
Tamas Vajk
2020-12-16 21:11:41 +01:00
parent 7662b55ecc
commit f3a0d1d138
7 changed files with 155 additions and 4 deletions

View File

@@ -18,3 +18,4 @@ import ControlFlow
import DataFlow
import Attribute
import Stubs
import CustomModifierReceiver

View File

@@ -0,0 +1,29 @@
/**
* Provides a class to represent `modopt` and `modreq` declarations.
*/
private import CIL
private import dotnet
/**
* A class to represent entities that can recive custom modifiers. Custom modifiers can be attached to
* - the type of a `Field`,
* - the return type of a `Method` or `Property`,
* - the type of parameters.
* A `CustomModifierReceiver` is therefore either a `Field`, `Property`, `Method`, or `Parameter`.
*/
class CustomModifierReceiver extends Declaration, @cil_custom_modifier_receiver {
/** Holds if this targeted type has `modifier` applied as `modreq`. */
predicate hasRequiredCustomModifier(Type modifier) { cil_custom_modifiers(this, modifier, 1) }
/** Holds if this targeted type has `modifier` applied as `modopt`. */
predicate hasOptionalCustomModifier(Type modifier) { cil_custom_modifiers(this, modifier, 0) }
/**
* Holds if this targeted type has `modifier` applied as `kind`. `kind` 1 means `modreq`,
* `kind` 0 represents `modopt`.
*/
predicate hasCustomModifier(Type modifier, int kind) {
cil_custom_modifiers(this, modifier, kind)
}
}

View File

@@ -82,7 +82,7 @@ class Member extends DotNet::Member, Declaration, @cil_member {
}
/** A property. */
class Property extends DotNet::Property, Member, @cil_property {
class Property extends DotNet::Property, Member, CustomModifierReceiver, @cil_property {
override string getName() { cil_property(this, _, result, _) }
/** Gets the type of this property. */

View File

@@ -66,7 +66,8 @@ class MethodImplementation extends EntryPoint, @cil_method_implementation {
* A method, which corresponds to any callable in C#, including constructors,
* destructors, operators, accessors and so on.
*/
class Method extends DotNet::Callable, Element, Member, TypeContainer, DataFlowNode, @cil_method {
class Method extends DotNet::Callable, Element, Member, TypeContainer, DataFlowNode,
CustomModifierReceiver, @cil_method {
/**
* Gets a method implementation, if any. Note that there can
* be several implementations in different assemblies.

View File

@@ -57,7 +57,7 @@ class LocalVariable extends StackVariable, @cil_local_variable {
}
/** A method parameter. */
class Parameter extends DotNet::Parameter, StackVariable, @cil_parameter {
class Parameter extends DotNet::Parameter, StackVariable, CustomModifierReceiver, @cil_parameter {
/** Gets the method declaring this parameter. */
override Method getMethod() { this = result.getARawParameter() }
@@ -122,7 +122,7 @@ class ThisParameter extends Parameter {
}
/** A field. */
class Field extends DotNet::Field, Variable, Member, @cil_field {
class Field extends DotNet::Field, Variable, Member, CustomModifierReceiver, @cil_field {
override string toString() { result = getName() }
override string toStringWithTypes() {

View File

@@ -0,0 +1,107 @@
| AsRef | System.Runtime.InteropServices.InAttribute | modreq |
| BeginInvoke | System.Runtime.InteropServices.InAttribute | modreq |
| EndInvoke | System.Runtime.InteropServices.InAttribute | modreq |
| EventWriteTransfer | System.Runtime.InteropServices.InAttribute | modreq |
| GetPinnableReference | System.Runtime.InteropServices.InAttribute | modreq |
| Invoke | System.Runtime.InteropServices.InAttribute | modreq |
| Max | System.Runtime.InteropServices.InAttribute | modreq |
| Min | System.Runtime.InteropServices.InAttribute | modreq |
| Value | System.Runtime.CompilerServices.IsVolatile | modreq |
| _bufferedValues | System.Runtime.CompilerServices.IsVolatile | modreq |
| _bufferedValuesIndex | System.Runtime.CompilerServices.IsVolatile | modreq |
| _callbackPartitions | System.Runtime.CompilerServices.IsVolatile | modreq |
| _canceled | System.Runtime.CompilerServices.IsVolatile | modreq |
| _container | System.Runtime.CompilerServices.IsVolatile | modreq |
| _fullyInitialized | System.Runtime.CompilerServices.IsVolatile | modreq |
| _head | System.Runtime.CompilerServices.IsVolatile | modreq |
| _initialized | System.Runtime.CompilerServices.IsVolatile | modreq |
| _isFullyInitialized | System.Runtime.CompilerServices.IsVolatile | modreq |
| _isWriterInProgress | System.Runtime.CompilerServices.IsVolatile | modreq |
| _kernelEvent | System.Runtime.CompilerServices.IsVolatile | modreq |
| _localTimeZone | System.Runtime.CompilerServices.IsVolatile | modreq |
| _next | System.Runtime.CompilerServices.IsVolatile | modreq |
| _notifyWhenNoCallbacksRunning | System.Runtime.CompilerServices.IsVolatile | modreq |
| _oldKeepAlive | System.Runtime.CompilerServices.IsVolatile | modreq |
| _owner | System.Runtime.CompilerServices.IsVolatile | modreq |
| _pauseTicks | System.Runtime.CompilerServices.IsVolatile | modreq |
| _previous | System.Runtime.CompilerServices.IsVolatile | modreq |
| _queues | System.Runtime.CompilerServices.IsVolatile | modreq |
| _saDurationFormats | System.Runtime.CompilerServices.IsVolatile | modreq |
| _saLongTimes | System.Runtime.CompilerServices.IsVolatile | modreq |
| _saShortTimes | System.Runtime.CompilerServices.IsVolatile | modreq |
| _slotArray | System.Runtime.CompilerServices.IsVolatile | modreq |
| _state | System.Runtime.CompilerServices.IsVolatile | modreq |
| _tail | System.Runtime.CompilerServices.IsVolatile | modreq |
| _threadIDExecutingCallbacks | System.Runtime.CompilerServices.IsVolatile | modreq |
| _timer | System.Runtime.CompilerServices.IsVolatile | modreq |
| _version | System.Runtime.CompilerServices.IsVolatile | modreq |
| _waCalendars | System.Runtime.CompilerServices.IsVolatile | modreq |
| currentTimeZone | System.Runtime.CompilerServices.IsVolatile | modreq |
| g_nameCache | System.Runtime.CompilerServices.IsVolatile | modreq |
| get_Current | System.Runtime.InteropServices.InAttribute | modreq |
| get_Item | System.Runtime.InteropServices.InAttribute | modreq |
| m_Dispatchers | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_Next | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_array | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_channelData | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_combinedState | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_completionCountdown | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_completionEvent | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_continuationObject | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_currentCount | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_declaringType | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_etwProvider | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_eventData | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_eventObj | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_eventPipeProvider | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_exceptionalChildren | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_exceptionsHolder | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_faultExceptions | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_first | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_head | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_headIndex | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_internalCancellationRequested | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_isHandled | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_last | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_lock | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_mask | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_nameIsCached | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_rawManifest | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_signature | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_stateFlags | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_tail | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_tailIndex | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_taskId | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_taskSchedulerId | System.Runtime.CompilerServices.IsVolatile | modreq |
| m_waitHandle | System.Runtime.CompilerServices.IsVolatile | modreq |
| numOutstandingThreadRequests | System.Runtime.CompilerServices.IsVolatile | modreq |
| property Current | System.Runtime.InteropServices.InAttribute | modreq |
| property Item | System.Runtime.InteropServices.InAttribute | modreq |
| s_DefaultThreadCurrentCulture | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_DefaultThreadCurrentUICulture | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_Invariant | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_LcidCachedCultures | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_NameCachedCultures | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_anonymouslyHostedDynamicMethodsModule | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_cachedCultures | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_cachedRegions | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_currentRegionInfo | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_defaultBinder | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_defaultInstance | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_indentSize | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_initialized | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_invariant | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_invariantInfo | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_jajpDTFI | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_japaneseEraInfo | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_knownWords | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_lastProcessorCountRefreshTicks | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_processorCount | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_provider | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_providers | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_regionNames | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_userDefaultCulture | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_userDefaultUICulture | System.Runtime.CompilerServices.IsVolatile | modreq |
| s_zhtwDTFI | System.Runtime.CompilerServices.IsVolatile | modreq |
| set_Prop2 | System.Runtime.CompilerServices.IsExternalInit | modreq |
| threadPoolInitialized | System.Runtime.CompilerServices.IsVolatile | modreq |

View File

@@ -0,0 +1,13 @@
import semmle.code.cil.Type
bindingset[kind]
private string getKind(int kind) { if kind = 1 then result = "modreq" else result = "modopt" }
from string receiver, string modifier, int kind
where
exists(Type modType, CustomModifierReceiver cmr |
receiver = cmr.toString() and
cmr.hasCustomModifier(modType, kind) and
modType.getQualifiedName() = modifier
)
select receiver, modifier, getKind(kind)