Skip to content

RFC: syz-cluster: consider git diffs during series triage #5934

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
49 changes: 49 additions & 0 deletions syz-cluster/pkg/triage/diff.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,49 @@
// Copyright 2025 syzkaller project authors. All rights reserved.
// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.

package triage

import (
"path/filepath"

"github.com/google/syzkaller/pkg/vcs"
"github.com/google/syzkaller/syz-cluster/pkg/api"
)

// For now, follow the simplest strategy - just verify whether the series modifies only the files
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add a TODO that this should be replaced with build signatures, rather than extended be more and more complex.

// irrelevant for the kernel builds.

// There are many opportunities to make it smarter:
// 1. Some source files are not compiled.
// 2. Some source files are compiled but we have never been able to cover them during fuzzing.

const reasonNotAffectsBuild = "the series only modifies irrelevant files"

// NeedFuzzing returns an empty string if the series is worth of fuzzing,
// and otherwise it returns an explanation why it is not.
func NeedFuzzing(series *api.Series) string {
for _, patch := range series.Patches {
files := vcs.ParseGitDiff(patch.Body)
for _, file := range files {
if irrelevantPath[file] {
continue
}
if irrelevantExt[filepath.Ext(file)] {
continue
}
return ""
}
}
return reasonNotAffectsBuild
}

var irrelevantExt = map[string]bool{
".txt": true,
".rst": true,
".json": true,
".py": true,
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

There are some codegen scripts in Python, at least I see "gen_header.py".
json/txt may be inputs to these scripts.

}

var irrelevantPath = map[string]bool{
"MAINTAINERS": true,
}
66 changes: 66 additions & 0 deletions syz-cluster/pkg/triage/diff_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@
// Copyright 2025 syzkaller project authors. All rights reserved.
// Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.

package triage

import (
"testing"

"github.com/google/syzkaller/syz-cluster/pkg/api"
"github.com/stretchr/testify/assert"
)

func TestNeedFuzzing(t *testing.T) {
tests := []struct {
Name string
Patch string
Verdict string
}{
{
Name: "source code changes",
Patch: `diff --git a/a.c b/a.c
index c4bfa5f..7b82a4b 100644
--- a/a.c
+++ b/a.c
@@ -1,2 +1,2 @@
-Old text
+new text`,
Verdict: "",
},
{
Name: "unrelated changes",
Patch: `diff --git a/documentation.txt b/documentation.txt
new file mode 100644
index 0000000..e15621b
--- /dev/null
+++ b/documentation.txt
@@ -0,0 +1 @@
+new text file`,
Verdict: reasonNotAffectsBuild,
},
{
Name: "irrelevant file",
Patch: `diff --git a/MAINTAINERS b/MAINTAINERS
new file mode 100644
index 0000000..e15621b
--- /dev/null
+++ b/MAINTAINERS
@@ -0,0 +1 @@
+new text file`,
Verdict: reasonNotAffectsBuild,
},
}

for _, test := range tests {
t.Run(test.Name, func(t *testing.T) {
reason := NeedFuzzing(&api.Series{
Patches: []api.SeriesPatch{
{
Body: []byte(test.Patch),
},
},
})
assert.Equal(t, test.Verdict, reason)
})
}
}
7 changes: 7 additions & 0 deletions syz-cluster/workflow/triage-step/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -57,6 +57,13 @@ func getVerdict(ctx context.Context, client *api.Client, ops triage.TreeOps) (*a
// TODO: the workflow step must be retried.
return nil, fmt.Errorf("failed to query series: %w", err)
}
if skipReason := triage.NeedFuzzing(series); skipReason != "" {
return &api.TriageResult{
Skip: &api.SkipRequest{
Reason: skipReason,
},
}, nil
}
trees, err := client.GetTrees(ctx)
if err != nil {
return nil, fmt.Errorf("failed to query trees: %w", err)
Expand Down
Loading