Skip to content

Commit 665d386

Browse files
authored
Merge pull request #2557 from calumgrant/cs/extractor-label-catch
C# extractor: Catch exceptions when generating trap
2 parents 18d4772 + 3c76346 commit 665d386

File tree

4 files changed

+24
-9
lines changed

4 files changed

+24
-9
lines changed

csharp/extractor/Semmle.Extraction.CIL/Factories.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ public T Populate<T>(T e) where T : IExtractedEntity
2828
else
2929
{
3030
e.Label = cx.GetNewLabel();
31-
cx.DefineLabel(e, cx.TrapWriter.Writer);
31+
cx.DefineLabel(e, cx.TrapWriter.Writer, cx.Extractor);
3232
ids.Add(e, e.Label);
3333
cx.PopulateLater(() =>
3434
{
@@ -76,7 +76,7 @@ public PrimitiveType Create(PrimitiveTypeCode code)
7676
{
7777
e = new PrimitiveType(this, code);
7878
e.Label = cx.GetNewLabel();
79-
cx.DefineLabel(e, cx.TrapWriter.Writer);
79+
cx.DefineLabel(e, cx.TrapWriter.Writer, cx.Extractor);
8080
primitiveTypes[(int)code] = e;
8181
}
8282

csharp/extractor/Semmle.Extraction/Context.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -57,19 +57,19 @@ public Entity CreateEntity<Type, Entity>(ICachedEntityFactory<Type, Entity> fact
5757
// A recursion guard against writing to the trap file whilst writing an id to the trap file.
5858
bool WritingLabel = false;
5959

60-
public void DefineLabel(IEntity entity, TextWriter trapFile)
60+
public void DefineLabel(IEntity entity, TextWriter trapFile, IExtractor extractor)
6161
{
6262
if (WritingLabel)
6363
{
6464
// Don't define a label whilst writing a label.
65-
PopulateLater(() => DefineLabel(entity, trapFile));
65+
PopulateLater(() => DefineLabel(entity, trapFile, extractor));
6666
}
6767
else
6868
{
6969
try
7070
{
7171
WritingLabel = true;
72-
entity.DefineLabel(trapFile);
72+
entity.DefineLabel(trapFile, extractor);
7373
}
7474
finally
7575
{
@@ -102,7 +102,7 @@ public Entity CreateEntity2<Type, Entity>(ICachedEntityFactory<Type, Entity> fac
102102
entity.Label = label;
103103
entityLabelCache[entity] = label;
104104

105-
DefineLabel(entity, TrapWriter.Writer);
105+
DefineLabel(entity, TrapWriter.Writer, Extractor);
106106

107107
if (entity.NeedsPopulation)
108108
Populate(init as ISymbol, entity);
@@ -148,7 +148,7 @@ private Entity CreateNonNullEntity<Type, Entity>(ICachedEntityFactory<Type, Enti
148148

149149
objectEntityCache[init] = entity;
150150

151-
DefineLabel(entity, TrapWriter.Writer);
151+
DefineLabel(entity, TrapWriter.Writer, Extractor);
152152
if (entity.NeedsPopulation)
153153
Populate(init as ISymbol, entity);
154154

csharp/extractor/Semmle.Extraction/Entity.cs

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using Microsoft.CodeAnalysis;
2+
using System;
23
using System.IO;
34

45
namespace Semmle.Extraction
@@ -141,11 +142,19 @@ public static Entity CreateEntity<Type, Entity>(this ICachedEntityFactory<Type,
141142
public static Entity CreateEntity2<Type, Entity>(this ICachedEntityFactory<Type, Entity> factory, Context cx, Type init)
142143
where Entity : ICachedEntity => cx.CreateEntity2(factory, init);
143144

144-
public static void DefineLabel(this IEntity entity, TextWriter trapFile)
145+
public static void DefineLabel(this IEntity entity, TextWriter trapFile, IExtractor extractor)
145146
{
146147
trapFile.WriteLabel(entity);
147148
trapFile.Write("=");
148-
entity.WriteQuotedId(trapFile);
149+
try
150+
{
151+
entity.WriteQuotedId(trapFile);
152+
}
153+
catch(Exception ex) // lgtm[cs/catch-of-all-exceptions]
154+
{
155+
trapFile.WriteLine("\"");
156+
extractor.Message(new Message("Unhandled exception generating id", entity.ToString(), null, ex.StackTrace.ToString()));
157+
}
149158
trapFile.WriteLine();
150159
}
151160

csharp/extractor/Semmle.Extraction/TrapExtensions.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ public static void WriteLabel(this TextWriter trapFile, IEntity entity)
1919

2020
public static void WriteSubId(this TextWriter trapFile, IEntity entity)
2121
{
22+
if (entity is null)
23+
{
24+
trapFile.Write("<null>");
25+
return;
26+
}
27+
2228
trapFile.Write('{');
2329
trapFile.WriteLabel(entity);
2430
trapFile.Write('}');

0 commit comments

Comments
 (0)