Skip to content

Latest commit

 

History

History
50 lines (39 loc) · 2.63 KB

undefined_unspecified_implementation_defined.md

File metadata and controls

50 lines (39 loc) · 2.63 KB

In C++, the terms "undefined behavior," "unspecified behavior," and "implementation-defined behavior" refer to different ways the language standard treats certain situations or operations. Understanding these concepts is crucial for C++ developers, as they directly impact program reliability and portability.

Undefined Behavior

Definition: If code executes an operation that has undefined behavior, the C++ standard imposes no requirements on the implementation. Anything can happen, from the program crashing to producing incorrect results, or even, in theory, making demons fly out of your nose!

Example: Dereferencing a null pointer.

int *ptr = nullptr;
int value = *ptr;  // Undefined behavior

Here, dereferencing ptr which is null, leads to undefined behavior. The program might crash, continue with a garbage value, or behave erratically.

Unspecified Behavior

Definition: In situations where unspecified behavior occurs, the C++ standard allows for a range of potential behaviors, but it doesn't define exactly which one will occur. Different compilers or runs of the program might result in different behaviors, but all within a specified range.

Example: Order of evaluation of function arguments.

int foo() {
    // Some code
}

int bar() {
    // Some code
}

int main() {
    int value = std::max(foo(), bar());  // Unspecified behavior
}

Here, whether foo() or bar() is called first is unspecified. Different compilers might evaluate them in different orders.

Implementation-Defined Behavior

Definition: This is a behavior where the C++ standard allows the compiler implementation to decide how to handle a situation, but unlike undefined behavior, the compiler's documentation must document how it handles these situations.

Example: Size of an int.

int main() {
    int size = sizeof(int);  // Implementation-defined behavior
}

The size of an int varies between different systems and compilers. It might be 4 bytes on one system and 8 bytes on another.

Key Takeaways

  • Undefined behavior: Anything can happen; avoid this in your code.
  • Unspecified behavior: A range of behaviors is possible; the exact outcome isn't defined.
  • Implementation-defined behavior: The compiler decides the behavior, but it must document its decision.

In practice, it's important for C++ programmers to understand these concepts to write portable and reliable code. Avoiding undefined behavior is particularly crucial, as it can lead to serious bugs and security vulnerabilities.

Refs: 1, 2