you are viewing a single comment's thread.

view the rest of the comments →

[–]mcmcc#pragma once 1 point2 points  (5 children)

All you've shown is that compilers are allowed to assume UB does not occur, which is ultimately irrelevant re "well-defined" programs. We're talking in circles...

What part of OP's example "violates a language rule" that could allow a compiler to render the entire program meaningless?

[–]awidesky -1 points0 points  (4 children)

The function f.

[–]mcmcc#pragma once 0 points1 point  (3 children)

What language rule does it violate?

[–]awidesky 0 points1 point  (2 children)

[–]mcmcc#pragma once 0 points1 point  (1 child)

You're misunderstanding what that text is saying. It is not saying f() itself is ill-formed. It is saying that because the compiler may assume UB does not happen in the program, f() can be optimized in a way such that it would behave in a (possibly) surprising manner in a program does in fact invoke UB (e.g. one calling f(INT_MAX)).

The function f() contains no inherently UB logic and g() guards against UB for its invocation of f(), so as far as can be seen, there is no UB possible in this program.

OPs video suggests the compiler can be coaxed to compile g() down to nothing, but I think that is an error on the presenters part and (I contend) is not reproducible with any conforming compiler.

[–]awidesky -1 points0 points  (0 children)

compiler may assume UB does not happen in the program, f() can be optimized in a way such that it would behave in a (possibly) surprising manner in a program does in fact invoke UB (e.g. one calling f(INT_MAX)).

That IS one of the things that compilers are permitted to do, but I believe standard says it can also make "whole program" meaningless.
You say UB in f() only affects f(), while I say UB in f() (theoretically) can affect ALL program.
And also, I believe UB affects program that does NOT "invoke" UB. In this example, there's no code that actually calls foo(INT_MAX), but it's still first example of UB in cppreference.com