From 3c763466352a882b0e23009cc1ed7d1750129508 Mon Sep 17 00:00:00 2001 From: Calum Grant Date: Wed, 18 Dec 2019 11:07:38 +0000 Subject: [PATCH] C#: WIP Adding exception handlers. C#: Improve robustness by catching and logging exceptions when generating trap IDs. --- csharp/extractor/Semmle.Extraction.CIL/Factories.cs | 4 ++-- csharp/extractor/Semmle.Extraction/Context.cs | 10 +++++----- csharp/extractor/Semmle.Extraction/Entity.cs | 13 +++++++++++-- .../extractor/Semmle.Extraction/TrapExtensions.cs | 6 ++++++ 4 files changed, 24 insertions(+), 9 deletions(-) diff --git a/csharp/extractor/Semmle.Extraction.CIL/Factories.cs b/csharp/extractor/Semmle.Extraction.CIL/Factories.cs index 4ef1d1787832..f522521a8456 100644 --- a/csharp/extractor/Semmle.Extraction.CIL/Factories.cs +++ b/csharp/extractor/Semmle.Extraction.CIL/Factories.cs @@ -28,7 +28,7 @@ public T Populate(T e) where T : IExtractedEntity else { e.Label = cx.GetNewLabel(); - cx.DefineLabel(e, cx.TrapWriter.Writer); + cx.DefineLabel(e, cx.TrapWriter.Writer, cx.Extractor); ids.Add(e, e.Label); cx.PopulateLater(() => { @@ -76,7 +76,7 @@ public PrimitiveType Create(PrimitiveTypeCode code) { e = new PrimitiveType(this, code); e.Label = cx.GetNewLabel(); - cx.DefineLabel(e, cx.TrapWriter.Writer); + cx.DefineLabel(e, cx.TrapWriter.Writer, cx.Extractor); primitiveTypes[(int)code] = e; } diff --git a/csharp/extractor/Semmle.Extraction/Context.cs b/csharp/extractor/Semmle.Extraction/Context.cs index 3474ab0ebae1..93f993818586 100644 --- a/csharp/extractor/Semmle.Extraction/Context.cs +++ b/csharp/extractor/Semmle.Extraction/Context.cs @@ -57,19 +57,19 @@ public Entity CreateEntity(ICachedEntityFactory fact // A recursion guard against writing to the trap file whilst writing an id to the trap file. bool WritingLabel = false; - public void DefineLabel(IEntity entity, TextWriter trapFile) + public void DefineLabel(IEntity entity, TextWriter trapFile, IExtractor extractor) { if (WritingLabel) { // Don't define a label whilst writing a label. - PopulateLater(() => DefineLabel(entity, trapFile)); + PopulateLater(() => DefineLabel(entity, trapFile, extractor)); } else { try { WritingLabel = true; - entity.DefineLabel(trapFile); + entity.DefineLabel(trapFile, extractor); } finally { @@ -102,7 +102,7 @@ public Entity CreateEntity2(ICachedEntityFactory fac entity.Label = label; entityLabelCache[entity] = label; - DefineLabel(entity, TrapWriter.Writer); + DefineLabel(entity, TrapWriter.Writer, Extractor); if (entity.NeedsPopulation) Populate(init as ISymbol, entity); @@ -148,7 +148,7 @@ private Entity CreateNonNullEntity(ICachedEntityFactory(this ICachedEntityFactory(this ICachedEntityFactory factory, Context cx, Type init) where Entity : ICachedEntity => cx.CreateEntity2(factory, init); - public static void DefineLabel(this IEntity entity, TextWriter trapFile) + public static void DefineLabel(this IEntity entity, TextWriter trapFile, IExtractor extractor) { trapFile.WriteLabel(entity); trapFile.Write("="); - entity.WriteQuotedId(trapFile); + try + { + entity.WriteQuotedId(trapFile); + } + catch(Exception ex) // lgtm[cs/catch-of-all-exceptions] + { + trapFile.WriteLine("\""); + extractor.Message(new Message("Unhandled exception generating id", entity.ToString(), null, ex.StackTrace.ToString())); + } trapFile.WriteLine(); } diff --git a/csharp/extractor/Semmle.Extraction/TrapExtensions.cs b/csharp/extractor/Semmle.Extraction/TrapExtensions.cs index f3e672b13bb8..de40ef0ae821 100644 --- a/csharp/extractor/Semmle.Extraction/TrapExtensions.cs +++ b/csharp/extractor/Semmle.Extraction/TrapExtensions.cs @@ -19,6 +19,12 @@ public static void WriteLabel(this TextWriter trapFile, IEntity entity) public static void WriteSubId(this TextWriter trapFile, IEntity entity) { + if (entity is null) + { + trapFile.Write(""); + return; + } + trapFile.Write('{'); trapFile.WriteLabel(entity); trapFile.Write('}');