Hi. There's one false positive I've noticed:
$ cat /tmp/ptr-cmp.c int __attribute__((noinline)) foo(char *p1, char *p2) { if (p2 != 0 && p1 > p2) return 0; return 1; } int main(int argc, char **argv) { return foo(argv[0], 0); } $ gcc /tmp/ptr-cmp.c -fsanitize=address,pointer-compare -O2 -fdump-tree-asan1=/dev/stdout && ./a.out __attribute__((noinline)) foo (char * p1, char * p2) { _Bool _1; _Bool _2; _Bool _3; _Bool _8; int _9; <bb 2> [100.00%] [count: INV]: _1 = p2_5(D) != 0B; __builtin___sanitizer_ptr_cmp (p2_5(D), p1_6(D)); _2 = p2_5(D) < p1_6(D); _3 = _1 & _2; _8 = ~_3; _9 = (int) _8; return _9; } ==31859==ERROR: AddressSanitizer: invalid-pointer-pair: 0x000000000000 0x7ffccadb4ff9 #0 0x400756 in foo (/home/marxin/Programming/postgres/src/pl/plpgsql/src/a.out+0x400756) #1 0x1513cde71f49 in __libc_start_main (/lib64/libc.so.6+0x20f49) #2 0x400689 in _start (/home/marxin/Programming/postgres/src/pl/plpgsql/src/a.out+0x400689) As I've been reading dump files, it's already in gimple dump: cat ptr-cmp.c.004t.gimple __attribute__((noinline)) foo (char * p1, char * p2) { int D.2181; _1 = p2 != 0B; _2 = p1 > p2; _3 = _1 & _2; if (_3 != 0) goto <D.2179>; else goto <D.2180>; ... Thoughts? Martin