Static analyser for finding Deadlocks in Go

dingo-hunter Build Status

Static analyser for finding Deadlocks in Go

This is a static analyser to model concurrency and find deadlocks in Go code. The main purpose of this tool is to infer from Go source code its concurrency model in either of the two formats:

  • Communicating Finite State Machines (CFSMs)
  • MiGo types

The inferred models are then passed to separate tools for formal analysis. In both approaches, we apply a system known in the literature as Session Types to look for potential communication mismatches to preempt potential deadlocks.

Install

dingo-hunter can be installed by go get, go version go1.7.1 is required.

$ go get -u github.com/nickng/dingo-hunter

Usage

There are two approaches (CFSMs and MiGo types) based on two research work.

CFSMs approach

This approach generates CFSMs as models for goroutines spawned in the program, the CFSMs are then passed to a synthesis tool to construct a global choreography and check for validity (See paper).

First install the synthesis tool gmc-synthesis by checking out the submodule:

$ cd $GOPATH/src/github.com/nickng/dingo-hunter; git submodule init; git submodule update
$ cd third_party/gmc-synthesis

Follow README to install and build gmc-synthesis, i.e.

$ cabal install MissingH split Graphalyze
$ ./getpetrify # and install to /usr/local/ or in $PATH
$ ghc -threaded GMC.hs --make && ghc --make BuildGlobal

To run CFSMs generation on example/local-deadlock/main.go:

$ dingo-hunter cfsms --prefix deadlock example/local-deadlock/main.go

Output should say 2 channels, then run synthesis tool on extracted CFSMs

$ cd third_party/gmc-synthesis
$ ./runsmc inputs/deadlock_cfsms 2 # where 2 is the number of channels

The SMC check line indicates if the global graph satisfies SMC (i.e. safe) or not.

Limitations

  • Our tool currently support synchronous (unbuffered channel) communication only
  • Goroutines spawned after any communication operations must not depend on those communication. Our model assumes goroutines are spawned independenly.

MiGo types approach

This approach generates MiGo types, a behavioural type introduced in this work, to check for safety and liveness by a restriction called fencing on channel usage (See paper).

The checker for MiGo types is available at nickng/gong, follow the instructions to build the tool:

$ git clone ssh://github.com/nickng/gong.git
$ cd gong; ghc Gong.hs

To run MiGo types generation on example/local-deadlock/main.go:

$ dingo-hunter migo example/local-deadlock/main.go --no-logging --output deadlock.migo
$ /path/to/Gong -A deadlock.migo

Limitations

  • Channels as return values are not supported right now
  • Channel recv,ok test not possible to represent in MiGo (requires inspecting value but abstracted by types)

Research publications

Notes

This is a research prototype, and may not work for all Go source code. Please file an issue for problems that look like a bug.

License

dingo-hunter is licensed under the Apache License

Comments
  • cfsms extraction panics when analysing undefined channel

    cfsms extraction panics when analysing undefined channel

    Running cfsms on my code, I get a panic. See below a part of the output. I attach full output :

    ` -- return from net.cgoLookupServicePort (2 retvals) net.cgoLookupPort.t28 = extract t27[#0] == Undefined net.cgoLookupPort.t29 = extract t27[#1] == net.cgoLookupServicePort.t47@0 New channel net.cgoLookupPort.t30@0 { type: net.portLookupResult } by net.cgoLookupPort.t30@0 at /usr/local/opt/go/libexec/src/net/cgo_unix.go:84:16 ^ in role main & changetype from net.cgoLookupPort.t30 to net.cgoLookupPort.t31 (channel net.cgoLookupPort.t30@0) ^ origin @@ queue go net.cgoPortLookup(result:caller[net.cgoLookupPort.t31] = net.cgoLookupPort.t30@0 channel net.cgoLookupPort.t30@0, hints:caller[net.cgoLookupPort.t0] = net.cgoLookupPort.t0@0 struct, network:caller[net.cgoLookupPort.network] = Undefined, service:caller[net.cgoLookupPort.service] = Undefined) ++ invoke net.cgoLookupPort.ctx.func (context.Context).Done() <-chan struct{} select net.cgoLookupPort.t30@0 (2 states) Recv main←ᶜʰnet.cgoLookupPort.t30@0nondet Called by: net.cgoLookupPort() Called by: (*net.Resolver).lookupPort() Called by: (*net.Resolver).LookupPort() Called by: (*net.Resolver).internetAddrList() Called by: net.ResolveUDPAddr() Called by: github.com/socialpoint/edwin/vendor/github.com/socialpoint-labs/bsk/metrics.NewDataDog() Called by: github.com/socialpoint/edwin/vendor/github.com/socialpoint-labs/bsk/metrics.NewMetricsRunnerFromDSN() panic: Select: Channel net.cgoLookupPort.t32 at /usr/local/opt/go/libexec/src/net/cgo_unix.go:89:17 is undefined

    goroutine 919 [running]: github.com/nickng/dingo-hunter/cfsmextract.visitSelect(0xc436ba2180, 0xc42f79c380) /Users/dpinyol/socialpoint/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:328 +0xf37 github.com/nickng/dingo-hunter/cfsmextract.visitInst(0x17d6c60, 0xc436ba2180, 0xc42f79c380) /Users/dpinyol/socialpoint/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:85 +0x39e github.com/nickng/dingo-hunter/cfsmextract.visitBlock(0xc436b99760, 0xc42f79c380) /Users/dpinyol/socialpoint/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:29 +0x7e github.com/nickng/dingo-hunter/cfsmextract.visitIf(0xc436b9e980, 0xc42f79c380) /Users/dpinyol/socialpoint/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:404 +0xacd github.com/nickng/dingo-hunter/cfsmextract.visitInst(0x17d6180, 0xc436b9e980, 0xc42f79c380) /Users/dpinyol/socialpoint/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:94 +0x97f github.com/nickng/dingo-hunter/cfsmextract.visitBlock(0xc436b99290, 0xc42f79c380) /Users/dpinyol/socialpoint/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:29 +0x7e github.com/nickng/dingo-hunter/cfsmextract.visitJump(0xc436b8a438, 0xc42f79c380) /Users/dpinyol/socialpoint/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:480 +0x4b github.com/nickng/dingo-hunter/cfsmextract.visitInst(0x17d6360, 0xc436b8a438, 0xc42f79c380) /Users/dpinyol/socialpoint/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:97 +0x647 github.com/nickng/dingo-hunter/cfsmextract.visitBlock(0xc436b993f0, 0xc42f79c380) /Users/dpinyol/socialpoint/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:29 +0x7e github.com/nickng/dingo-hunter/cfsmextract.visitIf(0xc436b9e780, 0xc42f79c380) /Users/dpinyol/socialpoint/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:399 +0xa01 github.com/nickng/dingo-hunter/cfsmextract.visitInst(0x17d6180, 0xc436b9e780, 0xc42f79c380) /Users/dpinyol/socialpoint/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:94 +0x97f github.com/nickng/dingo-hunter/cfsmextract.visitBlock(0xc436b991e0, 0xc42f79c380) /Users/dpinyol/socialpoint/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:29 +0x7e github.com/nickng/dingo-hunter/cfsmextract.visitIf(0xc436b9e700, 0xc42f79c380) /Users/dpinyol/socialpoint/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:399 +0xa01 github.com/nickng/dingo-hunter/cfsmextract.visitInst(0x17d6180, 0xc436b9e700, 0xc42f79c380) /Users/dpinyol/socialpoint/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:94 +0x97f github.com/nickng/dingo-hunter/cfsmextract.visitBlock(0xc436b988f0, 0xc42f79c380) `

  • golang/go/wiki/ResearchPapers

    golang/go/wiki/ResearchPapers

    Hi! this paper is removed from golang/go/wiki/ResearchPapers :disappointed:

    https://github.com/golang/go/wiki/ResearchPapers/_compare/fa4bab02ff787e6bb52ec71b43715afdd0a54948...7d15ba891fb30cb1c98dd1062b1853af937adb7c history: https://github.com/golang/go/wiki/ResearchPapers/_history

    Is it possible to re-add ? ( or revert changes ? )

  • go get failed

    go get failed

    $  go get -u github.com/nickng/dingo-hunter
    # github.com/nickng/dingo-hunter/cfsmextract/sesstype
    src/github.com/nickng/dingo-hunter/cfsmextract/sesstype/dot.go:53: cannot use map[string]string literal (type map[string]string) as type gographviz.Attrs in field value
    src/github.com/nickng/dingo-hunter/cfsmextract/sesstype/dot.go:65: cannot use map[string]string literal (type map[string]string) as type gographviz.Attrs in field value
    src/github.com/nickng/dingo-hunter/cfsmextract/sesstype/dot.go:82: cannot use map[string]string literal (type map[string]string) as type gographviz.Attrs in field value
    src/github.com/nickng/dingo-hunter/cfsmextract/sesstype/dot.go:99: cannot use map[string]string literal (type map[string]string) as type gographviz.Attrs in field value
    src/github.com/nickng/dingo-hunter/cfsmextract/sesstype/dot.go:112: cannot use map[string]string literal (type map[string]string) as type gographviz.Attrs in field value
    src/github.com/nickng/dingo-hunter/cfsmextract/sesstype/dot.go:132: cannot use dotNode.Attrs (type gographviz.Attrs) as type map[string]string in argument to dot.Graph.AddNode
    
  • readme usage example typos

    readme usage example typos

    At the Readme some command line are not up to date, for example the command

    dingo-hunter infer example/local-deadlock/main.go --no-logging --output deadlock.migo

    should be

    dingo-hunter migo examples/local-deadlock/main.go --no-logging --output deadlock.migo

  • sesstype -> CFSM conversion ignores self-loop

    sesstype -> CFSM conversion ignores self-loop

    Conversion from a sesstype (graph of actions) into CFSMs ignores actions which loops directly back to its parent. e.g. Label X; Recv; Goto X; generates a state machine that does a one-shot receive.

    This is due to the automatic creation of a new state for a receive transition, which covers ordinary case but not self-loop.

    Instead, the conversion from sesstype to CFSM should detect self-loop and treat as a special case.

  • Run  my project with panic

    Run my project with panic

    on centos7, I run commd:

    ~/workspace/Server/go/bin/dingo-hunter cfsms --prefix deadlock myproject/

    to check deadlock end with panic output:

    panic: Select: Channel net.cgoLookupPort.^[[4mt32^[[0m at /usr/local/go/src/net/cgo_unix.go:90:17 is undefined

    goroutine 1255 [running]: github.com/nickng/dingo-hunter/cfsmextract.visitSelect(0xc4289d2e40, 0xc426af0980) /root/workspace/Server/go/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:328 +0x10e0 github.com/nickng/dingo-hunter/cfsmextract.visitInst(0xe5f280, 0xc4289d2e40, 0xc426af0980) /root/workspace/Server/go/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:85 +0x401 github.com/nickng/dingo-hunter/cfsmextract.visitBlock(0xc42d9dd6b0, 0xc426af0980) /root/workspace/Server/go/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:29 +0x81 github.com/nickng/dingo-hunter/cfsmextract.visitIf(0xc4377c9820, 0xc426af0980) /root/workspace/Server/go/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:404 +0xc1a github.com/nickng/dingo-hunter/cfsmextract.visitInst(0xe5e800, 0xc4377c9820, 0xc426af0980) /root/workspace/Server/go/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:94 +0xb8d github.com/nickng/dingo-hunter/cfsmextract.visitBlock(0xc42d9dcbb0, 0xc426af0980) /root/workspace/Server/go/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:29 +0x81 github.com/nickng/dingo-hunter/cfsmextract.visitJump(0xc42dedf368, 0xc426af0980) /root/workspace/Server/go/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:480 +0x4d github.com/nickng/dingo-hunter/cfsmextract.visitInst(0xe5e9e0, 0xc42dedf368, 0xc426af0980) /root/workspace/Server/go/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:97 +0x76e github.com/nickng/dingo-hunter/cfsmextract.visitBlock(0xc42d9dce70, 0xc426af0980) /root/workspace/Server/go/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:29 +0x81 github.com/nickng/dingo-hunter/cfsmextract.visitIf(0xc4377c95c0, 0xc426af0980) /root/workspace/Server/go/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:399 +0xb3b github.com/nickng/dingo-hunter/cfsmextract.visitInst(0xe5e800, 0xc4377c95c0, 0xc426af0980) /root/workspace/Server/go/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:94 +0xb8d github.com/nickng/dingo-hunter/cfsmextract.visitBlock(0xc42d9dca50, 0xc426af0980) /root/workspace/Server/go/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:29 +0x81 github.com/nickng/dingo-hunter/cfsmextract.visitIf(0xc4377c9500, 0xc426af0980) /root/workspace/Server/go/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:399 +0xb3b github.com/nickng/dingo-hunter/cfsmextract.visitInst(0xe5e800, 0xc4377c9500, 0xc426af0980) /root/workspace/Server/go/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:94 +0xb8d github.com/nickng/dingo-hunter/cfsmextract.visitBlock(0xc4297a1550, 0xc426af0980) /root/workspace/Server/go/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:29 +0x81 github.com/nickng/dingo-hunter/cfsmextract.visitIf(0xc4377c8b60, 0xc426af0980) /root/workspace/Server/go/src/github.com/nickng/dingo-hunter/cfsmextract/visit.go:399 +0xb3b ....

  • Unknown name issue when there are no instructions after if block or select block

    Unknown name issue when there are no instructions after if block or select block

    When there are no (channel-related) instructions after if block or select block, the MiGo code is broken due to the unknown function name.

    A sample code is the following

    func main() {
        x := make(chan bool)
        go func() { x <- true }()
        if true {
            <-x
        }
    }
    

    This code is converted to:

    def main.main():
        let t1 = newchan main.main.t1_0_0, 0;
        spawn main.main$1(t1);
        if recv t1; call main.main#2(t1); else endif;
    def main.main$1(x):
        send x;
    

    The problem is undefined main.main#2.

  • Some channel-closing programs are failed for the naming issue

    Some channel-closing programs are failed for the naming issue

    This simple channel-closing program is failed with a Gong error Some of ["main.main.t0_0_0"] are not declared.

    func main() {
        x := make(chan bool)
        close(x)
    }
    

    This Go program is translated into MiGo below:

    def main.main():
        let t0 = newchan main.main.t0_0_0, 0;
        close main.main.t0_0_0;
    

    I think this error occurred because the argument of close in MiGo is main.main.t0_0_0 instead of t0.

  • Split CFSMs extraction to smaller reusable modules

    Split CFSMs extraction to smaller reusable modules

    Bump version up to build with go1.6.2 Refactoring

    • cfsmextract: CFSMs extraction, previously the main deadlock analysis
    • ssabuilder: for building SSA for program with standard defaults
    • logwriter: wrapper for logging
    • Now uses spf13/cobra to handle command line arguments
  • Impossible type assertion

    Impossible type assertion

    Build fails on the latest go release (go1.5.3) with the following error: sesstype/sesstype.go:37: impossible type assertion: *"golang.org/x/tools/go/types".Chan does not implement "go/types".Type (wrong type for Underlying method) have Underlying() "golang.org/x/tools/go/types".Type want Underlying() "go/types".Type

    The reason seems to be https://github.com/golang/tools/commit/542ffc7e75cf45ac7ad456664a710cd96338fda6

    Temporarily workaround (before go1.6 release) is to build with go1.5

  • Errors when running examples

    Errors when running examples

    Hello,

    I get some errors when running dingo-hunter on the programs from the examples folder. I have contacted Nick about this, but he was busy and could not help me at the time. Below is a summary of the errors, in the hope that someone can clarify if these are really errors related to the tool or if I'm doing anything wrong. Thank you!

    CFSMs errors:

    • altbit - panic: Select: Channel main.rx.t12 is undefined
    • dining-philosophers - panic: Select: Channel (*main.Philosopher).getChopsticks.t16 is undefined
    • fcall - FATAL ERROR: (line 3) place q00q10q20q30q40 not declared
    • multiple-files - Undeclared name: x ; couldn't load packages due to errors: main
    • multiple-timeout - panic: Select: Channel main.main.t1 is undefined
    • philo - Not exactly an error, but running for 10-15 minutes does not seem to be enough to show the full output.
    • powsers - panic: Select: Channel main.getn.t21 is undefined
    • timeout-behaviour - panic: Select: Channel main.main.t2 is undefined

    MiGo Types errors:

    • channel-scoping-test - Gong: Some of ["t0"] are not declared.
    • deadlocking-philosophers - panic: runtime error: invalid memory address or nil pointer dereference
    • dining-philosophers - panic: runtime error: invalid memory address or nil pointer dereference
    • fanin-pattern - Gong: Some of ["t0", "t1", "t3"] are not declared.
    • fanin-pattern-commaok - Gong: [unfoldTillGuard] We don't deal with Seq yet: main.fanin5 <t0, t1>; main.main#14 <t0, t11>; 0
    • fcall - Gong: Some of ["t0"] are not declared.
    • github-golang-go-issue-12734 - github-golang-go-issue-12734.migo is not fenced.
    • golang-blog-prime-sieve - Gong: [unfoldTillGuard] We don't deal with Seq yet
    • makechan-in-loop - Gong: Some of ["t12"] are not declared.
    • md5 - panic: runtime error: invalid memory address or nil pointer dereference
    • multi-makechan-same-var - Gong: Some of ["t0"] are not declared.
    • multiple-files - Undeclared name: x ; couldn't load packages due to errors: main
    • multiple-timeout - Gong: Something went wrong, can't find: main.main#1
    • philo - Gong: Some of ["t5"] are not declared.
    • powsers - Gong: Some of ["t32"] are not declared.
    • producer-consumer - Gong: Some of ["done"] are not declared.
    • ring-pattern - ring-pattern.migo is not fenced
    • russ-cox-fizzbuzz - Gong: Some of ["t4", "t1"] are not declared.
    • select-with-weak-mismatch - Gong: Something went wrong, can't find: main.main#1
    • single-gortn-method-call - Gong: Some of ["t1"] are not declared.
    • spawn-in-choice - panic: runtime error: invalid memory address or nil pointer dereference
    • squaring-cancellation - Gong: Some of ["t3", "t0"] are not declared.
    • squaring-fanin - Gong: Some of ["t11", "t2"] are not declared.
    • squaring-fanin-bad - Gong: Some of ["t11", "t2"] are not declared.
    • squaring-pipeline - Gong: Some of ["t4"] are not declared.
    • struct-done-channel - Gong: Some of ["t1"] are not declared.
  • Migrate to go/packages

    Migrate to go/packages

    Similar to the migration of Go modules, the new go/packages supports non-mod and mod's way of loading packages as a coherence set of packages.

    We should retire our use of package loading and use go/packages going forward for forward/backward compatibility.

  • Error running example

    Error running example

    Hello, I am having some problems running some the example programs provided, namely the deadlocking-philosophers. When I try to generate a .migo file, it panics:

    panic: runtime error: invalid memory address or nil pointer dereference
    [signal SIGSEGV: segmentation violation code=0x1 addr=0x20 pc=0x7e7651]
    
    goroutine 275 [running]:
    github.com/nickng/dingo-hunter/migoextract.(*Const).String(0xc0027af200, 0xc000f80000, 0x70)
    	/home/afonso/go_projects/src/github.com/nickng/dingo-hunter/migoextract/instance.go:93 +0x31
    github.com/nickng/dingo-hunter/migoextract.visitFunc(0xc005146f00, 0xc0028bb590, 0xc001977e10)
    	/home/afonso/go_projects/src/github.com/nickng/dingo-hunter/migoextract/visit.go:28 +0x3fe
    github.com/nickng/dingo-hunter/migoextract.(*Function).call(0xc001977860, 0xc008535fc0, 0xc005146f00, 0x0, 0x0, 0xc0028bb590, 0xc0059430e0, 0xc002ab7560, 0x2)
    	/home/afonso/go_projects/src/github.com/nickng/dingo-hunter/migoextract/call.go:304 +0xbb
    github.com/nickng/dingo-hunter/migoextract.(*Function).callFn(0xc001977860, 0xc008535fc0, 0xc0028bb590, 0xc0059430e0, 0xc002ab7560, 0x60291c00)
    	/home/afonso/go_projects/src/github.com/nickng/dingo-hunter/migoextract/call.go:296 +0x73
    github.com/nickng/dingo-hunter/migoextract.(*Function).Call(0xc001977860, 0xc008535f80, 0xc0028bb590, 0xc0059430e0, 0xc002ab7560)
    	/home/afonso/go_projects/src/github.com/nickng/dingo-hunter/migoextract/call.go:62 +0xe5
    github.com/nickng/dingo-hunter/migoextract.visitCall(0xc008535f80, 0xc0028bb590, 0xc00115d360)
    	/home/afonso/go_projects/src/github.com/nickng/dingo-hunter/migoextract/visit.go:268 +0x225
    github.com/nickng/dingo-hunter/migoextract.visitInstr(0xce0720, 0xc008535f80, 0xc0028bb590, 0xc00115d360)
    	/home/afonso/go_projects/src/github.com/nickng/dingo-hunter/migoextract/visit.go:87 +0x7cb
    github.com/nickng/dingo-hunter/migoextract.visitBasicBlock(0xc008548370, 0xc0028bb590, 0xc001977860, 0xc0059430e0, 0xc002ab7560)
    	/home/afonso/go_projects/src/github.com/nickng/dingo-hunter/migoextract/visit.go:76 +0x3f8
    github.com/nickng/dingo-hunter/migoextract.visitIf(0xc00853efe0, 0xc0028bb590, 0xc00160f870)
    	/home/afonso/go_projects/src/github.com/nickng/dingo-hunter/migoextract/visit.go:608 +0x43b
    github.com/nickng/dingo-hunter/migoextract.visitInstr(0xce0f00, 0xc00853efe0, 0xc0028bb590, 0xc00115d870)
    	/home/afonso/go_projects/src/github.com/nickng/dingo-hunter/migoextract/visit.go:105 +0x6fa
    github.com/nickng/dingo-hunter/migoextract.visitBasicBlock(0xc0085482c0, 0xc0028bb590, 0xc001977860, 0xc005942d20, 0xc002ab7560)
    	/home/afonso/go_projects/src/github.com/nickng/dingo-hunter/migoextract/visit.go:76 +0x3f8
    github.com/nickng/dingo-hunter/migoextract.visitJump(0xc0084c3d48, 0xc0028bb590, 0xc00160fc10)
    	/home/afonso/go_projects/src/github.com/nickng/dingo-hunter/migoextract/visit.go:839 +0x109f
    github.com/nickng/dingo-hunter/migoextract.visitInstr(0xce10e0, 0xc0084c3d48, 0xc0028bb590, 0xc00115dc10)
    	/home/afonso/go_projects/src/github.com/nickng/dingo-hunter/migoextract/visit.go:111 +0x3ee
    github.com/nickng/dingo-hunter/migoextract.visitBasicBlock(0xc008548210, 0xc0028bb590, 0xc001977860, 0xc0059426e0, 0xc002ab7560)
    	/home/afonso/go_projects/src/github.com/nickng/dingo-hunter/migoextract/visit.go:76 +0x3f8
    github.com/nickng/dingo-hunter/migoextract.visitFunc(0xc005147680, 0xc0028bb590, 0xc001977860)
    	/home/afonso/go_projects/src/github.com/nickng/dingo-hunter/migoextract/visit.go:38 +0x596
    github.com/nickng/dingo-hunter/migoextract.(*TypeInfer).Run(0xc0028bb590)
    	/home/afonso/go_projects/src/github.com/nickng/dingo-hunter/migoextract/migoextract.go:78 +0x990
    created by github.com/nickng/dingo-hunter/cmd.extractMigo
    	/home/afonso/go_projects/src/github.com/nickng/dingo-hunter/cmd/migo.go:83 +0x538
    

    Any idea as to why this may be happening? Thanks!

  • Trouble running/installing

    Trouble running/installing

    Hello!

    I have been trying to use this tool using the CFSM approach, but I have not been able to. I followed the instructions and I can't seem to run the line "dingo-hunter cfsms --prefix deadlock example/local-deadlock/main.go", it says that the dingo-hunter command is not found. Additionally, the "go get -u github.com/nickng/dingo-hunter" at the end issues a "code in directory /home/afonso/go_projects/src/github.com/nickng/migo expects import "github.com/nickng/migo". I'm not sure if I made any mistake following the installation process, but any help would be much appreciated.

    Thank you!

Parses Go tracebacks and finds possible deadlocks

findlock Parses Go tracebacks and finds possible deadlocks This works by checking how many locks have the same memory address. If there are multiple g

Nov 19, 2022
Sample code for my Go Deadlocks talk

Go Deadlocks Talk This is sample code for my Go Deadlocks talk. Simple simple - a super simple deadlock simple2 - the same but with an extra Go deadlo

Jul 30, 2022
Auto-gen fuzzing wrappers from normal code. Automatically find buggy call sequences, including data races & deadlocks. Supports rich signature types.

fzgen fzgen auto-generates fuzzing wrappers for Go 1.18, optionally finds problematic API call sequences, can automatically wire outputs to inputs acr

Dec 23, 2022
:pushpin: State of the art point location and neighbour finding algorithms for region quadtrees, in Go
:pushpin: State of the art point location and neighbour finding algorithms for region quadtrees, in Go

Region quadtrees in Go Region quadtrees and efficient neighbour finding techniques in Go Go-rquad proposes various implementations of region quadtrees

Dec 13, 2022
Go scripts for finding an API key / some keywords in repository
Go scripts for finding an API key / some keywords in repository

Git-Secret Go scripts for finding an API key / some keywords in repository Update V1.0 ?? Added some API Key checker Screenshoot ?? How to Install go

Dec 30, 2022
A kubectl plugin for finding decoded secret data with productive search flags.

kubectl-secret-data What is it? This is a kubectl plugin for finding decoded secret data. Since kubectl only outputs base64-encoded secrets, it makes

Dec 2, 2022
A kubectl plugin for finding decoded secret data with productive search flags.

kubectl-secret-data What is it? This is a kubectl plugin for finding decoded secret data. Since kubectl outputs base64-encoded secrets basically, it m

Dec 2, 2022
A tool for finding corrupted data rows in TiDB

tidb-bad-rows A tool for finding corrupted data rows in TiDB. It scans the target table and using a divide and conquer paradigm to locate all corrupte

Nov 17, 2021
Fuzzy-finding for checkout branches in reflog

checkout Get checkouted branches from the reflog and create a fuzzy-finding interface Install manually Download the pre-compiled binaries from the OSS

Nov 30, 2021
Expression evaluation engine for Go: fast, non-Turing complete, dynamic typing, static typing
Expression evaluation engine for Go: fast, non-Turing complete, dynamic typing, static typing

Expr Expr package provides an engine that can compile and evaluate expressions. An expression is a one-liner that returns a value (mostly, but not lim

Jan 1, 2023
Reduce debugging time while programming Go. Use static and stack-trace analysis to determine which func call causes the error.
Reduce debugging time while programming Go. Use static and stack-trace analysis to determine which func call causes the error.

Errlog: reduce debugging time while programming Introduction Use errlog to improve error logging and speed up debugging while you create amazing code

Nov 18, 2022
Super fast static photo and video gallery generator (written in Go and HTML/CSS/native JS)

fastgallery Fast static photo and video gallery generator Super fast (written in Go and C, concurrent, uses fastest image/video libraries, 4-8 times f

Dec 4, 2022
The simple and easy way to embed static files into Go binaries.

NOTICE: Please consider migrating your projects to github.com/markbates/pkger. It has an idiomatic API, minimal dependencies, a stronger test suite (t

Dec 25, 2022
:file_folder: Embeds static resources into go files for single binary compilation + works with http.FileSystem + symlinks

Package statics Package statics embeds static files into your go applications. It provides helper methods and objects to retrieve embeded files and se

Sep 27, 2022
Easily and dynamically generate maps from Go static structures

structomap This package helps you to transform your struct into map easily. It provides a structomap.Serializer interface implemented by the structoma

Dec 9, 2022
Expression evaluation engine for Go: fast, non-Turing complete, dynamic typing, static typing
Expression evaluation engine for Go: fast, non-Turing complete, dynamic typing, static typing

Expr Expr package provides an engine that can compile and evaluate expressions. An expression is a one-liner that returns a value (mostly, but not lim

Dec 30, 2022
This service provides authenticated access to a static website hosted in an s3 bucket.
This service provides authenticated access to a static website hosted in an s3 bucket.

website-openid-proxy This service provides OpenID authenticated access to a static website hosted in an s3 bucket. It is designed to be a simple way t

Jan 19, 2022
succinct provides several static succinct data types

succinct provides several static succinct data types Succinct Set Synopsis Performance Implementation License Succinct Set

Jan 5, 2023
Crane - 🐦 A full-text WebAssembley search engine for static websites
Crane - 🐦 A full-text WebAssembley search engine for static websites

Crane ?? My blog post: WebAssembly Search Tools for Static Sites Crane is a technical demo is inspired by Stork and uses a near-identical configuratio

Dec 1, 2022
Using brotli compression to embed static files in Go.
Using brotli compression to embed static files in Go.

?? Broccoli go get -u aletheia.icu/broccoli Broccoli uses brotli compression to embed a virtual file system of static files inside Go executables. A f

Nov 25, 2022