public void SarifConsolidator_Region() { SarifConsolidator consolidator = new SarifConsolidator(new Run()); // If line information, offsets removed. If EndLine == StartLine, EndLine removed Region r = new Region(SampleRegion); Region rExpected = new Region(SampleRegionTrimmed); consolidator.Trim(r); Assert.True(Region.ValueComparer.Equals(SampleRegionTrimmed, r)); consolidator.Trim(r); Assert.True(Region.ValueComparer.Equals(rExpected, r)); // Don't remove EndLine when EndLine != StartLine r.EndLine = 101; rExpected.EndLine = 101; consolidator.Trim(r); Assert.Equal(101, r.EndLine); Assert.True(Region.ValueComparer.Equals(rExpected, r)); // Don't remove offsets when no line numbers r = new Region() { ByteOffset = 1024, ByteLength = 10 }; rExpected = new Region(r); consolidator.Trim(r); Assert.Equal(1024, r.ByteOffset); Assert.True(Region.ValueComparer.Equals(rExpected, r)); Region everythingRegion = new Region() { StartLine = 10, StartColumn = 12, EndLine = 13, EndColumn = 15, ByteOffset = 100, ByteLength = 10, CharOffset = 100, CharLength = 10 }; // Trim to ByteOffset only r = new Region(everythingRegion); consolidator.RegionComponentsToKeep = RegionComponents.ByteOffsetAndLength; consolidator.Trim(r); Assert.Equal(0, r.StartLine); Assert.Equal(-1, r.CharOffset); Assert.Equal(100, r.ByteOffset); // Trim to CharOffset only r = new Region(everythingRegion); consolidator.RegionComponentsToKeep = RegionComponents.CharOffsetAndLength; consolidator.Trim(r); Assert.Equal(0, r.StartLine); Assert.Equal(-1, r.ByteOffset); Assert.Equal(100, r.CharOffset); // Keep everything r = new Region(everythingRegion); consolidator.RegionComponentsToKeep = RegionComponents.Full; consolidator.Trim(r); Assert.True(Region.ValueComparer.Equals(r, everythingRegion)); }
private static void Main(string[] args) { if (args.Length < 1) { Console.WriteLine(@"Usage: SarifTrim [inputFilePath] [outputFilePath?] [removeParts?] removeParts: Semicolon-separated sections to remove. Options: UriBaseIds;CodeFlows;RelatedLocations;Graphs;GraphTraversals;Stacks;WebRequests;WebResponses"); return; } string inputFilePath = args[0]; string outputFilePath = (args.Length > 1 ? args[1] : Path.ChangeExtension(inputFilePath, $"trimmed{Path.GetExtension(inputFilePath)}")); // Split on comma, remove whitespace, and put in case-insensitive HashSet HashSet <string> removeParts = new HashSet <string>((args.Length > 2 ? args[2] : "").Split(';').Select(entry => entry.Trim()), StringComparer.OrdinalIgnoreCase); SarifLog log = null; using (new ConsoleWatch($"Loading \"{inputFilePath}\"...")) { log = SarifLog.LoadDeferred(inputFilePath); } using (new ConsoleWatch($"Trimming \"{inputFilePath}\" into \"{outputFilePath}\"...")) { Run run = log.Runs[0]; SarifConsolidator consolidator = new SarifConsolidator(run); consolidator.MessageLengthLimitChars = 1024; consolidator.RemoveUriBaseIds = (removeParts.Contains("UriBaseIds")); consolidator.RemoveCodeFlows = (removeParts.Contains("CodeFlows")); consolidator.RemoveRelatedLocations = (removeParts.Contains("RelatedLocations")); consolidator.RemoveGraphs = (removeParts.Contains("Graphs")); consolidator.RemoveStacks = (removeParts.Contains("Stacks")); consolidator.RemoveWebRequests = (removeParts.Contains("WebRequests")); consolidator.RemoveWebResponses = (removeParts.Contains("WebResponses")); // Consolidate the SarifLog per settings using (SarifLogger logger = new SarifLogger(outputFilePath, LogFilePersistenceOptions.OverwriteExistingOutputFile, tool: run.Tool, run: run)) { foreach (Result result in run.Results) { consolidator.Trim(result); logger.Log(result.GetRule(run), result); } } if (consolidator.UniqueThreadFlowLocations < consolidator.TotalThreadFlowLocations) { Console.WriteLine($"Consolidated {consolidator.TotalThreadFlowLocations:n0} ThreadFlowLocations into {consolidator.UniqueThreadFlowLocations:n0} unique ones."); } if (consolidator.UniqueLocations < consolidator.TotalLocations) { Console.WriteLine($"Consolidated {consolidator.TotalLocations:n0} Locations into {consolidator.UniqueLocations:n0} unique per-Result Locations."); } } }
public void SarifConsolidator_Location() { SarifConsolidator consolidator = new SarifConsolidator(new Run()); // Id removed, inner components trimmed Location loc = new Location(SampleLocation); Location locExpected = new Location(SampleLocationTrimmed); consolidator.Trim(loc); Assert.True(Location.ValueComparer.Equals(locExpected, loc)); }
public void SarifConsolidator_Nulls() { SarifConsolidator consolidator = new SarifConsolidator(new Run()); // Null objects handled gracefully (so callers can pass properties which may or may not be set) consolidator.Trim((Region)null); consolidator.Trim((ArtifactLocation)null); consolidator.Trim((PhysicalLocation)null); consolidator.Trim((LogicalLocation)null); consolidator.Trim((IList <LogicalLocation>)null); consolidator.Trim((Location)null); consolidator.Trim((IList <Location>)null); consolidator.Trim((Result)null); }
public void SarifConsolidator_LogicalLocations() { SarifConsolidator consolidator = new SarifConsolidator(new Run()); // Duplicate locations removed, inner Locations trimmed List <LogicalLocation> locations = new List <LogicalLocation>() { new LogicalLocation(SampleLogicalLocation), new LogicalLocation(SampleLogicalLocation) }; IList <LogicalLocation> result = consolidator.Trim(locations); Assert.Equal(1, result.Count); Assert.Null(result[0].Name); }
public void SarifConsolidator_Locations() { SarifConsolidator consolidator = new SarifConsolidator(new Run()); // Duplicate locations removed, inner Locations trimmed List <Location> locations = new List <Location>() { new Location(SampleLocation), new Location(SampleLocation) }; IList <Location> result = consolidator.Trim(locations); Assert.Equal(1, result.Count); Assert.Null(result[0].PhysicalLocation.ArtifactLocation.UriBaseId); Assert.Equal(-1, result[0].PhysicalLocation.Region.CharOffset); }
static void Consolidate(string inputPath, string outputPath) { Console.WriteLine($"Running Sarif Consolidator on '{inputPath}'..."); Stopwatch w = Stopwatch.StartNew(); SarifLog log = SarifLog.LoadDeferred(inputPath); SarifConsolidator consolidator = new SarifConsolidator(log.Runs[0]); foreach (Result result in log.Runs[0].Results) { consolidator.Trim(result); } log.Save(outputPath); Console.WriteLine($"Done in {w.Elapsed.TotalSeconds:n1}s; {ToSizeString(new FileInfo(inputPath).Length)} => {ToSizeString(new FileInfo(outputPath).Length)}"); }
public void SarifConsolidator_ThreadFlow() { ThreadFlowLocation tfl = new ThreadFlowLocation() { ExecutionOrder = 3, Module = "Loader" }; // Pre-add a ThreadFlowLocation to the Run, to ensure it is considered for re-use Run run = new Run() { ThreadFlowLocations = new List <ThreadFlowLocation>() { new ThreadFlowLocation(tfl) } }; SarifConsolidator consolidator = new SarifConsolidator(run); // ThreadFlow: Unique Locations added to run; only indices on ThreadFlow ThreadFlow flow = new ThreadFlow() { Locations = new List <ThreadFlowLocation>() { new ThreadFlowLocation(tfl), new ThreadFlowLocation() { Location = new Location(SampleLocation) }, new ThreadFlowLocation(tfl) } }; consolidator.Consolidate(flow); Assert.Equal(2, run.ThreadFlowLocations.Count); Assert.Equal(tfl.Module, run.ThreadFlowLocations[0].Module); Assert.Equal(5, run.ThreadFlowLocations[1].Location.PhysicalLocation.ArtifactLocation.Index); Assert.Equal(0, flow.Locations[0].Index); Assert.Equal(1, flow.Locations[1].Index); Assert.Equal(0, flow.Locations[0].Index); }
public void SarifConsolidator_ArtifactLocation() { SarifConsolidator consolidator = new SarifConsolidator(new Run()); // If Index set, remove Uri and UriBaseId ArtifactLocation a = new ArtifactLocation(SampleArtifactLocation); ArtifactLocation aExpected = new ArtifactLocation(SampleArtifactLocationTrimmed); consolidator.Trim(a); Assert.Null(a.Uri); Assert.True(ArtifactLocation.ValueComparer.Equals(aExpected, a)); // Uri not removed when no Index a = new ArtifactLocation() { Uri = SampleUri, UriBaseId = "Root" }; aExpected = new ArtifactLocation(a); consolidator.Trim(a); Assert.Equal(SampleUri, a.Uri); Assert.True(ArtifactLocation.ValueComparer.Equals(aExpected, a)); }
public void SarifConsolidator_Result() { Run run = new Run(); SarifConsolidator consolidator = new SarifConsolidator(run); Result result = new Result() { Message = new Message() { Text = new string('Z', 500) }, Locations = new List <Location>() { new Location(SampleLocation), new Location(SampleLocation) }, RelatedLocations = new List <Location>() { new Location(SampleLocation), new Location(SampleLocation) }, CodeFlows = new List <CodeFlow>(), Graphs = new List <Graph>(), GraphTraversals = new List <GraphTraversal>(), Stacks = new List <Stack>(), WebRequest = new WebRequest(), WebResponse = new WebResponse() }; Result expected = new Result(result) { Locations = new List <Location>() { new Location(SampleLocationTrimmed) }, RelatedLocations = new List <Location>() { new Location(SampleLocationTrimmed) }, }; consolidator.Trim(result); Assert.True(Result.ValueComparer.Equals(expected, result)); Assert.NotNull(result.CodeFlows); consolidator.MessageLengthLimitChars = 128; consolidator.RemoveCodeFlows = true; consolidator.RemoveGraphs = true; consolidator.RemoveRelatedLocations = true; consolidator.RemoveStacks = true; consolidator.RemoveWebRequests = true; consolidator.RemoveWebResponses = true; consolidator.Trim(result); Assert.Equal(128 + 3, result.Message.Text.Length); // Truncated + ellipse Assert.Null(result.CodeFlows); Assert.Null(result.Graphs); Assert.Null(result.GraphTraversals); Assert.Null(result.RelatedLocations); Assert.Null(result.Stacks); Assert.Null(result.WebRequest); Assert.Null(result.WebResponse); }