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

            Bug ID: 81598
           Summary: -fsanitize=enum does not detect range violation
           Product: gcc
           Version: 7.1.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: sanitizer
          Assignee: unassigned at gcc dot gnu.org
          Reporter: tim.ruehsen at gmx dot de
                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: ---

g++'s (nor gcc's) -fsanitize=enum doesn't detect enum range violation.
The documentation says that it does.


Having this little C/C++ code (enum_undef.cc):
#include <stdio.h>

typedef enum {
        FLAG1 = (1 << 0),
        FLAG2 = (1 << 1),
} flag_t;

int main(void)
{
        int x = 5;
        flag_t flags = (flag_t) x;

        printf("flags = %X\n", flags);

        return 0;
}


$ g++-7 -fsanitize=undefined -fsanitize=enum enum_undef.cc
$ $ ./a.out 
flags = 5


In comparison, clang detects this kind of violation:
$ clang++-5.0 -fsanitize=undefined -fsanitize=enum enum_undef.cc
$ ./a.out 
enum_undef.cc:13:25: runtime error: load of value 5, which is not a valid value
for type 'flag_t'
flags = 5


Adding -fno-sanitize-recover doesn't make a difference for gcc/g++.

Reply via email to