> I would say, having looked at hundreds of thousands of lines of Ada, that I have had a disappointingly frequent experience in finding the UNCHECKED_CONVERSION generic used in production Ada code.
> I agree that this is often a mark of poor craftsmanship and unhesitatingly discourage its use, but it is there
[0] https://www.cs.york.ac.uk/hise/safety-critical-archive/2011/...
2. that's not Ada's only UB, the 2005 spec has 35 or 36, which granted is an improvement over C's circa 200, but a far cry from being UB free
This is so idiotic, and no, it's not a bug in Cap'n'Proto, it is very definitely a bug in the compiler (and/or the current version of the C spec. if it actually allows this).
I had a C compiler before there was C standard. So by your definition, this compiler could not have bugs?
As an exercise, try to express the difference between "standards-compliant" and "bug-free".
Different people may have different expectations, so bugs become subjective.
Ideally, there is a water-tight standard. In this case every deviation from the standard is a bug and vice versa.
Yes. However, we are talking specifically about the parts where the standard is undefined. The standard most emphatically does not require a compiler to do these crazy optimizations that remove safety critical code.
Not sure that's a very productive approach. The spec is what it is, and it's of course rather deliberately done the way it is in order to make it possible for compilers to optimize and extract more performance.
I still assert that at the very least if logical operations are eliminated they should be verbosely enumerated in the output of the compiler.
It might also be nice if there were a way of marking a section as /security/ rather than /speed/ critical, and thus transformations on the highlighted section would be far more limited.
Well, the code is right there, there is no magic "do what I mean" needed. Just don't magically remove code that I wrote.
> spec is [..] rather deliberately done the way it is in order to make it possible for compilers to optimize and extract more performance
Yes, and it is wrong. Breaking existing programs with magic that simply removes code that is clearly there in order to eke out a bit of performance is wrong.
Compile with O0.
> Yes, and it is wrong. Breaking existing programs with magic that simply removes code that is clearly there in order to eke out a bit of performance is wrong.
Well welcome to writing C? It's been this way for a long time and that won't change - UB is critical to performance and doesn't always lead to unsafety. If you're programming in C, don't blame the compiler when your UB leads to remote code exec, you should have known what you were getting into.
I've been writing C for 30 years.
> UB is critical to performance
Not really, no. See
"What every compiler writer should know about programmers or “Optimization” based on undefined behaviour hurts performance"
(referenced elsewhere in this thread)
http://www.complang.tuwien.ac.at/kps2015/proceedings/KPS_201...
Thanks for the paper. It's very interesting but I think it has no real impact on my initial statement - these optimizations aren't going away, you can continue to expect problems like this vuln in the future for the same reasons.
You can already do that: use a non-optimising compiler (tcc and the like) or compile without optimisations.