GCC Front-End Questions

Marc Glisse marc.glisse@inria.fr
Tue Dec 8 19:57:00 GMT 2015


On Tue, 8 Dec 2015, Jodi A. Miller wrote:

> One algebraic simplification we are seeing is particularly interesting.  
> Given the following code snippet intended to check for buffer overflow, 
> which is actually undefined behavior in C++, we expected to maybe see 
> the if check optimized away entirely.
>
>
>
> char buffer[100];
> int length;  //value received through argument or command line
> .
> .
> If (buffer + length < buffer)
> {
>                 cout << "Overflow" << endl;
> }
>
>
> Instead, our assembly code showed that the conditional was changed to 
> length < 0, which is not what was intended at all.  Again, this showed 
> up in the first IR file generated with g++ so we are thinking it 
> happened in the compiler front-end, which is surprising.  Any thoughts 
> on this?  In addition, when the above conditional expression is not used 
> as part of an if check (e.g., assigned to a Boolean), it is not 
> simplified.

Those optimizations during parsing exist mostly for historical reasons, 
and we are slowly moving away from them. You can look for any function 
call including "fold" in its name in the front-end. They work on 
expressions and mostly consist of matching patterns (described in 
fold-const.c and match.pd), like p + n < p in this case.

-- 
Marc Glisse



More information about the Gcc mailing list