The first time I tried using Go I ran into a FFI bug which took 2 days to find and fix (after the Go devs had been unable to figure it out for months) and then a month of bureaucracy to get merged. I didn't write any more Go after that (and after seeing the guts of the runtime).
-
-
Replying to @marcan42 @hikari_no_yume and
Then I still had to find and debug *another* Go runtime bug after unfortunately running into random segfaults in a piece of software I used that was written in go. The root cause turned out to be Go devs knowingly making invalid ABI assumptions **to avoid using their slow FFI**.
1 reply 0 retweets 5 likes -
Replying to @marcan42 @hikari_no_yume and
Because on Linux... surprise! gettimeofday is not a syscall if you want to be fast, it's a call into vDSO, which is just a C ABI call into a special dynamic library that the kernel stuffs into your address space... But actually using Go's C FFI for that would kill the perf.
1 reply 0 retweets 5 likes -
Replying to @marcan42 @hikari_no_yume and
As it turns out, calling C functions with the Go ABI is a stupid idea. Who knew. Well, the Go devs knew, there was even a comment. They still did it. That was another day spent debugging Go.https://marcan.st/2017/12/debugging-an-evil-go-runtime-bug/ …
2 replies 6 retweets 15 likes -
Replying to @marcan42 @hikari_no_yume and
Wow. And one of the worst parts of that isn't the Go stuff, but the CPU behaviour handling the unmapped write and leaking it to other threads. That sounds like the most "Woah, WTF!" part of all this! Is there any way to consider that sane?
2 replies 0 retweets 0 likes -
The orq 0 to stack probe still does sound racy though, and likely to provoke strange CPU races.. Not a fan.
1 reply 0 retweets 0 likes -
Replying to @pjakma @hikari_no_yume and
There's nothing racy about the orq 0. If the stack is full (on a sane ABI with guard pages), it crashes. That's all.
1 reply 0 retweets 1 like -
Replying to @marcan42 @hikari_no_yume and
Yeah sorry, hadn't read your reply yet. Lack of guard page / go stacks right against each other and it makes sense. Still, the lack of atomicity in the orq might have made the compiler authors be wary of that trick...
2 replies 0 retweets 0 likes -
Replying to @pjakma @hikari_no_yume and
But if you look at the asm, it correctly allocates and deallocates the stack around the orq, so it's completely legitimate stack usage. The thread doing the orq owns that stack.
1 reply 0 retweets 1 like -
Replying to @marcan42 @hikari_no_yume and
Well, if there is something mapped there, and it doesn't overflow what was allocated for its stack and go into some other memory - as happened there. Though I guess overflow would have ran into weird behaviour one way or another.
1 reply 0 retweets 0 likes
The way the probes work, all pages get probed for large stack frames. So it's fine, assuming that guard pages are in use, because you're guaranteed to fault before you run into some other memory (that's why this mitigates Stack Clash). The problem is Go doesn't do that :-)
Loading seems to be taking a while.
Twitter may be over capacity or experiencing a momentary hiccup. Try again or visit Twitter Status for more information.