codeql icon indicating copy to clipboard operation
codeql copied to clipboard

Getting derived class type in C#

Open chanel-y opened this issue 3 years ago • 1 comments

For the following code snippet:

class A{
    public virtual void someFunc(){}
}
class B : A{
    public override void someFunc(){}
}
public A createB(){
    return new B(); 
}
main(){
    var b = createB(); 
    b.someFunc();
}

Is there a good way to check that b is actually type B and not A? And that b.someFunc() is calling the B implementation?

I've tried getType() on b and it's giving me A, which makes sense since createB() does explicitly return an A type. Current approach is going into the createB() method and having my logic iterate through there but it's becoming a lot more complex than I think it needs to be.

Searched through past issues and seems like my question is similar to #9784 . The suggestion was to use dataflow but wanted to check if there might be an easier way in C#.

Any thoughts/ideas?

Thanks!

chanel-y avatar Sep 07 '22 19:09 chanel-y

Hi

That's a great question. There is currently no built-in functionality for this, but I know that the Java library has something for this (TypeFlow.qll), which we will probably adopt in C# at some point. Eventually that should result in Call::getARuntimeTarget to only return B.someFunc for the call in main, but for now I believe it will also return A.someFunc.

hvitved avatar Sep 08 '22 07:09 hvitved