You are getting these issues because you have ignored the fact that Ethereum has certain pre-compiled contracts. One of those contracts is the ecrecover contract.
And the fail() function is failing because it is out of gas. The fallback execution of ecrecover requires more than 2300 gas and it must be forwarded by the transfer method. For this reason, the function is not executing.
And finally, you must know that the 0*0 address is not a special contract. So, it could be resolved with a regular transfer call.