Undefined Behavior in C and C++

Consider the following C/C++ programs and try to guess the output?

filter_none

edit
close

play_arrow

link
brightness_4
code

// Program 1 (Divide by 0)
int main()
{
    int x = 25, y = 0;
    int z = x / y;
    printf("Hello World!");
    return 0;
}

chevron_right


filter_none

edit
close

play_arrow

link
brightness_4
code

// Program 2 (Uninitialized variables)
int main()
{
    bool val;
    if (val)
        printf("TRUE");
    else
        printf("FALSE");
}

chevron_right


filter_none

edit
close

play_arrow

link
brightness_4
code

// Program 3 (Accessing value of NULL
// pointer)
int main()
{
   int *ptr = NULL;
   printf("%d", *ptr);
   return 0;
}

chevron_right


filter_none

edit
close

play_arrow

link
brightness_4
code

// Program 4 (Accessing out of bound)
int main()
{
   int arr[5];
  
   // We access arr[5] in last iteration.
   for (int i=0; i<=5; i++)
      printf("%d ", arr[i]);
}

chevron_right


filter_none

edit
close

play_arrow

link
brightness_4
code

// Program 5 (Going beyond limit of
// signed int)
int main()
{
   int x = INT_MAX;
   printf("%d", x+1);
   return 0;
}

chevron_right


filter_none

edit
close

play_arrow

link
brightness_4
code

// Program 6 (Trying to modify a string
// literal)
int main()
{
   char *s = "geeksforgeeks";
   s[0] = 'e';
   return 0;
}

chevron_right


filter_none

edit
close

play_arrow

link
brightness_4
code

// Program 7 (Modifying a variable
// multiple times before a defined
// sequence point)
#include <stdio.h>
int main()
{
   int i = 8;
   int p = i++*i++;
   printf("%d\n", p);
}

chevron_right


Output of all of the above programs is unpredictable (or undefined). The compilers (implementing C/C++ standard) are free to do anything as these are undefined by the C and C++ standards.
Language like Java traps error as soon as they are found but language like C and C++ in few cases keep on executing the code in a silent but faulty manner which may result in unpredictable results. The program can crash with any type of error messages, or it can unknowingly corrupt the data which is a grave issue to deal with.

Importance of knowing about Undefined Behaviour
If a user starts learning in C/C++ environment and is unclear with the concept of undefined behavior then that can bring plenty of problems in the future like while debugging someone else code might be actually difficult in tracing the root to the undefined error.

Risks and Disadvantages of Undefined Behavior
The programmers sometimes rely on a particular implementation (or compiler) of undefined behavior which may cause problems when compiler is changed/upgraded. For example last program produces 72 as output in most of the compilers, but implementing a software based on this assumption is not a good idea.
Undefined behaviors may also cause security vulnerabilities, especially due the cases when array out of bound is not checked (causes buffer overflow attack).

Advantages of Undefined Behavior
C and C++ have undefined behaviors because it allows compilers to avoid lots of checks. Suppose a set of code with greater performing array need not keep a look at the bounds, which avoid the needs for complex optimization pass to check such conditions outside loops. The tightly bound loops an speed up the program from thirty to fifty percent when it gains an advantage of the undefined nature of signed overflow, which is generally offered by the C compiler.
We also have another advantage of this as it allows us to store a variable’s value in a processor register and manipulate it over the time that is larger than the variable in the source code. It also helps in wrap-around then compile-time checks which would not be possible without the greater knowledge of the undefined behavior in C/C++ compiler.

More examples of undefined behavior

  1. Sequence Points in C | Set 1
  2. “delete this” in C++
  3. Passing NULL to printf in C
  4. Accessing array out of bounds in C/C++
  5. Use of realloc()
  6. Execution of printf with ++ operatorsVirtual destruction using shared_ptr in C++
  7. Virtual Destructor

References:



My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.




Article Tags :
Practice Tags :


2


Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.