Skip to content

Commit abdf7ce

Browse files
authored
Merge pull request #2045 from AndreiDiaconu1/ircsharp-various-fixes
C# IR: Minor sanity fixes
2 parents 09f441a + c5cd5f4 commit abdf7ce

File tree

5 files changed

+108
-110
lines changed

5 files changed

+108
-110
lines changed

csharp/ql/src/semmle/code/csharp/ir/implementation/raw/internal/TranslatedExpr.qll

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -843,6 +843,9 @@ class TranslatedNonFieldVariableAccess extends TranslatedVariableAccess {
843843
implies
844844
expr = expr.getParent().(LocalVariableDeclAndInitExpr).getInitializer()
845845
)
846+
or
847+
// Static field accesses should be modeled as `TranslatedNonFieldAccess`
848+
expr.(FieldAccess).getTarget().isStatic()
846849
}
847850

848851
override Instruction getFirstInstruction() {
@@ -875,6 +878,11 @@ class TranslatedNonFieldVariableAccess extends TranslatedVariableAccess {
875878
class TranslatedFieldAccess extends TranslatedVariableAccess {
876879
override FieldAccess expr;
877880

881+
TranslatedFieldAccess() {
882+
// Static field accesses should be modeled as `TranslatedNonFieldAccess`
883+
not expr.getTarget().isStatic()
884+
}
885+
878886
override Instruction getFirstInstruction() {
879887
// If there is a qualifier
880888
if exists(this.getQualifier())

csharp/ql/src/semmle/code/csharp/ir/implementation/raw/internal/TranslatedFunction.qll

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
7575
else
7676
if exists(getParameter(0))
7777
then result = this.getParameter(0).getFirstInstruction()
78-
else result = this.getBody().getFirstInstruction()
78+
else result = this.getBodyOrReturn()
7979
)
8080
or
8181
(
@@ -85,7 +85,7 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
8585
else
8686
if exists(getConstructorInitializer())
8787
then result = this.getConstructorInitializer().getFirstInstruction()
88-
else result = this.getBody().getFirstInstruction()
88+
else result = this.getBodyOrReturn()
8989
)
9090
or
9191
tag = ReturnValueAddressTag() and
@@ -110,16 +110,22 @@ class TranslatedFunction extends TranslatedElement, TTranslatedFunction {
110110
else
111111
if exists(getConstructorInitializer())
112112
then result = this.getConstructorInitializer().getFirstInstruction()
113-
else result = this.getBody().getFirstInstruction()
113+
else result = this.getBodyOrReturn()
114114
)
115115
or
116116
child = this.getConstructorInitializer() and
117-
result = this.getBody().getFirstInstruction()
117+
result = this.getBodyOrReturn()
118118
or
119119
child = this.getBody() and
120120
result = this.getReturnSuccessorInstruction()
121121
}
122122

123+
private Instruction getBodyOrReturn() {
124+
if exists(this.getBody())
125+
then result = this.getBody().getFirstInstruction()
126+
else result = this.getReturnSuccessorInstruction()
127+
}
128+
123129
final override predicate hasInstruction(
124130
Opcode opcode, InstructionTag tag, Type resultType, boolean isLValue
125131
) {

csharp/ql/test/library-tests/ir/ir/indexers.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,6 @@ class Indexers
22
{
33
public class MyClass
44
{
5-
public MyClass()
6-
{
7-
}
8-
95
private string[] address = new string[2];
106
public string this[int index]
117
{

csharp/ql/test/library-tests/ir/ir/prop.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
class PropClass
22
{
3-
private int prop;
3+
private static int prop;
44

55
public int Prop
66
{

csharp/ql/test/library-tests/ir/ir/raw_ir.expected

Lines changed: 89 additions & 101 deletions
Original file line numberDiff line numberDiff line change
@@ -704,102 +704,91 @@ func_with_param_call.cs:
704704
# 10| v0_13(Void) = ExitFunction :
705705

706706
indexers.cs:
707-
# 5| System.Void Indexers.MyClass..ctor()
708-
# 5| Block 0
709-
# 5| v0_0(Void) = EnterFunction :
710-
# 5| mu0_1(null) = AliasedDefinition :
711-
# 5| mu0_2(null) = UnmodeledDefinition :
712-
# 5| r0_3(glval<MyClass>) = InitializeThis :
713-
# 6| v0_4(Void) = NoOp :
714-
# 5| v0_5(Void) = ReturnVoid :
715-
# 5| v0_6(Void) = UnmodeledUse : mu*
716-
# 5| v0_7(Void) = ExitFunction :
717-
718-
# 12| System.String Indexers.MyClass.get_Item(System.Int32)
707+
# 8| System.String Indexers.MyClass.get_Item(System.Int32)
708+
# 8| Block 0
709+
# 8| v0_0(Void) = EnterFunction :
710+
# 8| mu0_1(null) = AliasedDefinition :
711+
# 8| mu0_2(null) = UnmodeledDefinition :
712+
# 8| r0_3(glval<MyClass>) = InitializeThis :
713+
# 6| r0_4(glval<Int32>) = VariableAddress[index] :
714+
# 6| mu0_5(Int32) = InitializeParameter[index] : &:r0_4
715+
# 10| r0_6(glval<String>) = VariableAddress[#return] :
716+
# 10| r0_7(MyClass) = CopyValue : r0_3
717+
# 10| r0_8(glval<String[]>) = FieldAddress[address] : r0_7
718+
# 10| r0_9(String[]) = ElementsAddress : r0_8
719+
# 10| r0_10(glval<Int32>) = VariableAddress[index] :
720+
# 10| r0_11(Int32) = Load : &:r0_10, ~mu0_2
721+
# 10| r0_12(String[]) = PointerAdd[8] : r0_9, r0_11
722+
# 10| r0_13(String) = Load : &:r0_12, ~mu0_2
723+
# 10| mu0_14(String) = Store : &:r0_6, r0_13
724+
# 8| r0_15(glval<String>) = VariableAddress[#return] :
725+
# 8| v0_16(Void) = ReturnValue : &:r0_15, ~mu0_2
726+
# 8| v0_17(Void) = UnmodeledUse : mu*
727+
# 8| v0_18(Void) = ExitFunction :
728+
729+
# 12| System.Void Indexers.MyClass.set_Item(System.Int32,System.String)
719730
# 12| Block 0
720-
# 12| v0_0(Void) = EnterFunction :
721-
# 12| mu0_1(null) = AliasedDefinition :
722-
# 12| mu0_2(null) = UnmodeledDefinition :
723-
# 12| r0_3(glval<MyClass>) = InitializeThis :
724-
# 10| r0_4(glval<Int32>) = VariableAddress[index] :
725-
# 10| mu0_5(Int32) = InitializeParameter[index] : &:r0_4
726-
# 14| r0_6(glval<String>) = VariableAddress[#return] :
727-
# 14| r0_7(MyClass) = CopyValue : r0_3
728-
# 14| r0_8(glval<String[]>) = FieldAddress[address] : r0_7
729-
# 14| r0_9(String[]) = ElementsAddress : r0_8
730-
# 14| r0_10(glval<Int32>) = VariableAddress[index] :
731-
# 14| r0_11(Int32) = Load : &:r0_10, ~mu0_2
732-
# 14| r0_12(String[]) = PointerAdd[8] : r0_9, r0_11
733-
# 14| r0_13(String) = Load : &:r0_12, ~mu0_2
734-
# 14| mu0_14(String) = Store : &:r0_6, r0_13
735-
# 12| r0_15(glval<String>) = VariableAddress[#return] :
736-
# 12| v0_16(Void) = ReturnValue : &:r0_15, ~mu0_2
737-
# 12| v0_17(Void) = UnmodeledUse : mu*
738-
# 12| v0_18(Void) = ExitFunction :
739-
740-
# 16| System.Void Indexers.MyClass.set_Item(System.Int32,System.String)
741-
# 16| Block 0
742-
# 16| v0_0(Void) = EnterFunction :
743-
# 16| mu0_1(null) = AliasedDefinition :
744-
# 16| mu0_2(null) = UnmodeledDefinition :
745-
# 16| r0_3(glval<MyClass>) = InitializeThis :
746-
# 10| r0_4(glval<Int32>) = VariableAddress[index] :
747-
# 10| mu0_5(Int32) = InitializeParameter[index] : &:r0_4
748-
# 16| r0_6(glval<String>) = VariableAddress[value] :
749-
# 16| mu0_7(String) = InitializeParameter[value] : &:r0_6
750-
# 18| r0_8(glval<String>) = VariableAddress[value] :
751-
# 18| r0_9(String) = Load : &:r0_8, ~mu0_2
752-
# 18| r0_10(MyClass) = CopyValue : r0_3
753-
# 18| r0_11(glval<String[]>) = FieldAddress[address] : r0_10
754-
# 18| r0_12(String[]) = ElementsAddress : r0_11
755-
# 18| r0_13(glval<Int32>) = VariableAddress[index] :
756-
# 18| r0_14(Int32) = Load : &:r0_13, ~mu0_2
757-
# 18| r0_15(String[]) = PointerAdd[8] : r0_12, r0_14
758-
# 18| mu0_16(String) = Store : &:r0_15, r0_9
759-
# 16| v0_17(Void) = ReturnVoid :
760-
# 16| v0_18(Void) = UnmodeledUse : mu*
761-
# 16| v0_19(Void) = ExitFunction :
762-
763-
# 23| System.Void Indexers.Main()
764-
# 23| Block 0
765-
# 23| v0_0(Void) = EnterFunction :
766-
# 23| mu0_1(null) = AliasedDefinition :
767-
# 23| mu0_2(null) = UnmodeledDefinition :
768-
# 25| r0_3(glval<MyClass>) = VariableAddress[inst] :
769-
# 25| r0_4(MyClass) = NewObj :
770-
# 25| r0_5(glval<null>) = FunctionAddress[MyClass] :
771-
# 25| v0_6(Void) = Call : func:r0_5, this:r0_4
772-
# 25| mu0_7(null) = ^CallSideEffect : ~mu0_2
773-
# 25| mu0_8(MyClass) = Store : &:r0_3, r0_4
774-
# 26| r0_9(glval<MyClass>) = VariableAddress[inst] :
775-
# 26| r0_10(MyClass) = Load : &:r0_9, ~mu0_2
776-
# 26| r0_11(glval<null>) = FunctionAddress[set_Item] :
777-
# 26| r0_12(Int32) = Constant[0] :
778-
# 26| r0_13(String) = StringConstant["str1"] :
779-
# 26| v0_14(Void) = Call : func:r0_11, this:r0_10, 0:r0_12, 1:r0_13
780-
# 26| mu0_15(null) = ^CallSideEffect : ~mu0_2
781-
# 27| r0_16(glval<MyClass>) = VariableAddress[inst] :
782-
# 27| r0_17(MyClass) = Load : &:r0_16, ~mu0_2
783-
# 27| r0_18(glval<null>) = FunctionAddress[set_Item] :
784-
# 27| r0_19(Int32) = Constant[1] :
785-
# 27| r0_20(String) = StringConstant["str1"] :
786-
# 27| v0_21(Void) = Call : func:r0_18, this:r0_17, 0:r0_19, 1:r0_20
787-
# 27| mu0_22(null) = ^CallSideEffect : ~mu0_2
788-
# 28| r0_23(glval<MyClass>) = VariableAddress[inst] :
789-
# 28| r0_24(MyClass) = Load : &:r0_23, ~mu0_2
790-
# 28| r0_25(glval<null>) = FunctionAddress[set_Item] :
791-
# 28| r0_26(Int32) = Constant[1] :
792-
# 28| r0_27(glval<MyClass>) = VariableAddress[inst] :
793-
# 28| r0_28(MyClass) = Load : &:r0_27, ~mu0_2
794-
# 28| r0_29(glval<null>) = FunctionAddress[get_Item] :
795-
# 28| r0_30(Int32) = Constant[0] :
796-
# 28| r0_31(String) = Call : func:r0_29, this:r0_28, 0:r0_30
797-
# 28| mu0_32(null) = ^CallSideEffect : ~mu0_2
798-
# 28| v0_33(Void) = Call : func:r0_25, this:r0_24, 0:r0_26, 1:r0_31
799-
# 28| mu0_34(null) = ^CallSideEffect : ~mu0_2
800-
# 23| v0_35(Void) = ReturnVoid :
801-
# 23| v0_36(Void) = UnmodeledUse : mu*
802-
# 23| v0_37(Void) = ExitFunction :
731+
# 12| v0_0(Void) = EnterFunction :
732+
# 12| mu0_1(null) = AliasedDefinition :
733+
# 12| mu0_2(null) = UnmodeledDefinition :
734+
# 12| r0_3(glval<MyClass>) = InitializeThis :
735+
# 6| r0_4(glval<Int32>) = VariableAddress[index] :
736+
# 6| mu0_5(Int32) = InitializeParameter[index] : &:r0_4
737+
# 12| r0_6(glval<String>) = VariableAddress[value] :
738+
# 12| mu0_7(String) = InitializeParameter[value] : &:r0_6
739+
# 14| r0_8(glval<String>) = VariableAddress[value] :
740+
# 14| r0_9(String) = Load : &:r0_8, ~mu0_2
741+
# 14| r0_10(MyClass) = CopyValue : r0_3
742+
# 14| r0_11(glval<String[]>) = FieldAddress[address] : r0_10
743+
# 14| r0_12(String[]) = ElementsAddress : r0_11
744+
# 14| r0_13(glval<Int32>) = VariableAddress[index] :
745+
# 14| r0_14(Int32) = Load : &:r0_13, ~mu0_2
746+
# 14| r0_15(String[]) = PointerAdd[8] : r0_12, r0_14
747+
# 14| mu0_16(String) = Store : &:r0_15, r0_9
748+
# 12| v0_17(Void) = ReturnVoid :
749+
# 12| v0_18(Void) = UnmodeledUse : mu*
750+
# 12| v0_19(Void) = ExitFunction :
751+
752+
# 19| System.Void Indexers.Main()
753+
# 19| Block 0
754+
# 19| v0_0(Void) = EnterFunction :
755+
# 19| mu0_1(null) = AliasedDefinition :
756+
# 19| mu0_2(null) = UnmodeledDefinition :
757+
# 21| r0_3(glval<MyClass>) = VariableAddress[inst] :
758+
# 21| r0_4(MyClass) = NewObj :
759+
# 21| r0_5(glval<null>) = FunctionAddress[MyClass] :
760+
# 21| v0_6(Void) = Call : func:r0_5, this:r0_4
761+
# 21| mu0_7(null) = ^CallSideEffect : ~mu0_2
762+
# 21| mu0_8(MyClass) = Store : &:r0_3, r0_4
763+
# 22| r0_9(glval<MyClass>) = VariableAddress[inst] :
764+
# 22| r0_10(MyClass) = Load : &:r0_9, ~mu0_2
765+
# 22| r0_11(glval<null>) = FunctionAddress[set_Item] :
766+
# 22| r0_12(Int32) = Constant[0] :
767+
# 22| r0_13(String) = StringConstant["str1"] :
768+
# 22| v0_14(Void) = Call : func:r0_11, this:r0_10, 0:r0_12, 1:r0_13
769+
# 22| mu0_15(null) = ^CallSideEffect : ~mu0_2
770+
# 23| r0_16(glval<MyClass>) = VariableAddress[inst] :
771+
# 23| r0_17(MyClass) = Load : &:r0_16, ~mu0_2
772+
# 23| r0_18(glval<null>) = FunctionAddress[set_Item] :
773+
# 23| r0_19(Int32) = Constant[1] :
774+
# 23| r0_20(String) = StringConstant["str1"] :
775+
# 23| v0_21(Void) = Call : func:r0_18, this:r0_17, 0:r0_19, 1:r0_20
776+
# 23| mu0_22(null) = ^CallSideEffect : ~mu0_2
777+
# 24| r0_23(glval<MyClass>) = VariableAddress[inst] :
778+
# 24| r0_24(MyClass) = Load : &:r0_23, ~mu0_2
779+
# 24| r0_25(glval<null>) = FunctionAddress[set_Item] :
780+
# 24| r0_26(Int32) = Constant[1] :
781+
# 24| r0_27(glval<MyClass>) = VariableAddress[inst] :
782+
# 24| r0_28(MyClass) = Load : &:r0_27, ~mu0_2
783+
# 24| r0_29(glval<null>) = FunctionAddress[get_Item] :
784+
# 24| r0_30(Int32) = Constant[0] :
785+
# 24| r0_31(String) = Call : func:r0_29, this:r0_28, 0:r0_30
786+
# 24| mu0_32(null) = ^CallSideEffect : ~mu0_2
787+
# 24| v0_33(Void) = Call : func:r0_25, this:r0_24, 0:r0_26, 1:r0_31
788+
# 24| mu0_34(null) = ^CallSideEffect : ~mu0_2
789+
# 19| v0_35(Void) = ReturnVoid :
790+
# 19| v0_36(Void) = UnmodeledUse : mu*
791+
# 19| v0_37(Void) = ExitFunction :
803792

804793
inheritance_polymorphism.cs:
805794
# 3| System.Int32 A.function()
@@ -1516,12 +1505,11 @@ prop.cs:
15161505
# 12| mu0_5(Int32) = InitializeParameter[value] : &:r0_4
15171506
# 14| r0_6(glval<Int32>) = VariableAddress[value] :
15181507
# 14| r0_7(Int32) = Load : &:r0_6, ~mu0_2
1519-
# 14| r0_8(PropClass) = CopyValue : r0_3
1520-
# 14| r0_9(glval<Int32>) = FieldAddress[prop] : r0_8
1521-
# 14| mu0_10(Int32) = Store : &:r0_9, r0_7
1522-
# 12| v0_11(Void) = ReturnVoid :
1523-
# 12| v0_12(Void) = UnmodeledUse : mu*
1524-
# 12| v0_13(Void) = ExitFunction :
1508+
# 14| r0_8(glval<Int32>) = VariableAddress[prop] :
1509+
# 14| mu0_9(Int32) = Store : &:r0_8, r0_7
1510+
# 12| v0_10(Void) = ReturnVoid :
1511+
# 12| v0_11(Void) = UnmodeledUse : mu*
1512+
# 12| v0_12(Void) = ExitFunction :
15251513

15261514
# 18| System.Int32 PropClass.func()
15271515
# 18| Block 0

0 commit comments

Comments
 (0)