C#: Add case for open ended range.

This commit is contained in:
Michael Nebel
2026-06-03 13:54:15 +02:00
parent 2f473572fa
commit 02c37321d0

View File

@@ -47,7 +47,7 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions
return new Expression(info);
}
private void MakeLengthPropertyCall(TextWriter trapFile, IPropertySymbol lengthPropertySymbol, IExpressionParentEntity parent, int child)
private Expression MakeLengthPropertyCall(TextWriter trapFile, IPropertySymbol lengthPropertySymbol, IExpressionParentEntity parent, int child)
{
var lengthInfo = new ExpressionInfo(
Context,
@@ -63,6 +63,7 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions
var lengthProp = Property.Create(Context, lengthPropertySymbol);
trapFile.expr_access(length, lengthProp);
return length;
}
private Expression CreateFromIndexExpression(TextWriter trapFile, IPropertySymbol lengthPropertySymbol, IExpressionParentEntity parent, int child, PrefixUnaryExpressionSyntax index)
@@ -137,6 +138,7 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions
// 1. s[a..b] -> s.Slice(a, b - a)
// 2. s[..b] -> s.Slice(0, b)
// 3. s[a..] -> s.Slice(a, s.Length - a)
// 4. s[..] -> s.Slice(0, s.Length)
// Furthermore, note that uses of index expressions (e.g. s[2..^1]) within the range
// get translated to length - index, so we need to handle this as well.
switch (range.LeftOperand, range.RightOperand)
@@ -168,6 +170,13 @@ namespace Semmle.Extraction.CSharp.Entities.Expressions
SetExprArgument(trapFile, left, right);
break;
}
case (null, null):
{
var left = Literal.CreateGenerated(Context, this, 0, Context.Compilation.GetSpecialType(SpecialType.System_Int32), 0, Location);
var right = MakeLengthPropertyCall(trapFile, lengthPropertySymbol, this, 1);
SetExprArgument(trapFile, left, right);
break;
}
}
trapFile.expr_call(this, Method.Create(Context, slice));