From f209eed91c2ca4dd4a28466db12ddb37c65202ea Mon Sep 17 00:00:00 2001 From: Michael Nebel Date: Mon, 27 Feb 2023 14:00:56 +0100 Subject: [PATCH] C#: Extractor- and library support for explicit interface implementations for operators. --- .../extractor/Semmle.Extraction.CSharp/Entities/Conversion.cs | 2 ++ csharp/extractor/Semmle.Extraction.CSharp/Entities/Method.cs | 4 +++- .../Semmle.Extraction.CSharp/Entities/UserOperator.cs | 3 +++ csharp/ql/lib/semmle/code/csharp/Callable.qll | 2 +- 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Conversion.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Conversion.cs index c3d59f94de7..c081f43e24f 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Conversion.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Conversion.cs @@ -10,6 +10,8 @@ namespace Semmle.Extraction.CSharp.Entities private Conversion(Context cx, IMethodSymbol init) : base(cx, init) { } + protected override MethodKind ExplicitlyImplementsKind => MethodKind.Conversion; + public static new Conversion Create(Context cx, IMethodSymbol symbol) => ConversionFactory.Instance.CreateEntityFromSymbol(cx, symbol); diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Method.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Method.cs index cd765159769..22bf9f69670 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/Method.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/Method.cs @@ -83,10 +83,12 @@ namespace Semmle.Extraction.CSharp.Entities } } + protected virtual MethodKind ExplicitlyImplementsKind => MethodKind.Ordinary; + public void Overrides(TextWriter trapFile) { foreach (var explicitInterface in Symbol.ExplicitInterfaceImplementations - .Where(sym => sym.MethodKind == MethodKind.Ordinary) + .Where(sym => sym.MethodKind == ExplicitlyImplementsKind) .Select(impl => Type.Create(Context, impl.ContainingType))) { trapFile.explicitly_implements(this, explicitInterface.TypeRef); diff --git a/csharp/extractor/Semmle.Extraction.CSharp/Entities/UserOperator.cs b/csharp/extractor/Semmle.Extraction.CSharp/Entities/UserOperator.cs index f478d991919..c6e03f86a29 100644 --- a/csharp/extractor/Semmle.Extraction.CSharp/Entities/UserOperator.cs +++ b/csharp/extractor/Semmle.Extraction.CSharp/Entities/UserOperator.cs @@ -11,6 +11,8 @@ namespace Semmle.Extraction.CSharp.Entities protected UserOperator(Context cx, IMethodSymbol init) : base(cx, init) { } + protected override MethodKind ExplicitlyImplementsKind => MethodKind.UserDefinedOperator; + public override void Populate(TextWriter trapFile) { PopulateMethod(trapFile); @@ -37,6 +39,7 @@ namespace Semmle.Extraction.CSharp.Entities } ContainingType.PopulateGenerics(); + Overrides(trapFile); } public override bool NeedsPopulation => Context.Defines(Symbol) || IsImplicitOperator(out _); diff --git a/csharp/ql/lib/semmle/code/csharp/Callable.qll b/csharp/ql/lib/semmle/code/csharp/Callable.qll index 82ffbfa6a06..00091f66ddc 100644 --- a/csharp/ql/lib/semmle/code/csharp/Callable.qll +++ b/csharp/ql/lib/semmle/code/csharp/Callable.qll @@ -434,7 +434,7 @@ class Destructor extends DotNet::Destructor, Callable, Member, Attributable, @de * Either a unary operator (`UnaryOperator`), a binary operator * (`BinaryOperator`), or a conversion operator (`ConversionOperator`). */ -class Operator extends Callable, Member, Attributable, @operator { +class Operator extends Callable, Member, Attributable, Overridable, @operator { /** * DEPRECATED: use `getFunctionName()` instead. *