It simply try to trap internal errors causing invalid parameters loading on the stack. The “null pointer” reference is a frequent consequence of stack or dereference problems. Nothing guarantees you that your internal error will result in a null pointer call, but it is quite frequent because uninitialized memory is often zeroed.
That can even be “at least let’s try to avoid that some unpredictable internal error burns coins, please, and if you catch any null pointer around here, quit and revert”
In other words if on one side it is not given that any internal error bring you to a null pointer temptative of use, on the other side it is given that if you have a null pointer here, something is wrong.
Someone is concerning about the fact that the msg.sender address is obtained directly from a EVM call code, namely 0x33, and that being so it cannot be returned wrong.
In order to explain it better: Let’s say I call the 0x33 EVM callcode “CALLER” in order to obtain msg.sender address. Where do I push it in order to compare it with zero? If you answer you will find a first possible area of local corruption, that can be corrupted both writing wrong data in it and in the pointers used to manage it locally: the stack.
if your system is corrupted you can be writing, for instance, the 0x33 return data in some no safe area, where no memory do exist or where it is not writable by your process and you will read it back as 0x0 or other crazy things if you are not able to revert for this. And if the system is corrupted the revert propagation is not guaranteed.
Btw: go on etherscan and look at 0x000...000 address. Is it a valid address to you? Did you think it has been filled with so much ether for a precise willing or for users/code errors?
Furthermore (from a comment):
The stack is addressed by the stackpointer, that is a local memory address maintained in a “register”. When you push or pop the “cpu” reference that and increment it in order to point to next slot, decrement if pop.If you have a corrupted stackpointer you will push the value somewhere not known, and when you will pop you will read that somewhere memory location. If you encounter standard ram, nothing happens in that instant... If you think to write (push) where no memory exists or where you are not allowed to read or write, you will read back (pop) 0x0. Ever. This is a canonical example.