Even just reading the value of a pointer that was freed (i.e. without trying to dereference the pointer) is undefined behavior(UB), e.g.
char *p = malloc(5);
free(p);
if (p == NULL) /* NOTE: even without dereferencing, this may have UB */
{
}
Quoting ISO/IEC 9899:2011, section 6.2.4 §2:
[…] The value of a pointer becomes indeterminate when the object it points to (or just past) reaches the end of its lifetime.
The use of indeterminate memory for anything, including apparently harmless comparison or arithmetic, can have undefined behavior if the value can be a trap representation for the type.