C#: Escape IDs in TRAP label definitions

This commit is contained in:
Tom Hvitved
2021-05-06 10:45:37 +02:00
parent 059a5f35fa
commit fab8400ecd
72 changed files with 486 additions and 169 deletions

View File

@@ -69,7 +69,7 @@ namespace Semmle.Extraction.CSharp.Entities
return AssemblyConstructorFactory.Instance.CreateEntity(cx, outputAssemblyCacheKey, null);
}
public override void WriteId(System.IO.TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
trapFile.Write(assembly.ToString());
if (!(assemblyPath is null))

View File

@@ -20,7 +20,7 @@ namespace Semmle.Extraction.CSharp.Entities
this.entity = entity;
}
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
if (ReportingLocation?.IsInSource == true)
{
@@ -33,7 +33,7 @@ namespace Semmle.Extraction.CSharp.Entities
}
}
public override void WriteQuotedId(TextWriter trapFile)
public sealed override void WriteQuotedId(EscapingTextWriter trapFile)
{
if (ReportingLocation?.IsInSource == true)
{

View File

@@ -21,7 +21,7 @@ namespace Semmle.Extraction.CSharp.Entities
public override bool NeedsPopulation => true;
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
trapFile.WriteSubId(Context.CreateLocation(Symbol.Location));
trapFile.Write(";commentblock");

View File

@@ -32,7 +32,7 @@ namespace Semmle.Extraction.CSharp.Entities
public override bool NeedsPopulation => true;
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
trapFile.WriteSubId(Context.CreateLocation(Location));
trapFile.Write(";commentline");

View File

@@ -81,7 +81,7 @@ namespace Semmle.Extraction.CSharp.Entities
trapFile.compilation_finished(this, (float)p.Total.Cpu.TotalSeconds, (float)p.Total.Elapsed.TotalSeconds);
}
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
trapFile.Write(hashCode);
trapFile.Write(";compilation");

View File

@@ -144,7 +144,7 @@ namespace Semmle.Extraction.CSharp.Entities
}
}
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
if (Symbol.IsStatic)
trapFile.Write("static");

View File

@@ -10,7 +10,7 @@ namespace Semmle.Extraction.CSharp.Entities
private Event(Context cx, IEventSymbol init)
: base(cx, init) { }
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
trapFile.WriteSubId(ContainingType!);
trapFile.Write('.');

View File

@@ -118,7 +118,7 @@ namespace Semmle.Extraction.CSharp.Entities
private readonly Lazy<Type> type;
public Type Type => type.Value;
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
trapFile.WriteSubId(Type);
trapFile.Write(" ");

View File

@@ -73,13 +73,13 @@ namespace Semmle.Extraction.CSharp.Entities
public static new Indexer Create(Context cx, IPropertySymbol prop) => IndexerFactory.Instance.CreateEntityFromSymbol(cx, prop);
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
trapFile.WriteSubId(ContainingType!);
trapFile.Write('.');
trapFile.Write(Symbol.MetadataName);
trapFile.Write('(');
trapFile.BuildList(",", Symbol.Parameters, (p, tb0) => tb0.WriteSubId(Type.Create(Context, p.Type)));
trapFile.BuildList(",", Symbol.Parameters, p => trapFile.WriteSubId(Type.Create(Context, p.Type)));
trapFile.Write(");indexer");
}

View File

@@ -10,12 +10,12 @@ namespace Semmle.Extraction.CSharp.Entities
{
}
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
throw new InvalidOperationException();
}
public override void WriteQuotedId(TextWriter trapFile)
public sealed override void WriteQuotedId(EscapingTextWriter trapFile)
{
trapFile.Write('*');
}

View File

@@ -8,12 +8,12 @@ namespace Semmle.Extraction.CSharp.Entities
{
private LocalVariable(Context cx, ISymbol init) : base(cx, init) { }
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
throw new InvalidOperationException();
}
public override void WriteQuotedId(TextWriter trapFile)
public sealed override void WriteQuotedId(EscapingTextWriter trapFile)
{
trapFile.Write('*');
}

View File

@@ -127,7 +127,7 @@ namespace Semmle.Extraction.CSharp.Entities
/// <summary>
/// Factored out to share logic between `Method` and `UserOperator`.
/// </summary>
private static void BuildMethodId(Method m, TextWriter trapFile)
private static void BuildMethodId(Method m, EscapingTextWriter trapFile)
{
m.Symbol.ReturnType.BuildOrWriteId(m.Context, trapFile, m.Symbol);
trapFile.Write(" ");
@@ -153,7 +153,7 @@ namespace Semmle.Extraction.CSharp.Entities
// Type arguments with different nullability can result in
// a constructed method with different nullability of its parameters and return type,
// so we need to create a distinct database entity for it.
trapFile.BuildList(",", m.Symbol.GetAnnotatedTypeArguments(), (ta, tb0) => { ta.Symbol.BuildOrWriteId(m.Context, tb0, m.Symbol); trapFile.Write((int)ta.Nullability); });
trapFile.BuildList(",", m.Symbol.GetAnnotatedTypeArguments(), ta => { ta.Symbol.BuildOrWriteId(m.Context, trapFile, m.Symbol); trapFile.Write((int)ta.Nullability); });
trapFile.Write('>');
}
}
@@ -182,12 +182,12 @@ namespace Semmle.Extraction.CSharp.Entities
}
}
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
BuildMethodId(this, trapFile);
}
protected static void AddParametersToId(Context cx, TextWriter trapFile, IMethodSymbol method)
protected static void AddParametersToId(Context cx, EscapingTextWriter trapFile, IMethodSymbol method)
{
trapFile.Write('(');
var index = 0;
@@ -222,7 +222,7 @@ namespace Semmle.Extraction.CSharp.Entities
trapFile.Write(')');
}
public static void AddExplicitInterfaceQualifierToId(Context cx, System.IO.TextWriter trapFile, IEnumerable<ISymbol> explicitInterfaceImplementations)
public static void AddExplicitInterfaceQualifierToId(Context cx, EscapingTextWriter trapFile, IEnumerable<ISymbol> explicitInterfaceImplementations)
{
if (explicitInterfaceImplementations.Any())
trapFile.AppendList(",", explicitInterfaceImplementations.Select(impl => cx.CreateEntity(impl.ContainingType)));

View File

@@ -10,7 +10,7 @@ namespace Semmle.Extraction.CSharp.Entities
public override Location? ReportingLocation => null;
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
trapFile.Write(Symbol);
trapFile.Write(";modifier");

View File

@@ -23,7 +23,7 @@ namespace Semmle.Extraction.CSharp.Entities
public override bool NeedsPopulation => true;
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
if (!Symbol.IsGlobalNamespace)
{

View File

@@ -20,7 +20,7 @@ namespace Semmle.Extraction.CSharp.Entities
this.parent = parent;
}
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
trapFile.WriteSubId(Context.CreateLocation(ReportingLocation));
trapFile.Write(";namespacedeclaration");

View File

@@ -41,7 +41,7 @@ namespace Semmle.Extraction.CSharp.Entities
get;
}
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
trapFile.Write("loc,");
trapFile.WriteSubId(FileEntity);

View File

@@ -74,7 +74,7 @@ namespace Semmle.Extraction.CSharp.Entities
public static Parameter Create(Context cx, IParameterSymbol param) =>
ParameterFactory.Instance.CreateEntity(cx, param, (param, null, null));
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
if (Parent is null)
Parent = Method.Create(Context, Symbol.ContainingSymbol as IMethodSymbol);
@@ -209,7 +209,7 @@ namespace Semmle.Extraction.CSharp.Entities
public override bool NeedsPopulation => true;
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
trapFile.Write("__arglist;type");
}

View File

@@ -21,7 +21,7 @@ namespace Semmle.Extraction.CSharp.Entities
private Type Type => type.Value;
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
trapFile.WriteSubId(Type);
trapFile.Write(" ");

View File

@@ -30,7 +30,7 @@ namespace Semmle.Extraction.CSharp.Entities
PopulateType(trapFile);
}
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
trapFile.WriteSubId(ElementType);
Symbol.BuildArraySuffix(trapFile);

View File

@@ -22,7 +22,7 @@ namespace Semmle.Extraction.CSharp.Entities
trapFile.parent_namespace(this, Namespace.Create(Context, Context.Compilation.GlobalNamespace));
}
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
trapFile.Write("dynamic;type");
}

View File

@@ -11,7 +11,7 @@ namespace Semmle.Extraction.CSharp.Entities
{
}
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
Symbol.BuildTypeId(Context, trapFile, Symbol);
trapFile.Write(";functionpointertype");

View File

@@ -128,7 +128,7 @@ namespace Semmle.Extraction.CSharp.Entities
private bool IsAnonymousType() => Symbol.IsAnonymousType || Symbol.Name.Contains("__AnonymousType");
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
if (IsAnonymousType())
{
@@ -141,7 +141,7 @@ namespace Semmle.Extraction.CSharp.Entities
}
}
public override void WriteQuotedId(TextWriter trapFile)
public sealed override void WriteQuotedId(EscapingTextWriter trapFile)
{
if (IsAnonymousType())
trapFile.Write('*');
@@ -195,7 +195,7 @@ namespace Semmle.Extraction.CSharp.Entities
public override bool NeedsPopulation => true;
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
trapFile.WriteSubId(referencedType);
trapFile.Write(";typeRef");

View File

@@ -13,7 +13,7 @@ namespace Semmle.Extraction.CSharp.Entities
trapFile.types(this, Kinds.TypeKind.NULL, "null");
}
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
trapFile.Write("<null>;type");
}

View File

@@ -79,7 +79,7 @@ namespace Semmle.Extraction.CSharp.Entities
return h;
}
public void WriteId(TextWriter trapFile)
public void WriteId(EscapingTextWriter trapFile)
{
trapFile.Write(Annotation);
trapFile.Write('(');
@@ -90,7 +90,7 @@ namespace Semmle.Extraction.CSharp.Entities
public override string ToString()
{
using var w = new StringWriter();
using var w = new EscapingTextWriter();
WriteId(w);
return w.ToString();
}
@@ -120,7 +120,7 @@ namespace Semmle.Extraction.CSharp.Entities
}
}
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
Symbol.WriteId(trapFile);
}

View File

@@ -11,7 +11,7 @@ namespace Semmle.Extraction.CSharp.Entities
PointedAtType = Create(cx, Symbol.PointedAtType);
}
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
trapFile.WriteSubId(PointedAtType);
trapFile.Write("*;type");

View File

@@ -30,7 +30,7 @@ namespace Semmle.Extraction.CSharp.Entities
// All tuple types are "local types"
public override bool NeedsPopulation => true;
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
Symbol.BuildTypeId(Context, trapFile, Symbol);
trapFile.Write(";tuple");

View File

@@ -103,7 +103,7 @@ namespace Semmle.Extraction.CSharp.Entities
}
}
public override void WriteId(TextWriter trapFile)
public override void WriteId(EscapingTextWriter trapFile)
{
string kind;
IEntity containingEntity;

View File

@@ -160,10 +160,10 @@ namespace Semmle.Extraction.CSharp
/// <param name="trapFile">The trap builder used to store the result.</param>
/// <param name="symbolBeingDefined">The outer symbol being defined (to avoid recursive ids).</param>
/// <param name="constructUnderlyingTupleType">Whether to build a type ID for the underlying `System.ValueTuple` struct in the case of tuple types.</param>
public static void BuildTypeId(this ITypeSymbol type, Context cx, TextWriter trapFile, ISymbol symbolBeingDefined, bool constructUnderlyingTupleType = false) =>
public static void BuildTypeId(this ITypeSymbol type, Context cx, EscapingTextWriter trapFile, ISymbol symbolBeingDefined, bool constructUnderlyingTupleType = false) =>
type.BuildTypeId(cx, trapFile, symbolBeingDefined, true, constructUnderlyingTupleType);
private static void BuildTypeId(this ITypeSymbol type, Context cx, TextWriter trapFile, ISymbol symbolBeingDefined, bool addBaseClass, bool constructUnderlyingTupleType)
private static void BuildTypeId(this ITypeSymbol type, Context cx, EscapingTextWriter trapFile, ISymbol symbolBeingDefined, bool addBaseClass, bool constructUnderlyingTupleType)
{
using (cx.StackGuard)
{
@@ -207,7 +207,7 @@ namespace Semmle.Extraction.CSharp
}
}
private static void BuildOrWriteId(this ISymbol? symbol, Context cx, TextWriter trapFile, ISymbol symbolBeingDefined, bool addBaseClass, bool constructUnderlyingTupleType = false)
private static void BuildOrWriteId(this ISymbol? symbol, Context cx, EscapingTextWriter trapFile, ISymbol symbolBeingDefined, bool addBaseClass, bool constructUnderlyingTupleType = false)
{
if (symbol is null)
{
@@ -249,7 +249,7 @@ namespace Semmle.Extraction.CSharp
/// it will generate an appropriate ID that encodes the signature of
/// <paramref name="symbol" />.
/// </summary>
public static void BuildOrWriteId(this ISymbol? symbol, Context cx, TextWriter trapFile, ISymbol symbolBeingDefined) =>
public static void BuildOrWriteId(this ISymbol? symbol, Context cx, EscapingTextWriter trapFile, ISymbol symbolBeingDefined) =>
symbol.BuildOrWriteId(cx, trapFile, symbolBeingDefined, true);
/// <summary>
@@ -264,7 +264,7 @@ namespace Semmle.Extraction.CSharp
trapFile.Write(']');
}
private static void BuildAssembly(IAssemblySymbol asm, TextWriter trapFile, bool extraPrecise = false)
private static void BuildAssembly(IAssemblySymbol asm, EscapingTextWriter trapFile, bool extraPrecise = false)
{
var assembly = asm.Identity;
trapFile.Write(assembly.Name);
@@ -282,22 +282,22 @@ namespace Semmle.Extraction.CSharp
trapFile.Write("::");
}
private static void BuildFunctionPointerTypeId(this IFunctionPointerTypeSymbol funptr, Context cx, TextWriter trapFile, ISymbol symbolBeingDefined)
private static void BuildFunctionPointerTypeId(this IFunctionPointerTypeSymbol funptr, Context cx, EscapingTextWriter trapFile, ISymbol symbolBeingDefined)
{
BuildFunctionPointerSignature(funptr, trapFile, (s, tw) => s.BuildOrWriteId(cx, tw, symbolBeingDefined));
BuildFunctionPointerSignature(funptr, trapFile, s => s.BuildOrWriteId(cx, trapFile, symbolBeingDefined));
}
private static void BuildNamedTypeId(this INamedTypeSymbol named, Context cx, TextWriter trapFile, ISymbol symbolBeingDefined, bool addBaseClass, bool constructUnderlyingTupleType)
private static void BuildNamedTypeId(this INamedTypeSymbol named, Context cx, EscapingTextWriter trapFile, ISymbol symbolBeingDefined, bool addBaseClass, bool constructUnderlyingTupleType)
{
if (!constructUnderlyingTupleType && named.IsTupleType)
{
trapFile.Write('(');
trapFile.BuildList(",", named.TupleElements,
(f, tb0) =>
f =>
{
trapFile.Write((f.CorrespondingTupleField ?? f).Name);
trapFile.Write(":");
f.Type.BuildOrWriteId(cx, tb0, symbolBeingDefined, addBaseClass);
f.Type.BuildOrWriteId(cx, trapFile, symbolBeingDefined, addBaseClass);
}
);
trapFile.Write(")");
@@ -340,7 +340,7 @@ namespace Semmle.Extraction.CSharp
// a constructed type with different nullability of its members and methods,
// so we need to create a distinct database entity for it.
trapFile.BuildList(",", named.GetAnnotatedTypeArguments(),
(ta, tb0) => ta.Symbol.BuildOrWriteId(cx, tb0, symbolBeingDefined, addBaseClass)
ta => ta.Symbol.BuildOrWriteId(cx, trapFile, symbolBeingDefined, addBaseClass)
);
trapFile.Write('>');
}
@@ -364,7 +364,7 @@ namespace Semmle.Extraction.CSharp
}
}
private static void BuildNamespace(this INamespaceSymbol ns, Context cx, TextWriter trapFile)
private static void BuildNamespace(this INamespaceSymbol ns, Context cx, EscapingTextWriter trapFile)
{
trapFile.WriteSubId(Namespace.Create(cx, ns));
trapFile.Write('.');
@@ -377,7 +377,7 @@ namespace Semmle.Extraction.CSharp
trapFile.Write("<>__AnonType");
trapFile.Write(hackTypeNumber);
trapFile.Write('<');
trapFile.BuildList(",", type.GetMembers().OfType<IPropertySymbol>(), (prop, tb0) => BuildDisplayName(prop.Type, cx, tb0));
trapFile.BuildList(",", type.GetMembers().OfType<IPropertySymbol>(), prop => BuildDisplayName(prop.Type, cx, trapFile));
trapFile.Write('>');
}
@@ -433,7 +433,7 @@ namespace Semmle.Extraction.CSharp
}
public static void BuildFunctionPointerSignature(IFunctionPointerTypeSymbol funptr, TextWriter trapFile,
Action<ITypeSymbol, TextWriter> buildNested)
Action<ITypeSymbol> buildNested)
{
trapFile.Write("delegate* ");
trapFile.Write(funptr.Signature.CallingConvention.ToString().ToLowerInvariant());
@@ -447,19 +447,19 @@ namespace Semmle.Extraction.CSharp
trapFile.Write('<');
trapFile.BuildList(",", funptr.Signature.Parameters,
(p, trap) =>
p =>
{
buildNested(p.Type, trap);
buildNested(p.Type);
switch (p.RefKind)
{
case RefKind.Out:
trap.Write(" out");
trapFile.Write(" out");
break;
case RefKind.In:
trap.Write(" in");
trapFile.Write(" in");
break;
case RefKind.Ref:
trap.Write(" ref");
trapFile.Write(" ref");
break;
}
});
@@ -469,7 +469,7 @@ namespace Semmle.Extraction.CSharp
trapFile.Write(",");
}
buildNested(funptr.Signature.ReturnType, trapFile);
buildNested(funptr.Signature.ReturnType);
if (funptr.Signature.ReturnsByRef)
trapFile.Write(" ref");
@@ -481,7 +481,7 @@ namespace Semmle.Extraction.CSharp
private static void BuildFunctionPointerTypeDisplayName(this IFunctionPointerTypeSymbol funptr, Context cx, TextWriter trapFile)
{
BuildFunctionPointerSignature(funptr, trapFile, (s, tw) => s.BuildDisplayName(cx, tw));
BuildFunctionPointerSignature(funptr, trapFile, s => s.BuildDisplayName(cx, trapFile));
}
private static void BuildNamedTypeDisplayName(this INamedTypeSymbol namedType, Context cx, TextWriter trapFile, bool constructUnderlyingTupleType)
@@ -492,7 +492,7 @@ namespace Semmle.Extraction.CSharp
trapFile.BuildList(
",",
namedType.TupleElements.Select(f => f.Type),
(t, tb0) => t.BuildDisplayName(cx, tb0));
t => t.BuildDisplayName(cx, trapFile));
trapFile.Write(")");
return;
}
@@ -512,11 +512,11 @@ namespace Semmle.Extraction.CSharp
trapFile.BuildList(
",",
namedType.TypeArguments,
(p, tb0) =>
p =>
{
if (IsReallyBound(namedType))
{
p.BuildDisplayName(cx, tb0);
p.BuildDisplayName(cx, trapFile);
}
});
trapFile.Write('>');