More dangerous UB handling of clang (compared to gcc)
Warner Losh
imp at bsdimp.com
Sun Mar 2 16:31:32 UTC 2014
On Mar 1, 2014, at 4:18 PM, Ahmed Charles <acharles at outlook.com> wrote:
> ----------------------------------------
>> Subject: Re: More dangerous UB handling of clang (compared to gcc)
>> From: bsdimp at gmail.com
>> Date: Fri, 28 Feb 2014 08:38:38 -0700
>> To: amdmi3 at amdmi3.ru
>> CC: freebsd-toolchain at FreeBSD.org
>>
>>
>> On Feb 28, 2014, at 8:06 AM, Dmitry Marakasov <amdmi3 at amdmi3.ru> wrote:
>>
>>> Hi!
>>>
>>> Another issue I wanted to mention: compared to gcc, clang handles
>>> some undefined behaviour cases more dangerously. It has the full
>>> right to do so as it's UB, however we may want to take extra steps
>>> to find and fix these cases.
>>
>> Except this is a flat out bug….
>>
>>> Example:
>>>
>>> --- ub.cc begins here ---
>>> #include <iostream>
>>>
>>> int func1() {
>>> std::cerr << "func1()\n";
>>> /* no return */
>>> }
>>>
>>> void func2() {
>>> std::cerr << "NEVER CALLED\n";
>>> }
>>>
>>> int main() {
>>> func1();
>>> return 0;
>>> }
>>> --- ub.cc ends here ---
>>>
>>> ---
>>> % g++46 -o ub ub.cc && ./ub
>>> func1()
>>> % g++46 -O2 -o ub ub.cc && ./ub
>>> func1()
>>> % clang++ -o ub ub.cc && ./ub
>>> ub.cc:6:1: warning: control reaches end of non-void function
>>> [-Wreturn-type]
>>> }
>>> ^
>>> 1 warning generated.
>>> func1()
>>> Illegal instruction
>>> % clang++ -O2 -o ub ub.cc && ./ub
>>> ub.cc:6:1: warning: control reaches end of non-void function
>>> [-Wreturn-type]
>>> }
>>> ^
>>> 1 warning generated.
>>> func1()
>>> NEVER CALLED
>>> Segmentation fault
>>> ---
>>>
>>> As you can see, while with gcc the function returns even if it has no
>>> return statement, with clang it either crashes or calls the following
>>> function. This may lead to new crashes and security problems after
>>> switching to clang (most likely in ports code of course).
>>
>> This is a flat out bug. When control reaches the end of a function, it must return, even if there’s no return statement. The value returned from func1() is, of course, undefined, but this is well defined behavior in the standard…
>>
>> I’d be very interested to see chapter and verse on this one...
>
> n3690: 6.6.3[stmt.return]/p2
>
> Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.
>
> C++ and C are distinctly different in this regard.
Seems like the ‘jump into the next function’ as a result of the core dump you put in being optimized away is a breathtakingly stupid, but allowed, undefined behavior. I mean, as stupid as forking rogue when #pragma is encountered. Better for that forced core dump to not be optimized away, or there be a return statement.
Hence my belief that the resolution is bogus.
>>> I wonder of we could make use of -Werror=return-type which makes the
>>> warning issued by clang here fatal, what do you think? If adding it to
>>> default CFLAGS/CXXFLAGS is not an option, we may at least have an
>>> extra `strict' pkg-fallout builder.
>>>
>>> Related clang bug: http://llvm.org/bugs/show_bug.cgi?id=18296 (resoleved
>>> as INVALID).
>>
>> I believe this resolution is, in fact, bogus. Sure, insert ud2, but also put a f’ing return in there.
>>
>> I know in C11,this id definitely the case:
>>
>> 6.9.1:
>> 12 If the } that terminates a function is reached, and the value of the function call is used by
>> the caller, the behavior is undefined.
>>
>> But the C++ standard is somewhat opaque on the topic, but none of the 56 instances of ‘undefined results’ in the standard appeared to apply.
>>
>>> I'm also positively sure that I've encountered another problematic
>>> UB case with another warning, but I don't remember which. Real
>>> list of useful Werror's may be quite big.
>>
>> Yea, this is a big deal. Sure, people shouldn’t do this, but this kind of undefined behavior is well outside the bounds of traditional compilers.
>>
>> Warner
>>
>>
>> _______________________________________________
>> freebsd-toolchain at freebsd.org mailing list
>> http://lists.freebsd.org/mailman/listinfo/freebsd-toolchain
>> To unsubscribe, send any mail to "freebsd-toolchain-unsubscribe at freebsd.org"
> _______________________________________________
> freebsd-toolchain at freebsd.org mailing list
> http://lists.freebsd.org/mailman/listinfo/freebsd-toolchain
> To unsubscribe, send any mail to "freebsd-toolchain-unsubscribe at freebsd.org"
More information about the freebsd-toolchain
mailing list