Does "undefined behaviour" extend to compile
We've all heard the warnings that if you invoke undefined behaviour in C or C++, anything at all can happen.
Is this limited to any runtime behaviour at all, or does this also include any compile-time behaviour? In particular, is a compiler, upon encountering a construct that invokes undefined behaviour, allowed to reject the code (in the absence of other requirements in the standard to do so), or even to crash?
" You're all ignoring the actual definition and focusing on the note, The standard imposes no requirements. " - @R.MartinhoFernandes
The message above was written by the given user in Lounge<C++> and makes a very valid argument; the standard doesn't impose any requirements when it comes to code that invokes undefined behavior.
! ! !
undefined-behavior stretches even to the far corner of parsing the input data (ie. code) by the compiler, as verified with the below quotations from both the C++11 and C99 standards.
To answer your question with one sentence ;
"in a documented manner characteristic of the environment" is a kind of odd statement, you could pretty much write a compiler documenting that it might crash upon any given code (that's invalid) to grant it the possibility to crash whenever it wants to.
1. quote from the C++11/C99 standards
c++11
1.3.24 [defns.undefined]
Undefined behavior; behavior for which this International Standard imposes no requirements
[ Note:
Undefined behavior may be expected when this International Standard omits any explicit definition of behavior or when a program uses an erroneous construct or erroneous data.
Permissible undefined behavior ranges from ignoring the situation completely with unpredictable results , to behaving during translation or program execution in a documented manner characteristic of the environment (with or without the issuance of a diagnostic message), to terminating a translation or execution (with the issuance of a diagnostic message).
Many erroneous program constructs do not engender undefined behavior; they are required to be diagnosed.
— end note ]
c99
3.4.3 - Undefined Behavior
behavior, upon use of a nonportable or erroneous program construct or of erroneous data, for which this >International Standard imposes no requirements
NOTE Possible undefined behavior ranges from ignoring the situation completely with unpredictable results , to behaving during translation or program execution in a documented manner characteristic of the environment ( with or without the issuance of a diagnostic message ), to terminating a translation or execution (with the issuance of a diagnostic message).
If the behavior is undefined, the compiler could accept it, reject it, issue a warning, and according to the standard, even crash, hang or install a virus on your computer.
In practice, that does not mean if you are writing a compiler you should do those things on purpose, but you could, for example, use an algorithm which works on defined cases and crashes or hangs on undefined ones, if the performance advantage justifies it.
Still, a reputable compiler would avoid that, or at least have it very well documented.
It is not limited to run-time behavior. Per ISO/IEC 14882, first edition, 1998-09-01, 1.3.12, in a note (so non-normative): “permissible undefined behavior ranges from... to behaving during translation or programming execution in a documented manner characteristic of the environment”. In other words, the standard says the implementation may do anything the operating system (or other environment) permits, provided it is documented.
链接地址: http://www.djcxy.com/p/79922.html上一篇: 如何检测整数溢出?
下一篇: “未定义的行为”扩展到编译