-1

Why p && *p prevents null pointer dereference? How can I use the expression to prevent the dereference?

cellka
  • 129
  • 1
  • 8
  • What do you mean by "How can I use the expression to prevent the dereference?" ? Seems `p && *p` itself is an arbitrary example of how you might be able to prevent a null pointer dereference. – George Jan 06 '19 at 05:42
  • As I see, it's a condition but I cannot realize in why it should be true in case `p!=NULL` – cellka Jan 06 '19 at 05:45
  • Oh, probably I forgot that in C any Nonzero value is true in Boolean logic – cellka Jan 06 '19 at 05:49

2 Answers2

3

From C Standard#6.3.2.3p3

3 An integer constant expression with the value 0, or such an expression cast to type void *, is called a null pointer constant.66) If a null pointer constant is converted to a pointer type, the resulting pointer, called a null pointer, is guaranteed to compare unequal to a pointer to any object or function.
...
...

Footnotes

66) The macro NULL is defined in (and other headers) as a null pointer constant; see 7.19.

Logical AND operation expr1 && expr2 employs short-circuiting behavior. With logical short-circuiting, the second operand, expr2, is evaluated only when the result is not fully determined by the first operand, expr1. That is, expr2 is not evaluated if expr1 is logical 0 (false).

If p is a NULL pointer then it will be evaluated as 0 and due to short-circuiting behavior of && operator *p will not be evaluated. Thats how p && *p prevents null pointer dereference.

H.S.
  • 11,654
  • 2
  • 15
  • 32
2

Here

    p    &&   *p   
    |          |
   first     second 
   operand   operand

first p is performed that means if p is NULL then it won't do *p as logical AND && operator property is that if first operand is false then don't check/evaluate second operand, hence it prevents null pointer dereference.

The fact that p = NULL means p is pointing to NULL hence one shouldn't do *p as it causes segmentation fault. For e.g

int *p = NULL;
if (!p ) {
  fprintf(stderr,"p is NULL, can't do further opertaion with p\n");
  exit(0);
}
else {
   /* further processing with p i.e p is valid and *p is not zero */
}
Achal
  • 11,821
  • 2
  • 15
  • 37
  • Well, if `p = NULL` then we go into else statement with NULL pointer, so no prevention – cellka Jan 06 '19 at 12:12
  • Yes true . I put the check reversely. My bad. I will edit as soon I have my system. – Achal Jan 06 '19 at 12:58
  • I was playing around with that example and I noticed that if we set `int x = 0; int *p = &x;` then the code considers p as null-pointer. So, if we point to a variable the value of which is 0 at the moment, then we cannot work with the code further – cellka Jan 06 '19 at 13:30