Does “undefined behaviour” extend to compile-time?

前端 未结 5 1994
梦毁少年i
梦毁少年i 2020-12-03 10:56

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 ru

5条回答
  •  渐次进展
    2020-12-03 11:21

    "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 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;

    • undefined behavior is not limited to runtime execution, and it's permissible to crash during compilation "in a documented manner characteristic of the environment" 1

    "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

    1. behavior, upon use of a nonportable or erroneous program construct or of erroneous data, for which this >International Standard imposes no requirements

    2. 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).

提交回复
热议问题