Hacker Newsnew | past | comments | ask | show | jobs | submitlogin

> There'll be plenty of C code out there

Precisely. The idea here is that any C program that does not specifically require one's complement or sign-magnitude representation will work just as well compiled as friendly C as it does compiled as C.

Also, just because testing has found no exploitable bugs in a C program compiled with GCC 4.8 does not mean that GCC 4.9 will not introduce a new optimization that wreaks havoc with undefined behavior that was there all along. No such surprises with friendly C. It's the trusty C compiler that you had in 1995, and it always will be.

Security-critical programs would never rely on undefined behavior!, you might say. Let us take the example of ntpd, one of the building blocks of the Internet, considered critical enough to be part of two Google bounty programs. Here is a list of currently harmless undefined behaviors in it that a compiler could use as an excuse to produce vulnerable binary code tomorrow: http://bugs.ntp.org/buglist.cgi?emailreporter1=1&emailtype1=...

Friendly C is not a new language. It is C as most developers understand it, and with bad surprises prohibited as much as possible.

Disclaimer: Julien, who reported these ntpd undefined behaviors, is my colleague, and I am a co-author of the “friendly C” proposal.



I get your point (and it's a fair one) but what happens when it goes the other way? A bit of code written (and working) in friendly C finds its way into a regular good old C codebase. Suddenly it contains a critical bug that may go unnoticed.

Or some coder is used to friendly C, uses aliasing, memcpy and wrapping arithmetic without thinking twice. Then he's asked to work on some project building with a regular C toolchain. Gun is cocked and pointed at the foot.

Those problems only occur because friendly C is a dialect of C, you don't get those drawbacks if you tell devs to use Rust or whatnot, because the difference between Rust and C is obvious, unlike friendly C and C.


This exact problem exists today if someone takes code from the Linux kernel that is compiled with things like -fno-strict-aliasing. Undefined Behaviour makes programs unpredictable in the first place, given that you can't reasonably ensure you're not triggering it. I would expect a lot more people to use friendly-c (or simple-c or yes-this-is-how-your-cpu-works-c) than standard c.

As he notes, people who need the undefined behaviour-induced optimisations are in the minority.


Most programmers already write C like it is "friendly-C".


There's an obvious solution to this: have friendly-c compilers accept some declaration silently in a source file:

  !dialect friendly-c
Now, c code can compile as friendly-c code, but explicitly-declared friendly-c code will fail if passed to a normal C compiler.


Such code would also fail if passed to tools like lint, and would result in warnings or worse when loaded in IDEs. The incredible C toolchain built over the decades is one of C's biggest advantages; friendly-c cannot afford to lose even 10% of it.


So make it a #pragma.


Then it cannot cause a compile error in standard C.


The security critical programs I've worked on, nobody would even think of randomly upgrading the compiler just because a new version happens to be available.


But take OpenSSL as an example of a critical security program. Nothing in the usage practice suggests not upgrading the compiler, or even going to the next version of libc.


Many open-source programs can be security-critical (any network-facing daemon, for instance), and there's nothing which ties them to a specific compiler.


"security-critical" means different things to different people.

For some (many?), the failure of a security-critical system means unauthorised access to information.

For some, the failure of a security-critical system means people could die.

In the latter case (e.g. medical devices), having a stable environment is far more important than having the latest version.


I usually hear the latter type of system described as "safety-critical" or "life-critical". You're right that it's an entirely different world, though.


It is the difference between security critical and mission critical.




Guidelines | FAQ | Lists | API | Security | Legal | Apply to YC | Contact

Search: