Thanks to visit codestin.com
Credit goes to github.com

Skip to content

Commit f3a0d1d

Browse files
committed
Add test to list all custom modifiers extracted from IL
1 parent 7662b55 commit f3a0d1d

7 files changed

Lines changed: 155 additions & 4 deletions

File tree

csharp/ql/src/semmle/code/cil/CIL.qll

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,3 +18,4 @@ import ControlFlow
1818
import DataFlow
1919
import Attribute
2020
import Stubs
21+
import CustomModifierReceiver
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/**
2+
* Provides a class to represent `modopt` and `modreq` declarations.
3+
*/
4+
5+
private import CIL
6+
private import dotnet
7+
8+
/**
9+
* A class to represent entities that can recive custom modifiers. Custom modifiers can be attached to
10+
* - the type of a `Field`,
11+
* - the return type of a `Method` or `Property`,
12+
* - the type of parameters.
13+
* A `CustomModifierReceiver` is therefore either a `Field`, `Property`, `Method`, or `Parameter`.
14+
*/
15+
class CustomModifierReceiver extends Declaration, @cil_custom_modifier_receiver {
16+
/** Holds if this targeted type has `modifier` applied as `modreq`. */
17+
predicate hasRequiredCustomModifier(Type modifier) { cil_custom_modifiers(this, modifier, 1) }
18+
19+
/** Holds if this targeted type has `modifier` applied as `modopt`. */
20+
predicate hasOptionalCustomModifier(Type modifier) { cil_custom_modifiers(this, modifier, 0) }
21+
22+
/**
23+
* Holds if this targeted type has `modifier` applied as `kind`. `kind` 1 means `modreq`,
24+
* `kind` 0 represents `modopt`.
25+
*/
26+
predicate hasCustomModifier(Type modifier, int kind) {
27+
cil_custom_modifiers(this, modifier, kind)
28+
}
29+
}

csharp/ql/src/semmle/code/cil/Declaration.qll

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ class Member extends DotNet::Member, Declaration, @cil_member {
8282
}
8383

8484
/** A property. */
85-
class Property extends DotNet::Property, Member, @cil_property {
85+
class Property extends DotNet::Property, Member, CustomModifierReceiver, @cil_property {
8686
override string getName() { cil_property(this, _, result, _) }
8787

8888
/** Gets the type of this property. */

csharp/ql/src/semmle/code/cil/Method.qll

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,8 @@ class MethodImplementation extends EntryPoint, @cil_method_implementation {
6666
* A method, which corresponds to any callable in C#, including constructors,
6767
* destructors, operators, accessors and so on.
6868
*/
69-
class Method extends DotNet::Callable, Element, Member, TypeContainer, DataFlowNode, @cil_method {
69+
class Method extends DotNet::Callable, Element, Member, TypeContainer, DataFlowNode,
70+
CustomModifierReceiver, @cil_method {
7071
/**
7172
* Gets a method implementation, if any. Note that there can
7273
* be several implementations in different assemblies.

csharp/ql/src/semmle/code/cil/Variable.qll

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ class LocalVariable extends StackVariable, @cil_local_variable {
5757
}
5858

5959
/** A method parameter. */
60-
class Parameter extends DotNet::Parameter, StackVariable, @cil_parameter {
60+
class Parameter extends DotNet::Parameter, StackVariable, CustomModifierReceiver, @cil_parameter {
6161
/** Gets the method declaring this parameter. */
6262
override Method getMethod() { this = result.getARawParameter() }
6363

@@ -122,7 +122,7 @@ class ThisParameter extends Parameter {
122122
}
123123

124124
/** A field. */
125-
class Field extends DotNet::Field, Variable, Member, @cil_field {
125+
class Field extends DotNet::Field, Variable, Member, CustomModifierReceiver, @cil_field {
126126
override string toString() { result = getName() }
127127

128128
override string toStringWithTypes() {
Lines changed: 107 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,107 @@
1+
| AsRef | System.Runtime.InteropServices.InAttribute | modreq |
2+
| BeginInvoke | System.Runtime.InteropServices.InAttribute | modreq |
3+
| EndInvoke | System.Runtime.InteropServices.InAttribute | modreq |
4+
| EventWriteTransfer | System.Runtime.InteropServices.InAttribute | modreq |
5+
| GetPinnableReference | System.Runtime.InteropServices.InAttribute | modreq |
6+
| Invoke | System.Runtime.InteropServices.InAttribute | modreq |
7+
| Max | System.Runtime.InteropServices.InAttribute | modreq |
8+
| Min | System.Runtime.InteropServices.InAttribute | modreq |
9+
| Value | System.Runtime.CompilerServices.IsVolatile | modreq |
10+
| _bufferedValues | System.Runtime.CompilerServices.IsVolatile | modreq |
11+
| _bufferedValuesIndex | System.Runtime.CompilerServices.IsVolatile | modreq |
12+
| _callbackPartitions | System.Runtime.CompilerServices.IsVolatile | modreq |
13+
| _canceled | System.Runtime.CompilerServices.IsVolatile | modreq |
14+
| _container | System.Runtime.CompilerServices.IsVolatile | modreq |
15+
| _fullyInitialized | System.Runtime.CompilerServices.IsVolatile | modreq |
16+
| _head | System.Runtime.CompilerServices.IsVolatile | modreq |
17+
| _initialized | System.Runtime.CompilerServices.IsVolatile | modreq |
18+
| _isFullyInitialized | System.Runtime.CompilerServices.IsVolatile | modreq |
19+
| _isWriterInProgress | System.Runtime.CompilerServices.IsVolatile | modreq |
20+
| _kernelEvent | System.Runtime.CompilerServices.IsVolatile | modreq |
21+
| _localTimeZone | System.Runtime.CompilerServices.IsVolatile | modreq |
22+
| _next | System.Runtime.CompilerServices.IsVolatile | modreq |
23+
| _notifyWhenNoCallbacksRunning | System.Runtime.CompilerServices.IsVolatile | modreq |
24+
| _oldKeepAlive | System.Runtime.CompilerServices.IsVolatile | modreq |
25+
| _owner | System.Runtime.CompilerServices.IsVolatile | modreq |
26+
| _pauseTicks | System.Runtime.CompilerServices.IsVolatile | modreq |
27+
| _previous | System.Runtime.CompilerServices.IsVolatile | modreq |
28+
| _queues | System.Runtime.CompilerServices.IsVolatile | modreq |
29+
| _saDurationFormats | System.Runtime.CompilerServices.IsVolatile | modreq |
30+
| _saLongTimes | System.Runtime.CompilerServices.IsVolatile | modreq |
31+
| _saShortTimes | System.Runtime.CompilerServices.IsVolatile | modreq |
32+
| _slotArray | System.Runtime.CompilerServices.IsVolatile | modreq |
33+
| _state | System.Runtime.CompilerServices.IsVolatile | modreq |
34+
| _tail | System.Runtime.CompilerServices.IsVolatile | modreq |
35+
| _threadIDExecutingCallbacks | System.Runtime.CompilerServices.IsVolatile | modreq |
36+
| _timer | System.Runtime.CompilerServices.IsVolatile | modreq |
37+
| _version | System.Runtime.CompilerServices.IsVolatile | modreq |
38+
| _waCalendars | System.Runtime.CompilerServices.IsVolatile | modreq |
39+
| currentTimeZone | System.Runtime.CompilerServices.IsVolatile | modreq |
40+
| g_nameCache | System.Runtime.CompilerServices.IsVolatile | modreq |
41+
| get_Current | System.Runtime.InteropServices.InAttribute | modreq |
42+
| get_Item | System.Runtime.InteropServices.InAttribute | modreq |
43+
| m_Dispatchers | System.Runtime.CompilerServices.IsVolatile | modreq |
44+
| m_Next | System.Runtime.CompilerServices.IsVolatile | modreq |
45+
| m_array | System.Runtime.CompilerServices.IsVolatile | modreq |
46+
| m_channelData | System.Runtime.CompilerServices.IsVolatile | modreq |
47+
| m_combinedState | System.Runtime.CompilerServices.IsVolatile | modreq |
48+
| m_completionCountdown | System.Runtime.CompilerServices.IsVolatile | modreq |
49+
| m_completionEvent | System.Runtime.CompilerServices.IsVolatile | modreq |
50+
| m_continuationObject | System.Runtime.CompilerServices.IsVolatile | modreq |
51+
| m_currentCount | System.Runtime.CompilerServices.IsVolatile | modreq |
52+
| m_declaringType | System.Runtime.CompilerServices.IsVolatile | modreq |
53+
| m_etwProvider | System.Runtime.CompilerServices.IsVolatile | modreq |
54+
| m_eventData | System.Runtime.CompilerServices.IsVolatile | modreq |
55+
| m_eventObj | System.Runtime.CompilerServices.IsVolatile | modreq |
56+
| m_eventPipeProvider | System.Runtime.CompilerServices.IsVolatile | modreq |
57+
| m_exceptionalChildren | System.Runtime.CompilerServices.IsVolatile | modreq |
58+
| m_exceptionsHolder | System.Runtime.CompilerServices.IsVolatile | modreq |
59+
| m_faultExceptions | System.Runtime.CompilerServices.IsVolatile | modreq |
60+
| m_first | System.Runtime.CompilerServices.IsVolatile | modreq |
61+
| m_head | System.Runtime.CompilerServices.IsVolatile | modreq |
62+
| m_headIndex | System.Runtime.CompilerServices.IsVolatile | modreq |
63+
| m_internalCancellationRequested | System.Runtime.CompilerServices.IsVolatile | modreq |
64+
| m_isHandled | System.Runtime.CompilerServices.IsVolatile | modreq |
65+
| m_last | System.Runtime.CompilerServices.IsVolatile | modreq |
66+
| m_lock | System.Runtime.CompilerServices.IsVolatile | modreq |
67+
| m_mask | System.Runtime.CompilerServices.IsVolatile | modreq |
68+
| m_nameIsCached | System.Runtime.CompilerServices.IsVolatile | modreq |
69+
| m_rawManifest | System.Runtime.CompilerServices.IsVolatile | modreq |
70+
| m_signature | System.Runtime.CompilerServices.IsVolatile | modreq |
71+
| m_stateFlags | System.Runtime.CompilerServices.IsVolatile | modreq |
72+
| m_tail | System.Runtime.CompilerServices.IsVolatile | modreq |
73+
| m_tailIndex | System.Runtime.CompilerServices.IsVolatile | modreq |
74+
| m_taskId | System.Runtime.CompilerServices.IsVolatile | modreq |
75+
| m_taskSchedulerId | System.Runtime.CompilerServices.IsVolatile | modreq |
76+
| m_waitHandle | System.Runtime.CompilerServices.IsVolatile | modreq |
77+
| numOutstandingThreadRequests | System.Runtime.CompilerServices.IsVolatile | modreq |
78+
| property Current | System.Runtime.InteropServices.InAttribute | modreq |
79+
| property Item | System.Runtime.InteropServices.InAttribute | modreq |
80+
| s_DefaultThreadCurrentCulture | System.Runtime.CompilerServices.IsVolatile | modreq |
81+
| s_DefaultThreadCurrentUICulture | System.Runtime.CompilerServices.IsVolatile | modreq |
82+
| s_Invariant | System.Runtime.CompilerServices.IsVolatile | modreq |
83+
| s_LcidCachedCultures | System.Runtime.CompilerServices.IsVolatile | modreq |
84+
| s_NameCachedCultures | System.Runtime.CompilerServices.IsVolatile | modreq |
85+
| s_anonymouslyHostedDynamicMethodsModule | System.Runtime.CompilerServices.IsVolatile | modreq |
86+
| s_cachedCultures | System.Runtime.CompilerServices.IsVolatile | modreq |
87+
| s_cachedRegions | System.Runtime.CompilerServices.IsVolatile | modreq |
88+
| s_currentRegionInfo | System.Runtime.CompilerServices.IsVolatile | modreq |
89+
| s_defaultBinder | System.Runtime.CompilerServices.IsVolatile | modreq |
90+
| s_defaultInstance | System.Runtime.CompilerServices.IsVolatile | modreq |
91+
| s_indentSize | System.Runtime.CompilerServices.IsVolatile | modreq |
92+
| s_initialized | System.Runtime.CompilerServices.IsVolatile | modreq |
93+
| s_invariant | System.Runtime.CompilerServices.IsVolatile | modreq |
94+
| s_invariantInfo | System.Runtime.CompilerServices.IsVolatile | modreq |
95+
| s_jajpDTFI | System.Runtime.CompilerServices.IsVolatile | modreq |
96+
| s_japaneseEraInfo | System.Runtime.CompilerServices.IsVolatile | modreq |
97+
| s_knownWords | System.Runtime.CompilerServices.IsVolatile | modreq |
98+
| s_lastProcessorCountRefreshTicks | System.Runtime.CompilerServices.IsVolatile | modreq |
99+
| s_processorCount | System.Runtime.CompilerServices.IsVolatile | modreq |
100+
| s_provider | System.Runtime.CompilerServices.IsVolatile | modreq |
101+
| s_providers | System.Runtime.CompilerServices.IsVolatile | modreq |
102+
| s_regionNames | System.Runtime.CompilerServices.IsVolatile | modreq |
103+
| s_userDefaultCulture | System.Runtime.CompilerServices.IsVolatile | modreq |
104+
| s_userDefaultUICulture | System.Runtime.CompilerServices.IsVolatile | modreq |
105+
| s_zhtwDTFI | System.Runtime.CompilerServices.IsVolatile | modreq |
106+
| set_Prop2 | System.Runtime.CompilerServices.IsExternalInit | modreq |
107+
| threadPoolInitialized | System.Runtime.CompilerServices.IsVolatile | modreq |
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import semmle.code.cil.Type
2+
3+
bindingset[kind]
4+
private string getKind(int kind) { if kind = 1 then result = "modreq" else result = "modopt" }
5+
6+
from string receiver, string modifier, int kind
7+
where
8+
exists(Type modType, CustomModifierReceiver cmr |
9+
receiver = cmr.toString() and
10+
cmr.hasCustomModifier(modType, kind) and
11+
modType.getQualifiedName() = modifier
12+
)
13+
select receiver, modifier, getKind(kind)

0 commit comments

Comments
 (0)