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

            Bug ID: 82079
           Summary: missing pointer overflow detection with
                    -fsanitize=pointer-overflow
           Product: gcc
           Version: 8.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: sanitizer
          Assignee: unassigned at gcc dot gnu.org
          Reporter: msebor at gcc dot gnu.org
                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: ---

I've been experimenting with the new -fsanitize=pointer-overflow option to
better understand what it detects.  For example, I would expect both instances
of overflow/wrapping in the following test case to trigger an error at runtime
but only the second one does.  So either I don't understand what problems the
option is supposed to detect or it doesn't quite work.

$ cat t.c && /opt/notnfs/msebor/build/gcc-git-ubsan/gcc/xgcc -B
/opt/notnfs/msebor/build/gcc-git-ubsan/gcc -O2 -Wall -fsanitize=undefined
-fsanitize=pointer-overflow -L
/opt/notnfs/msebor/build/gcc-git-ubsan/x86_64-pc-linux-gnu/libsanitizer/ubsan/.libs
t.c &&
LD_LIBRARY_PATH=/opt/notnfs/msebor/build/gcc-git-ubsan/x86_64-pc-linux-gnu/libsanitizer/ubsan/.libs
./a.out
void __attribute__ ((noclone, noinline))
f (const char *s)
{
  volatile __SIZE_TYPE__ n = __SIZE_MAX__ - (__SIZE_TYPE__)s + 2;

  const char *p = s + n;

  __builtin_printf ("%p + %zu = %p\n", s, n, p);
}

int main (void)
{
  const char a[] = "123";
  f (a);                         // overflow not detected

  f ((char*)__SIZE_MAX__ - 1);   // overflow detected
}
0x7fff4e8440dc + 18446603339198873381 = 0x1
t.c:6:15: runtime error: pointer index expression with base 0xfffffffffffffffe
overflowed to 0x000000000001
0xfffffffffffffffe + 3 = 0x1

Reply via email to