https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104690

            Bug ID: 104690
           Summary: UBSan does not detect undefined behavior on function
                    without a specified return value
           Product: gcc
           Version: 12.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: sanitizer
          Assignee: unassigned at gcc dot gnu.org
          Reporter: vincent-gcc at vinc17 dot net
                CC: dodji at gcc dot gnu.org, dvyukov at gcc dot gnu.org,
                    jakub at gcc dot gnu.org, kcc at gcc dot gnu.org, marxin at 
gcc dot gnu.org
  Target Milestone: ---

Consider the following C code:

#include <stdio.h>
static int f (void) { }
int main (void)
{
  printf ("%d\n", f ());
  return 0;
}

According to ISO C17 6.9.1p12, the behavior is undefined: "If the } that
terminates a function is reached, and the value of the function call is used by
the caller, the behavior is undefined."

I don't know what "used by the caller" means exactly, but in the above code,
the value is clearly used, since it is printed. However, when one compiles it
with "gcc -std=c17 -fsanitize=undefined" (with or without -O), running the code
does not trigger an error. (Well, I hope that UBSan doesn't think that the
value isn't necessarily used because the printf may fail before printing the
value.)

Tested with gcc-12 (Debian 12-20220222-1) 12.0.1 20220222 (experimental)
[master r12-7325-g2f59f067610] and some earlier versions.

Note: with g++, one gets a "runtime error: execution reached the end of a
value-returning function without returning a value" as expected.

Reply via email to