V8 Garbage Collector
60 points
by swah
3 hours ago
| 4 comments
| wingolog.org
| HN
ZeroConcerns
2 hours ago
[-]
Interesting article! One thing that made me literally LOL was the fact that several exploits were enabled via a Google "style recommendation" that caused on-heap length fields to be signed and thus subject to sign-extension attacks.

The conversation-leading-up-to-that played out a bit like this in my head:

Google Engineer #1: Hey, shouldn't that length field be unsigned? Not like a negative value ever makes sense there?

GE#2: Style guide says no

GE#1: Yeah, but that could easily be exploited, right?

GE#2: Maybe, but at least I won't get dinged on code review: my metrics are already really lagging this quarter

GE#1: Good point! In fact, I'll pre-prepare an emergency patch for that whole thing, as my team lead indicated I've been a bit slow on the turnaround lately...

reply
dbdr
1 hour ago
[-]
Quote from their style guide:

> The fact that unsigned arithmetic doesn't model the behavior of a simple integer, but is instead defined by the standard to model modular arithmetic (wrapping around on overflow/underflow), means that a significant class of bugs cannot be diagnosed by the compiler.

Fair enough, but signed arithmetic doesn't model the behavior of a "simple integer" (supposedly the mathematical concept) either. Instead, overflow in signed arithmetic is undefined behavior. Does that actually lead to the compiler being able to diagnose bugs? What's the claimed benefit exactly?

reply
sltkr
2 minutes ago
[-]
Tools like UBsan [1] can detect integer overflow in debug builds, and are used internally at Google to run automated tests.

So if you use a signed integer, there is a chance that overflows are caught in tests.

1. https://clang.llvm.org/docs/UndefinedBehaviorSanitizer.html

reply
gf000
1 hour ago
[-]
I believe some logic behind may be that you can't recognize an overflow has happened with unsigned, but with signed you can recognize over and underflows in certain cases by simply checking if it's a non-negative number.

At least I believe Java decided on signed integers for similar reasons. But if it's indeed UB in C++, it doesn't make sense.

reply
alpinisme
36 minutes ago
[-]
It’s the opposite in cpp: unsigned integer overflow is undefined but signed overflow is defined as wrapping
reply
debugnik
8 minutes ago
[-]
[delayed]
reply
Leszek
1 hour ago
[-]
The signed length fields pre-date the sandbox, and at that point being able to corrupt the string length meant you already had an OOB write primitive and didn't need to get one via strings. The sandbox is the new weird thing, where now these in-sandbox corruptions can sometimes be promoted into out-of-sandbox corruptions if code on the boundary doesn't handle these sorts of edge cases.
reply
whizzter
52 minutes ago
[-]
I don't envy these engineers having to trace through corruptions and other issues related to moving GC's, just keeping a simple regular toy GC from blowing up can be hard enough sometimes (Maybe they have some better tools, but memory corruptions are inherently prickly to debug).
reply
Leszek
45 minutes ago
[-]
rr (https://rr-project.org/) and memory watchpoints are a godsend when it comes to analysing heap corruptions.
reply
NeutralForest
2 hours ago
[-]
It's an interesting article because tech articles rarely revisit the past for what kind of decisions were made and why. Thanks! Also always cool to see a Wingo article because I get exposed to a field I know very little about (how garbage collection works).
reply
maartin0
2 hours ago
[-]
What does FTE stand for?:

> From what I can tell, there have been about 4 FTE from Google over this period

reply
kannanvijayan
2 hours ago
[-]
Full Time Employee
reply
DanielHB
29 minutes ago
[-]
Is this a codeword for "not contractor"? I heard that at google contractors are second class citizens.
reply
comonoid
45 minutes ago
[-]
FTE is a TLA.
reply