Skip to content

Commit 2151310

Browse files
author
AndreiDiaconu1
committed
Compiler generated constructor
Fixed a problem when the translating the compiler generated constructors that caused some sanity errors (since they have no body, when translating the constructor block fragmentation happened). Fixed this by skipping the translation of the body, if it does not exist (when translating a function).
1 parent 18b28b1 commit 2151310

File tree

3 files changed

+94
-103
lines changed

3 files changed

+94
-103
lines changed

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/raw_ir.expected

Lines changed: 84 additions & 95 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()

0 commit comments

Comments
 (0)