https://gcc.gnu.org/bugzilla/show_bug.cgi?id=115770

Manuel Köppen <manuel.koeppen at gmx dot de> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
         Resolution|INVALID                     |FIXED

--- Comment #3 from Manuel Köppen <manuel.koeppen at gmx dot de> ---
I checked and...

You are right, using -fno-delete-null-pointer-checks "fixes" the problem.
Using a different address also fixes the problem, but I cannot do that, because
I have to read at 0.

I think this is at least not obvious.
The compiler is not deleting null-pointer-checks in this case, but rather
deleting my volatile asm block and replacing it with undefined code.

Is it, that without the option no-delete-null-pointer-checks the compiler
thinks, I am coding something with undefined behaviour and so it takes the
freedom to present something that crashes as undefined behaviour?

What I don't get is how this is only done at optimization level 2 and there is
absolutely no warning whatsoever, just the code that uses the seemingly
undefined value replaced by a crashing instruction? After all, the
dereferencing of NULL ( e.g. ldr r0, [r4] ) is left in, only the use of the
value is changed. I find this behaviour pretty strange. From the name of the
option I never would have guessed that this is even influencing this code
generation here, because there are no null-pointer checks to begin with.

So you're saying this is intentional and I just have to add
-fno-delete-null-pointer-checks to all microcontroller firmawares where 0 is a
valid address?

Reply via email to