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));
        }
Beispiel #2
0
        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);
        }
Beispiel #7
0
        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);
        }