mirror of
https://github.com/github/codeql.git
synced 2026-04-25 16:55:19 +02:00
C#: Implement extractor support for unsigned right shift.
This commit is contained in:
@@ -240,7 +240,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
var callType = GetCallType(Context, node);
|
||||
if (callType == CallType.Dynamic)
|
||||
{
|
||||
UserOperator.OperatorSymbol(method.Name, out var operatorName);
|
||||
UserOperator.TryGetOperatorSymbol(method.Name, out var operatorName);
|
||||
trapFile.dynamic_member_name(this, operatorName);
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -71,6 +71,8 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions
|
||||
return ExprKind.ASSIGN_LSHIFT;
|
||||
case SyntaxKind.GreaterThanGreaterThanEqualsToken:
|
||||
return ExprKind.ASSIGN_RSHIFT;
|
||||
case SyntaxKind.GreaterThanGreaterThanGreaterThanEqualsToken:
|
||||
return ExprKind.ASSIGN_URSHIFT;
|
||||
case SyntaxKind.QuestionQuestionEqualsToken:
|
||||
return ExprKind.ASSIGN_COALESCE;
|
||||
default:
|
||||
@@ -141,6 +143,8 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions
|
||||
return ExprKind.REM;
|
||||
case ExprKind.ASSIGN_RSHIFT:
|
||||
return ExprKind.RSHIFT;
|
||||
case ExprKind.ASSIGN_URSHIFT:
|
||||
return ExprKind.URSHIFT;
|
||||
case ExprKind.ASSIGN_SUB:
|
||||
return ExprKind.SUB;
|
||||
case ExprKind.ASSIGN_XOR:
|
||||
|
||||
@@ -50,6 +50,7 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions
|
||||
case SyntaxKind.BarBarToken: return ExprKind.LOG_OR;
|
||||
case SyntaxKind.GreaterThanEqualsToken: return ExprKind.GE;
|
||||
case SyntaxKind.GreaterThanGreaterThanToken: return ExprKind.RSHIFT;
|
||||
case SyntaxKind.GreaterThanGreaterThanGreaterThanToken: return ExprKind.URSHIFT;
|
||||
case SyntaxKind.LessThanLessThanToken: return ExprKind.LSHIFT;
|
||||
case SyntaxKind.CaretToken: return ExprKind.BIT_XOR;
|
||||
case SyntaxKind.QuestionQuestionToken: return ExprKind.NULL_COALESCING;
|
||||
|
||||
@@ -38,6 +38,7 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions
|
||||
case SyntaxKind.IsExpression:
|
||||
case SyntaxKind.AsExpression:
|
||||
case SyntaxKind.RightShiftExpression:
|
||||
case SyntaxKind.UnsignedRightShiftExpression:
|
||||
case SyntaxKind.LeftShiftExpression:
|
||||
case SyntaxKind.ExclusiveOrExpression:
|
||||
case SyntaxKind.CoalesceExpression:
|
||||
@@ -76,6 +77,7 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions
|
||||
case SyntaxKind.ExclusiveOrAssignmentExpression:
|
||||
case SyntaxKind.LeftShiftAssignmentExpression:
|
||||
case SyntaxKind.RightShiftAssignmentExpression:
|
||||
case SyntaxKind.UnsignedRightShiftAssignmentExpression:
|
||||
case SyntaxKind.DivideAssignmentExpression:
|
||||
case SyntaxKind.ModuloAssignmentExpression:
|
||||
case SyntaxKind.CoalesceAssignmentExpression:
|
||||
|
||||
@@ -61,8 +61,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
containingType = Symbol.ContainingType;
|
||||
if (containingType is not null)
|
||||
{
|
||||
var containingNamedType = containingType as INamedTypeSymbol;
|
||||
return containingNamedType is null ||
|
||||
return containingType is not INamedTypeSymbol containingNamedType ||
|
||||
!containingNamedType.GetMembers(Symbol.Name).Contains(Symbol);
|
||||
}
|
||||
|
||||
@@ -83,7 +82,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
/// </summary>
|
||||
/// <param name="methodName">The method name.</param>
|
||||
/// <param name="operatorName">The converted operator name.</param>
|
||||
public static bool OperatorSymbol(string methodName, out string operatorName)
|
||||
public static bool TryGetOperatorSymbol(string methodName, out string operatorName)
|
||||
{
|
||||
var success = true;
|
||||
switch (methodName)
|
||||
@@ -147,6 +146,9 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
case "op_RightShift":
|
||||
operatorName = ">>";
|
||||
break;
|
||||
case "op_UnsignedRightShift":
|
||||
operatorName = ">>>";
|
||||
break;
|
||||
case "op_LeftShift":
|
||||
operatorName = "<<";
|
||||
break;
|
||||
@@ -166,7 +168,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
var match = Regex.Match(methodName, "^op_Checked(.*)$");
|
||||
if (match.Success)
|
||||
{
|
||||
OperatorSymbol("op_" + match.Groups[1], out var uncheckedName);
|
||||
TryGetOperatorSymbol("op_" + match.Groups[1], out var uncheckedName);
|
||||
operatorName = "checked " + uncheckedName;
|
||||
break;
|
||||
}
|
||||
@@ -190,7 +192,7 @@ namespace Semmle.Extraction.CSharp.Entities
|
||||
return OperatorSymbol(cx, method.ExplicitInterfaceImplementations.First());
|
||||
|
||||
var methodName = method.Name;
|
||||
if (!OperatorSymbol(methodName, out var result))
|
||||
if (!TryGetOperatorSymbol(methodName, out var result))
|
||||
cx.ModelError(method, $"Unhandled operator name in OperatorSymbol(): '{methodName}'");
|
||||
return result;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user