How to use Bisect method of vcs Package

Best Syzkaller code snippet using vcs.Bisect

bisect.go

Source:bisect.go Github

copy

Full Screen

...53}54type env struct {55 cfg *Config56 repo vcs.Repo57 bisecter vcs.Bisecter58 minimizer vcs.ConfigMinimizer59 commit *vcs.Commit60 head *vcs.Commit61 kernelConfig []byte62 inst instance.Env63 numTests int64 startTime time.Time65 buildTime time.Duration66 testTime time.Duration67}68const NumTests = 10 // number of tests we do per commit69// Result describes bisection result:70// - if bisection is conclusive, the single cause/fix commit in Commits71// - for cause bisection report is the crash on the cause commit72// - for fix bisection report is nil73// - Commit is nil74// - NoopChange is set if the commit did not cause any change in the kernel binary75// (bisection result it most likely wrong)76// - Bisected to a release commit77// - if bisection is inconclusive, range of potential cause/fix commits in Commits78// - report is nil in such case79// - Commit is nil80// - if the crash still happens on the oldest release/HEAD (for cause/fix bisection correspondingly)81// - no commits in Commits82// - the crash report on the oldest release/HEAD;83// - Commit points to the oldest/latest commit where crash happens.84// - Config contains kernel config used for bisection85type Result struct {86 Commits []*vcs.Commit87 Report *report.Report88 Commit *vcs.Commit89 Config []byte90 NoopChange bool91 IsRelease bool92}93// Run does the bisection and returns either the Result,94// or, if the crash is not reproduced on the start commit, an error.95func Run(cfg *Config) (*Result, error) {96 if err := checkConfig(cfg); err != nil {97 return nil, err98 }99 cfg.Manager.Cover = false // it's not supported somewhere back in time100 repo, err := vcs.NewRepo(cfg.Manager.TargetOS, cfg.Manager.Type, cfg.Manager.KernelSrc)101 if err != nil {102 return nil, err103 }104 inst, err := instance.NewEnv(&cfg.Manager)105 if err != nil {106 return nil, err107 }108 if _, err = repo.CheckoutBranch(cfg.Kernel.Repo, cfg.Kernel.Branch); err != nil {109 return nil, err110 }111 return runImpl(cfg, repo, inst)112}113func runImpl(cfg *Config, repo vcs.Repo, inst instance.Env) (*Result, error) {114 bisecter, ok := repo.(vcs.Bisecter)115 if !ok {116 return nil, fmt.Errorf("bisection is not implemented for %v", cfg.Manager.TargetOS)117 }118 minimizer, ok := repo.(vcs.ConfigMinimizer)119 if !ok && len(cfg.Kernel.BaselineConfig) != 0 {120 return nil, fmt.Errorf("config minimization is not implemented for %v", cfg.Manager.TargetOS)121 }122 env := &env{123 cfg: cfg,124 repo: repo,125 bisecter: bisecter,126 minimizer: minimizer,127 inst: inst,128 startTime: time.Now(),129 }130 head, err := repo.HeadCommit()131 if err != nil {132 return nil, err133 }134 env.head = head135 if cfg.Fix {136 env.log("bisecting fixing commit since %v", cfg.Kernel.Commit)137 } else {138 env.log("bisecting cause commit starting from %v", cfg.Kernel.Commit)139 }140 start := time.Now()141 res, err := env.bisect()142 env.log("revisions tested: %v, total time: %v (build: %v, test: %v)",143 env.numTests, time.Since(start), env.buildTime, env.testTime)144 if err != nil {145 env.log("error: %v", err)146 return nil, err147 }148 if len(res.Commits) == 0 {149 if cfg.Fix {150 env.log("the crash still happens on HEAD")151 } else {152 env.log("the crash already happened on the oldest tested release")153 }154 env.log("commit msg: %v", res.Commit.Title)155 env.log("crash: %v\n%s", res.Report.Title, res.Report.Report)156 return res, nil157 }158 what := "bad"159 if cfg.Fix {160 what = "good"161 }162 if len(res.Commits) > 1 {163 env.log("bisection is inconclusive, the first %v commit could be any of:", what)164 for _, com := range res.Commits {165 env.log("%v", com.Hash)166 }167 return res, nil168 }169 com := res.Commits[0]170 env.log("first %v commit: %v %v", what, com.Hash, com.Title)171 env.log("recipients (to): %q", com.Recipients.GetEmails(vcs.To))172 env.log("recipients (cc): %q", com.Recipients.GetEmails(vcs.Cc))173 if res.Report != nil {174 env.log("crash: %v\n%s", res.Report.Title, res.Report.Report)175 }176 return res, nil177}178func (env *env) bisect() (*Result, error) {179 cfg := env.cfg180 var err error181 if err := build.Clean(cfg.Manager.TargetOS, cfg.Manager.TargetVMArch,182 cfg.Manager.Type, cfg.Manager.KernelSrc); err != nil {183 return nil, fmt.Errorf("kernel clean failed: %v", err)184 }185 env.log("building syzkaller on %v", cfg.Syzkaller.Commit)186 if err := env.inst.BuildSyzkaller(cfg.Syzkaller.Repo, cfg.Syzkaller.Commit); err != nil {187 return nil, err188 }189 com, err := env.repo.CheckoutCommit(cfg.Kernel.Repo, cfg.Kernel.Commit)190 if err != nil {191 return nil, err192 }193 env.commit = com194 env.kernelConfig = cfg.Kernel.Config195 testRes, err := env.test()196 if err != nil {197 return nil, err198 } else if testRes.verdict != vcs.BisectBad {199 return nil, fmt.Errorf("the crash wasn't reproduced on the original commit")200 }201 if len(cfg.Kernel.BaselineConfig) != 0 {202 testRes1, err := env.minimizeConfig()203 if err != nil {204 return nil, err205 }206 if testRes1 != nil {207 testRes = testRes1208 }209 }210 bad, good, rep1, results1, err := env.commitRange()211 if err != nil {212 return nil, err213 }214 if rep1 != nil {215 return &Result{Report: rep1, Commit: bad, Config: env.kernelConfig},216 nil // still not fixed/happens on the oldest release217 }218 if good == nil {219 // Special case: all previous releases are build broken.220 // It's unclear what's the best way to report this.221 // We return 2 commits which means "inconclusive".222 return &Result{Commits: []*vcs.Commit{com, bad}, Config: env.kernelConfig}, nil223 }224 results := map[string]*testResult{cfg.Kernel.Commit: testRes}225 for _, res := range results1 {226 results[res.com.Hash] = res227 }228 pred := func() (vcs.BisectResult, error) {229 testRes1, err := env.test()230 if err != nil {231 return 0, err232 }233 if cfg.Fix {234 if testRes1.verdict == vcs.BisectBad {235 testRes1.verdict = vcs.BisectGood236 } else if testRes1.verdict == vcs.BisectGood {237 testRes1.verdict = vcs.BisectBad238 }239 }240 results[testRes1.com.Hash] = testRes1241 return testRes1.verdict, err242 }243 commits, err := env.bisecter.Bisect(bad.Hash, good.Hash, cfg.Trace, pred)244 if err != nil {245 return nil, err246 }247 res := &Result{248 Commits: commits,249 Config: env.kernelConfig,250 }251 if len(commits) == 1 {252 com := commits[0]253 testRes := results[com.Hash]254 if testRes == nil {255 return nil, fmt.Errorf("no result for culprit commit")256 }257 res.Report = testRes.rep258 isRelease, err := env.bisecter.IsRelease(com.Hash)259 if err != nil {260 env.log("failed to detect release: %v", err)261 }262 res.IsRelease = isRelease263 noopChange, err := env.detectNoopChange(results, com)264 if err != nil {265 env.log("failed to detect noop change: %v", err)266 }267 res.NoopChange = noopChange268 }269 return res, nil270}271func (env *env) minimizeConfig() (*testResult, error) {272 cfg := env.cfg273 // Check if crash reproduces with baseline config.274 env.kernelConfig = cfg.Kernel.BaselineConfig275 testRes, err := env.test()276 if err != nil {277 env.log("testing baseline config failed: %v", err)278 env.kernelConfig = cfg.Kernel.Config279 return nil, err280 }281 if testRes.verdict == vcs.BisectBad {282 env.log("crash reproduces with baseline config")283 return testRes, nil284 }285 if testRes.verdict == vcs.BisectSkip {286 env.log("unable to test using baseline config, keep original config")287 env.kernelConfig = cfg.Kernel.Config288 return nil, nil289 }290 predMinimize := func(test []byte) (vcs.BisectResult, error) {291 env.kernelConfig = test292 testRes, err := env.test()293 if err != nil {294 return 0, err295 }296 return testRes.verdict, err297 }298 // Find minimal configuration based on baseline to reproduce the crash.299 env.kernelConfig, err = env.minimizer.Minimize(cfg.Kernel.Config,300 cfg.Kernel.BaselineConfig, cfg.Trace, predMinimize)301 if err != nil {302 env.log("minimizing config failed: %v", err)303 return nil, err304 }305 if bytes.Equal(env.kernelConfig, cfg.Kernel.Config) {306 return nil, nil307 }308 // Check that crash is really reproduced with generated config.309 testRes, err = env.test()310 if err != nil {311 return nil, fmt.Errorf("testing generated minimized config failed: %v", err)312 }313 if testRes.verdict != vcs.BisectBad {314 env.log("testing with generated minimized config doesn't reproduce the crash")315 env.kernelConfig = cfg.Kernel.Config316 return nil, nil317 }318 return testRes, nil319}320func (env *env) detectNoopChange(results map[string]*testResult, com *vcs.Commit) (bool, error) {321 testRes := results[com.Hash]322 if testRes.kernelSign == "" || len(com.Parents) != 1 {323 return false, nil324 }325 parent := com.Parents[0]326 parentRes := results[parent]327 if parentRes == nil {328 env.log("parent commit %v wasn't tested", parent)329 // We could not test the parent commit if it is not based on the previous release330 // (instead based on an older release, i.e. a very old non-rebased commit331 // merged into the current release).332 // TODO: we can use a differnet compiler for this old commit333 // since effectively it's in the older release, in that case we may not334 // detect noop change anyway.335 if _, err := env.repo.SwitchCommit(parent); err != nil {336 return false, err337 }338 _, kernelSign, err := env.build()339 if err != nil {340 return false, err341 }342 parentRes = &testResult{kernelSign: kernelSign}343 }344 env.log("culprit signature: %v", testRes.kernelSign)345 env.log("parent signature: %v", parentRes.kernelSign)346 return testRes.kernelSign == parentRes.kernelSign, nil347}348func (env *env) commitRange() (*vcs.Commit, *vcs.Commit, *report.Report, []*testResult, error) {349 if env.cfg.Fix {350 return env.commitRangeForFix()351 }352 return env.commitRangeForBug()353}354func (env *env) commitRangeForFix() (*vcs.Commit, *vcs.Commit, *report.Report, []*testResult, error) {355 env.log("testing current HEAD %v", env.head.Hash)356 if _, err := env.repo.SwitchCommit(env.head.Hash); err != nil {357 return nil, nil, nil, nil, err358 }359 res, err := env.test()360 if err != nil {361 return nil, nil, nil, nil, err362 }363 if res.verdict != vcs.BisectGood {364 return env.head, nil, res.rep, []*testResult{res}, nil365 }366 return env.head, env.commit, nil, []*testResult{res}, nil367}368func (env *env) commitRangeForBug() (*vcs.Commit, *vcs.Commit, *report.Report, []*testResult, error) {369 cfg := env.cfg370 tags, err := env.bisecter.PreviousReleaseTags(cfg.Kernel.Commit)371 if err != nil {372 return nil, nil, nil, nil, err373 }374 if len(tags) == 0 {375 return nil, nil, nil, nil, fmt.Errorf("no release tags before this commit")376 }377 lastBad := env.commit378 var lastRep *report.Report379 var results []*testResult380 for _, tag := range tags {381 env.log("testing release %v", tag)382 com, err := env.repo.SwitchCommit(tag)383 if err != nil {384 return nil, nil, nil, nil, err385 }386 res, err := env.test()387 if err != nil {388 return nil, nil, nil, nil, err389 }390 results = append(results, res)391 if res.verdict == vcs.BisectGood {392 return lastBad, com, nil, results, nil393 }394 if res.verdict == vcs.BisectBad {395 lastBad = com396 lastRep = res.rep397 }398 }399 return lastBad, nil, lastRep, results, nil400}401type testResult struct {402 verdict vcs.BisectResult403 com *vcs.Commit404 rep *report.Report405 kernelSign string406}407func (env *env) build() (*vcs.Commit, string, error) {408 current, err := env.repo.HeadCommit()409 if err != nil {410 return nil, "", err411 }412 bisectEnv, err := env.bisecter.EnvForCommit(env.cfg.BinDir, current.Hash, env.kernelConfig)413 if err != nil {414 return nil, "", err415 }416 compilerID, err := build.CompilerIdentity(bisectEnv.Compiler)417 if err != nil {418 return nil, "", err419 }420 env.log("testing commit %v with %v", current.Hash, compilerID)421 buildStart := time.Now()422 mgr := &env.cfg.Manager423 if err := build.Clean(mgr.TargetOS, mgr.TargetVMArch, mgr.Type, mgr.KernelSrc); err != nil {424 return nil, "", fmt.Errorf("kernel clean failed: %v", err)425 }426 kern := &env.cfg.Kernel427 _, kernelSign, err := env.inst.BuildKernel(bisectEnv.Compiler, kern.Userspace,428 kern.Cmdline, kern.Sysctl, bisectEnv.KernelConfig)429 if kernelSign != "" {430 env.log("kernel signature: %v", kernelSign)431 }432 env.buildTime += time.Since(buildStart)433 return current, kernelSign, err434}435func (env *env) test() (*testResult, error) {436 cfg := env.cfg437 if cfg.Timeout != 0 && time.Since(env.startTime) > cfg.Timeout {438 return nil, fmt.Errorf("bisection is taking too long (>%v), aborting", cfg.Timeout)439 }440 env.numTests++441 current, kernelSign, err := env.build()442 res := &testResult{443 verdict: vcs.BisectSkip,444 com: current,445 kernelSign: kernelSign,446 }447 if err != nil {448 if verr, ok := err.(*osutil.VerboseError); ok {449 env.log("%v", verr.Title)450 env.saveDebugFile(current.Hash, 0, verr.Output)451 } else if verr, ok := err.(*build.KernelError); ok {452 env.log("%s", verr.Report)453 env.saveDebugFile(current.Hash, 0, verr.Output)454 } else {455 env.log("%v", err)456 }457 return res, nil458 }459 testStart := time.Now()460 results, err := env.inst.Test(NumTests, cfg.Repro.Syz, cfg.Repro.Opts, cfg.Repro.C)461 env.testTime += time.Since(testStart)462 if err != nil {463 env.log("failed: %v", err)464 return res, nil465 }466 bad, good, rep := env.processResults(current, results)467 res.rep = rep468 res.verdict = vcs.BisectSkip469 if bad != 0 {470 res.verdict = vcs.BisectBad471 } else if NumTests-good-bad > NumTests/3*2 {472 // More than 2/3 of instances failed with infrastructure error,473 // can't reliably tell that the commit is good.474 res.verdict = vcs.BisectSkip475 } else if good != 0 {476 res.verdict = vcs.BisectGood477 }478 return res, nil479}480func (env *env) processResults(current *vcs.Commit, results []error) (bad, good int, rep *report.Report) {481 var verdicts []string482 for i, res := range results {483 if res == nil {484 good++485 verdicts = append(verdicts, "OK")486 continue487 }488 switch err := res.(type) {489 case *instance.TestError:490 if err.Boot {...

Full Screen

Full Screen

Bisect

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 repoRoot, err := vcs.RepoRootForImportPath("golang.org/x/tools", false)4 if err != nil {5 log.Fatal(err)6 }7 if repoRoot.VCS.Cmd != "git" {8 log.Fatalf("unexpected vcs %q", repoRoot.VCS.Cmd)9 }10 commitID, err := repoRoot.VCS.Bisect(repoRoot.Root, "v0.0.0", "v0.0.1", "v0.0.2")11 if err != nil {12 log.Fatal(err)13 }14 fmt.Println(commitID)15}

Full Screen

Full Screen

Bisect

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 vcs := vcs.NewVCS()4 vcs.Add(1)5 vcs.Add(2)6 vcs.Add(3)7 vcs.Add(4)8 vcs.Add(5)9 vcs.Add(6)10 vcs.Add(7)11 vcs.Add(8)12 vcs.Add(9)13 vcs.Add(10)14 vcs.Add(11)15 vcs.Add(12)16 vcs.Add(13)17 vcs.Add(14)18 vcs.Add(15)19 vcs.Add(16)20 vcs.Add(17)21 vcs.Add(18)22 vcs.Add(19)23 vcs.Add(20)24 vcs.Add(21)25 vcs.Add(22)26 vcs.Add(23)27 vcs.Add(24)28 vcs.Add(25)29 vcs.Add(26)30 vcs.Add(27)31 vcs.Add(28)32 vcs.Add(29)33 vcs.Add(30)34 vcs.Add(31)35 vcs.Add(32)36 vcs.Add(33)37 vcs.Add(34)38 vcs.Add(35)39 vcs.Add(36)40 vcs.Add(37)41 vcs.Add(38)42 vcs.Add(39)43 vcs.Add(40)44 vcs.Add(41)45 vcs.Add(42)46 vcs.Add(43)47 vcs.Add(44)48 vcs.Add(45)49 vcs.Add(46)50 vcs.Add(47)51 vcs.Add(48)52 vcs.Add(49)53 vcs.Add(50)54 vcs.Add(51)55 vcs.Add(52)56 vcs.Add(53)57 vcs.Add(54)58 vcs.Add(55)59 vcs.Add(56)60 vcs.Add(57)61 vcs.Add(58)62 vcs.Add(59)63 vcs.Add(60)64 vcs.Add(61)65 vcs.Add(62)66 vcs.Add(63)67 vcs.Add(64)68 vcs.Add(65)69 vcs.Add(66)70 vcs.Add(67)71 vcs.Add(68)72 vcs.Add(69)73 vcs.Add(70)74 vcs.Add(71)75 vcs.Add(72)76 vcs.Add(73)77 vcs.Add(74)78 vcs.Add(75)79 vcs.Add(76)80 vcs.Add(77)81 vcs.Add(78)

Full Screen

Full Screen

Bisect

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 root, err := vcs.RepoRootForImportPath("golang.org/x/tools", false)4 if err != nil {5 fmt.Println(err)6 os.Exit(1)7 }8 cmd := root.VCS.Cmd(root.Root)9 repo, err := vcs.NewRepo(cmd, root)10 if err != nil {11 fmt.Println(err)12 os.Exit(1)13 }14 err = repo.Bisect("golang.org/x/tools", "v0.0.0-20180115000414-3a792d9c32b2", "v0.0.0-20180111221434-1f849cf54d09")15 if err != nil {16 fmt.Println(err)17 os.Exit(1)18 }19}20How to use vcs.RepoRootForImportPath() method in Go?21How to use vcs.RepoRootForImportPathDynamic() method in Go?22How to use vcs.RepoRootForImportPath() method in Go?23How to use vcs.RepoRootForImportPathDynamic() method in Go?24How to use vcs.RepoRootForImportPath() method in Go?25How to use vcs.RepoRootForImportPathDynamic() method in Go?26How to use vcs.RepoRootForImportPath() method in Go?27How to use vcs.RepoRootForImportPathDynamic() method in Go?28How to use vcs.RepoRootForImportPath() method in Go?29How to use vcs.RepoRootForImportPathDynamic() method in Go

Full Screen

Full Screen

Bisect

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 var (4 if len(os.Args) < 3 {5 fmt.Println("Usage: go run 2.go <repo> <rev>")6 os.Exit(1)7 }8 }9 vcsRepo, err := vcs.RepoRootForImportPath(repo, false)10 if err != nil {11 log.Fatal(err)12 }13 rev, err = vcsRepo.VCS.Bisect(vcsRepo.Root, rev)14 if err != nil {15 log.Fatal(err)16 }17 fmt.Println("Bisected revision:", rev)18}

Full Screen

Full Screen

Bisect

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 rr := &vcs.RepoRoot{4 }5 commit, err := rr.VCS.Bisect(rr, "a8d8a7b7ba0b", "HEAD")6 if err != nil {7 fmt.Println("Error:", err)8 }9 fmt.Println(commit)10}11import (12type Cmd struct {13}14func (c *Cmd) Run() ([]byte, error) {15 err := c.Run()16 return buf.Bytes(), err17}18func (c *Cmd) CombinedOutput() ([]byte, error) {19 err := c.Run()20 return buf.Bytes(), err21}22type RepoRoot struct {23}24type VCS struct {25}26var (

Full Screen

Full Screen

Bisect

Using AI Code Generation

copy

Full Screen

1import (2func main() {3 vcsObj := vcs.NewVcs()4 ret := vcsObj.Bisect("bisect", "bisect", "bisect")5 if ret == 0 {6 fmt.Println("Bisect Operation Successful")7 } else {8 fmt.Println("Bisect Operation Not Successful")9 }10}11import (12func main() {13 vcsObj := vcs.NewVcs()14 ret := vcsObj.Branch("branch", "branch", "branch")15 if ret == 0 {16 fmt.Println("Branch Operation Successful")17 } else {18 fmt.Println("Branch Operation Not Successful")19 }20}

Full Screen

Full Screen

Automation Testing Tutorials

Learn to execute automation testing from scratch with LambdaTest Learning Hub. Right from setting up the prerequisites to run your first automation test, to following best practices and diving deeper into advanced test scenarios. LambdaTest Learning Hubs compile a list of step-by-step guides to help you be proficient with different test automation frameworks i.e. Selenium, Cypress, TestNG etc.

LambdaTest Learning Hubs:

YouTube

You could also refer to video tutorials over LambdaTest YouTube channel to get step by step demonstration from industry experts.

Try LambdaTest Now !!

Get 100 minutes of automation test minutes FREE!!

Next-Gen App & Browser Testing Cloud

Was this article helpful?

Helpful

NotHelpful