In 16 years of Go's existence, neither Google nor the community has solved
the race detection problem without CGO. ThreadSanitizer requires
CGO_ENABLED=1,
which makes it unusable for Docker scratch images, cloud functions,
cross-compilation, and embedded systems.
We demonstrated a working concept in pure Go:
- Detector is implemented (FastTrack algorithm, vector clocks, shadow
memory)
- 359/359 tests pass
- Real races are detected
Issue #76786 was not a proposal to merge into upstream. We were gauging
community reaction to see if anyone actually needs this. And we found out
—
yes, they do (rr compatibility, CGO_ENABLED=0, cross-compilation).
The problem is not the detector itself, but the integration. The current
AST-based approach is a proof of concept. With proper Go runtime
integration,
this would work 100% — the compiler already generates
runtime.raceread/racewrite
calls.
About "AI vibe-slop": AI tools are professional force multipliers for
engineers,
not a replacement for expertise. Critics haven't proposed anything
themselves
to solve this 16-year-old problem.
We're actively improving:
- v0.7.1-v0.7.2 fixed issues #15, #16, #17 reported by @glycerine
- Phase 2 will improve instrumentation via go/types and SSA
Related issues:
- #15: Test command flags fix —
https://github.com/kolkov/racedetector/issues/15
- #16: CGO file handling —
https://github.com/kolkov/racedetector/issues/16
- #17: Stack trace display —
https://github.com/kolkov/racedetector/issues/17
- #20: False positives reduction —
https://github.com/kolkov/racedetector/issues/20
Constructive bug reports welcome:
https://github.com/kolkov/racedetector/issues
On Friday, 19 December 2025 at 03:24:36 UTC+3 Jason E. Aten wrote:
> the #performance gopher slack channel pointed to this analysis regarding
> the https://github.com/kolkov/racedetector project:
>
>
> https://old.reddit.com/r/golang/comments/1pjx4hh/proposal_runtimerace_purego_implementation/ntk1k69/
>
> in which hugemang4 starts by saying,
>
> > "While it would be great to have a low-overhead race-detector
> implementation, *this proposal is pure AI vibe-slop*. The race-detector
> implementation they have shared is 100% AI implemented that doesn't even
> work properly. The race-detector implementation they have shared is 100% AI
> implemented that doesn't even work properly. I'm not sure the author has
> even attempt to run the example in the README since it doesn't work as
> `main()` should almost always return before any of the goroutinues even
> begin executing. In fact, this is so broken, that simply unrolling the loop
> causes it to no longer detect the race.
> >
> > "The author claims they pass all of the Go race test, but the first test
> I opened for atomics (
> https://github.com/kolkov/racedetector/blob/main/internal/race/api/go_race_atomic_test.go
>
> ) is incorrect and demonstrates the author doesn't understand concurrent
> memory models enough to implement this correctly. The tests here (
> https://github.com/kolkov/racedetector/blob/main/internal/race/api/go_race_atomic_test.go
>
> ) "simulates" atomic operations by using a mutex, but this is incorrect, as
> the lock acts as a full barrier for surrounding non-atomic operations (the
> `simulateAccess` calls), but in Go (and most other languages) an atomic
> Store only acts as a release barrier and Loads as an acquire barrier. So
> these tests cannot detect a race caused by a load being reordered before a
> prior atomic Store."
>
> Sadly, my own evaluation and filed bug reports tend to confirm that this
> is not a serious implementation of a workable all-Go race detector, but
> indeed, at the moment, can indeed be charitable designated "pure AI vibe
> slop".
>
> I hope that the author can address the problems of the current
> implementation, but that will require alot of manual rather than AI effort.
>
> On Thursday, December 18, 2025 at 8:59:56 PM UTC-3 [email protected]
> wrote:
>
>> https://github.com/golang/go/issues/76786 - Read more about the
>> discussion.
>>
>> On Wednesday, 17 December 2025 at 15:47:12 UTC+3 Jason E. Aten wrote:
>>
>>> This looks amazing. Am to understand that the slowdown under
>>> kolkov/racedetectdor is only 22%, rather than 200-500% slower with the C++
>>> race detector? That is incredible!
>>>
>>> On Friday, November 28, 2025 at 8:07:09 AM UTC-3 [email protected]
>>> wrote:
>>>
>>>>
>>>> 2025 update: This is now possible.
>>>>
>>>> I've built a Pure-Go race detector that works with CGO_ENABLED=0:
>>>> https://github.com/kolkov/racedetector
>>>>
>>>> Works in:
>>>> - Alpine/scratch Docker containers
>>>> - AWS Lambda / Cloud Functions
>>>> - Cross-compilation scenarios
>>>> - Any CGO_ENABLED=0 environment
>>>>
>>>> Usage:
>>>> go install github.com/kolkov/racedetector/cmd/racedetector@latest
>>>> racedetector build -o myapp main.go
>>>>
>>>> It's a standalone tool (not runtime integration yet), but it detects
>>>> races without any CGO dependency. FastTrack algorithm, 15-22% overhead,
>>>> pure Go.
>>>>
>>>> Feedback welcome: https://github.com/kolkov/racedetector/discussions
>>>>
>>>> Best regards!
>>>> On Wednesday, 18 February 2015 at 00:09:22 UTC+3 Blake Caldwell wrote:
>>>>
>>>> I'm building my service without CGO, so ideally, I'd like to run my
>>>> tests with the same settings, and I really like race detection. Is there
>>>> any way to use the race detector with CGO_ENABLED=0?
>>>>
>>>> # testmain
>>>> runtime/race(.text): __libc_malloc: not defined
>>>> runtime/race(.text): getuid: not defined
>>>> runtime/race(.text): pthread_self: not defined
>>>> runtime/race(.text): madvise: not defined
>>>> runtime/race(.text): sleep: not defined
>>>> runtime/race(.text): usleep: not defined
>>>> runtime/race(.text): abort: not defined
>>>> runtime/race(.text): isatty: not defined
>>>> runtime/race(.text): __libc_free: not defined
>>>> runtime/race(.text): getrlimit: not defined
>>>> runtime/race(.text): __libc_stack_end: not defined
>>>> runtime/race(.text): getrlimit: not defined
>>>> runtime/race(.text): setrlimit: not defined
>>>> runtime/race(.text): setrlimit: not defined
>>>> runtime/race(.text): setrlimit: not defined
>>>> runtime/race(.text): exit: not defined
>>>> runtime/race(.text.unlikely): __errno_location: not defined
>>>> runtime/race(.text): undefined: __libc_malloc
>>>> runtime/race(.text): undefined: getuid
>>>> runtime/race(.text): undefined: pthread_self
>>>> runtime/race(.text): undefined: madvise
>>>> too many errors
>>>>
>>>>
--
You received this message because you are subscribed to the Google Groups
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion visit
https://groups.google.com/d/msgid/golang-nuts/ae556c49-7c3d-4633-b676-a2c604c72e5an%40googlegroups.com.