Fantastic exchange from DConf

Patrick Schluter via Digitalmars-d digitalmars-d at puremagic.com
Tue May 9 09:21:30 PDT 2017


On Tuesday, 9 May 2017 at 14:13:31 UTC, Walter Bright wrote:
> On 5/8/2017 1:55 PM, John Carter wrote:
>> On Saturday, 6 May 2017 at 06:26:29 UTC, Joakim wrote:
>>
>>> Walter: I believe memory safety will kill C.
>>
>> C/C++ has been granted an extension of life by the likes of 
>> valgrind and purify
>> and *-sanitizer.
>
> I agree. But one inevitably runs into problems relying on 
> valgrind and other third party tools:
>
> 1. it isn't part of the language
>
> 2. it may not be available on your platform
>
> 3. somebody has to find it, install it, and integrate it into 
> the dev/test process
>
> 4. it's incredibly slow to run valgrind, so there are powerful 
> tendencies to skip it
>
> valgrind is a stopgap measure, and has saved me much grief over 
> the years, but it is NOT the solution.

And it doesn't catch everything. I had the case yesterday at work 
where one of the file converters that had been written 15 years 
ago, suddenly crashed in production*. It came from an upstream 
bug in a script that filled one attribute with garbage. I tried 
to reproduce the bug in the development environment and funily it 
didn't crash with newest version of the base library. The 
production library is one version behind. The garbage in the 
attribute triggered a buffer overflow in a fixed size array (496 
UTF-16 characters in a buffer of 200 character size). This 
converter is one of the last one with fixed sized arrays. The 
interesting observation was that valgrind catches the buffer 
overflow when linked with version 2.31 of the main library but is 
completely silent when using version 2.32. The changes in that 
library are minimal and in parts that have nothing to do with 
this app. It is solely the placement of variables in data iand 
the bss that change. It is surprizing to see such a big buffer 
overflow completely missed by valgrind.

TL;DR valgrind does not always catch buffer overflows especially 
if the memory overwritten is not in the head but in the data or 
the bss segment. There it cannot add guard pages as it does on 
the heap.

* To give a little context. I work at the European Commission on 
the central translation memory system called Euramis (probably 
the biggest in the world with more than a billion segments). The 
system is used intensively by all translators of all European 
institutions and without it, nothing would be possible. The issue 
with it is that the back end is written in C and the code goes 
back to 1990. Me and my colleagues managed to modernize the 
system and catch most of the code issues with intensive use of 
C99 idioms, newest gcc and clang diagnostics and also valgrind 
and such things.


More information about the Digitalmars-d mailing list