aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTaras Madan <tarasmadan@google.com>2024-07-17 10:05:09 +0200
committerTaras Madan <tarasmadan@google.com>2024-07-17 09:48:42 +0000
commite94834c03d8bd189227351a69bdd395f45ddbd5a (patch)
tree96bafa114597d0af9aec9cd643aef9ad55f5aa43
parent215bec2d0092e093aeaa7baeea4b670277102694 (diff)
syz-cover: add subsystems heatmap
-rw-r--r--pkg/cover/heatmap.go24
-rw-r--r--tools/syz-cover/syz-cover.go26
2 files changed, 42 insertions, 8 deletions
diff --git a/pkg/cover/heatmap.go b/pkg/cover/heatmap.go
index 7745a1d49..2582de7d7 100644
--- a/pkg/cover/heatmap.go
+++ b/pkg/cover/heatmap.go
@@ -15,6 +15,8 @@ import (
"cloud.google.com/go/civil"
"cloud.google.com/go/spanner"
"github.com/google/syzkaller/pkg/spanner/coveragedb"
+ "github.com/google/syzkaller/pkg/subsystem"
+ _ "github.com/google/syzkaller/pkg/subsystem/lists"
"golang.org/x/exp/maps"
"google.golang.org/api/iterator"
)
@@ -174,6 +176,28 @@ func DoHeatMap(w io.Writer, projectID, ns string, dateFrom, dateTo civil.Date) e
return heatmapTemplate.Execute(w, templateData)
}
+func DoSubsystemsHeatMap(w io.Writer, projectID, ns string, dateFrom, dateTo civil.Date) error {
+ covAndDates, err := filesCoverageAndDates(context.Background(), projectID, ns, dateFrom, dateTo)
+ if err != nil {
+ panic(err)
+ }
+ ssMatcher := subsystem.MakePathMatcher(subsystem.GetList("linux"))
+ var ssCovAndDates []*fileCoverageAndDate
+ for _, cad := range covAndDates {
+ for _, ss := range ssMatcher.Match(cad.Filepath) {
+ newRecord := fileCoverageAndDate{
+ Filepath: ss.Name + "/" + cad.Filepath,
+ Instrumented: cad.Instrumented,
+ Covered: cad.Covered,
+ Dateto: cad.Dateto,
+ }
+ ssCovAndDates = append(ssCovAndDates, &newRecord)
+ }
+ }
+ templateData := filesCoverageToTemplateData(ssCovAndDates)
+ return heatmapTemplate.Execute(w, templateData)
+}
+
func approximateInstrumented(points int64) string {
dim := "_"
if points > 10000 {
diff --git a/tools/syz-cover/syz-cover.go b/tools/syz-cover/syz-cover.go
index 14de498ad..1f0550238 100644
--- a/tools/syz-cover/syz-cover.go
+++ b/tools/syz-cover/syz-cover.go
@@ -43,12 +43,13 @@ var (
flagConfig = flag.String("config", "", "configuration file")
flagModules = flag.String("modules", "",
"modules JSON info obtained from /modules (optional)")
- flagExportCSV = flag.String("csv", "", "export coverage data in csv format (optional)")
- flagExportLineJSON = flag.String("json", "", "export coverage data with source line info in json format (optional)")
- flagExportJSONL = flag.String("jsonl", "", "export jsonl coverage data (optional)")
- flagExportHTML = flag.String("html", "", "save coverage HTML report to file (optional)")
- flagNsHeatmap = flag.String("heatmap", "", "generate namespace heatmap")
- flagDateFrom = flag.String("from",
+ flagExportCSV = flag.String("csv", "", "export coverage data in csv format (optional)")
+ flagExportLineJSON = flag.String("json", "", "export coverage data with source line info in json format (optional)")
+ flagExportJSONL = flag.String("jsonl", "", "export jsonl coverage data (optional)")
+ flagExportHTML = flag.String("html", "", "save coverage HTML report to file (optional)")
+ flagNsHeatmap = flag.String("heatmap", "", "generate namespace heatmap")
+ flagNsHeatmapGroupBy = flag.String("group-by", "dir", "dir or subsystem")
+ flagDateFrom = flag.String("from",
civil.DateOf(time.Now().Add(-14*24*time.Hour)).String(), "heatmap date from(optional)")
flagDateTo = flag.String("to",
civil.DateOf(time.Now()).String(), "heatmap date to(optional)")
@@ -65,8 +66,17 @@ func toolBuildNsHeatmap() {
if dateTo, err = civil.ParseDate(*flagDateTo); err != nil {
tool.Failf("failed to parse date to: %v", err.Error())
}
- if err = cover.DoHeatMap(buf, *flagProjectID, *flagNsHeatmap, dateFrom, dateTo); err != nil {
- tool.Fail(err)
+ switch *flagNsHeatmapGroupBy {
+ case "dir":
+ if err = cover.DoHeatMap(buf, *flagProjectID, *flagNsHeatmap, dateFrom, dateTo); err != nil {
+ tool.Fail(err)
+ }
+ case "subsystem":
+ if err = cover.DoSubsystemsHeatMap(buf, *flagProjectID, *flagNsHeatmap, dateFrom, dateTo); err != nil {
+ tool.Fail(err)
+ }
+ default:
+ tool.Failf("group by %s not supported", *flagNsHeatmapGroupBy)
}
if err = osutil.WriteFile(*flagNsHeatmap+".html", buf.Bytes()); err != nil {
tool.Fail(err)