On Fri, 2015-02-20 at 10:29 -0700, Jeff Law wrote:
> On 02/19/15 14:56, Chris Johns wrote:
> > On 20/02/2015 8:23 am, Joel Sherrill wrote:
> >>
> >> On 2/19/2015 2:56 PM, Sandra Loosemore wrote:
> >>> Jakub Jelinek wrote:
> >>>> On Wed, Feb 18, 2015 at 11:21:56AM -0800, Jeff Prothero wrote:
> >>>>> Starting with gcc 4.9, -O2 implicitly invokes
> >>>>>
> >>>>>      -fisolate-erroneous-paths-dereference:
> >>>>>
> >>>>> which
> >>>>>
> >>>>>      https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html
> >>>>>
> >>>>> documents as
> >>>>>
> >>>>>      Detect paths that trigger erroneous or undefined behavior due to
> >>>>>      dereferencing a null pointer. Isolate those paths from the
> >>>>> main control
> >>>>>      flow and turn the statement with erroneous or undefined
> >>>>> behavior into a
> >>>>>      trap. This flag is enabled by default at -O2 and higher.
> >>>>>
> >>>>> This results in a sizable number of previously working embedded
> >>>>> programs mysteriously
> >>>>> crashing when recompiled under gcc 4.9.  The problem is that embedded
> >>>>> programs will often have ram starting at address zero (think
> >>>>> hardware-defined
> >>>>> interrupt vectors, say) which gets initialized by code which the
> >>>>> -fisolate-erroneous-paths-deference logic can recognize as reading
> >>>>> and/or
> >>>>> writing address zero.
> >>>> If you have some pages mapped at address 0, you really should
> >>>> compile your
> >>>> code with -fno-delete-null-pointer-checks, otherwise you can run
> >>>> into tons
> >>>> of other issues.
> >>> Hmmmm,  Passing the additional option in user code would be one thing,
> >>> but what about library code?  E.g., using memcpy (either explicitly or
> >>> implicitly for a structure copy)?
> >>>
> >>> It looks to me like cr16 and avr are currently the only architectures
> >>> that disable flag_delete_null_pointer_checks entirely, but I am sure
> >>> that this issue affects other embedded targets besides nios2, too.  E.g.
> >>> scanning Mentor's ARM board support library, I see a whole pile of
> >>> devices that have memory mapped at address zero (TI Stellaris/Tiva,
> >>> Energy Micro EFM32Gxxx,  Atmel AT91SAMxxx, ....).  Plus our simulator
> >>> BSPs assume a flat address space starting at address 0.
> >> I forwarded this to the RTEMS list and was promptly pointed to a patch
> >> on a Coldfire BSP where someone worked around this behavior.
> >>
> >> We are discussing how to deal with this. It is likely OK in user code but
> >> horrible in BSP and driver code. We don't have a solution ourselves. We
> >> just recognize it impacts a number of targets.
> >>
> >
> > My main concern is not knowing the trap has been added to the code. If I
> > could build an application and audit it somehow then I can manage it. We
> > have a similar issue with the possible use of FP registers being used in
> > general code (ISR save/restore trade off).
> >
> > Can the ELF be annotated in some GCC specific way that makes it to the
> > final executable to flag this is happening ? We can then create tools to
> > audit the executables.
> Not really, for a variety of reasons.

Is information on this reaching the pass-specific dumpfile?  I don't see
any explicit dumping in gimple-ssa-isolate-paths.c, but I guess that
insert_trap_and_remove_trailing_statements could log itself to the
dumpfile, or use the statistics framework (which itself also reaches a
dumpfile).

Assuming the info is reaching a dumpfile, could gcc have an option to
write its dumpfiles into a special ELF section in the .s, rather than to
disk?

Then (given a suitable new option to e.g. eu-readelf) you'd be able to
read the dumpfiles from a .o file, and (handwaving about linkage) from
an execuable or library.

Not that I'm volunteering...

> However, the compiler can do 
> better for warning about some of these kinds of things -- but we 
> certainly can't guarantee we catch all of them as there are cases where 
> the point where we determine a property (such as non-nullness) may be 
> very different from the point where we exploit that property.
> 
> I did propose some patches to improve the warnings back in the 4.9 time 
> frame, but they never got reviewed.  See BZ 16351.   We'll have to 
> revisit them during the next open development period.
> 
> Jeff


Reply via email to