#include // The comparisons use SUB instructions, and this can result in having a // (nonptr - ptr) situation legitimately; at one point I was flagging // errors when that happened. int main(void) { char* buf = malloc(sizeof(char) * 6); // Known zero non-pointer char* nz = (char*)((long)buf^(long)buf); // known non-pointer // Unknown zero nonptr; make them zero but unknown char* unz; ((char*)&unz)[0] = '\0'; ((char*)&unz)[1] = '\0'; ((char*)&unz)[2] = '\0'; ((char*)&unz)[3] = '\0'; if (buf == nz) return 1; if (nz == buf) return 1; // --> n - p, but legitimate if (buf == unz) return 1; if (unz == buf) return 1; return 0; }