From the Yellowpaper,
o, the resultant byte sequence from the execution of the
initialisation code, specifies the final body code for the
If the initialization function doesn't return the body code, that is the contract code, the contract exists but with no code, it's a zombie. Since there is no code, nothing can be done with it.
Before Homestead, if there is not enough
gas to pay c, an account at the new contract’s address is
created, along with all the initialisation side-effects, and
the value is transferred, but no contract code is deployed.
Before Homestead, if the execution stopped because there is was not enough gas, then the contract was created but since it didn't finish execution there was no code associated, therefore no way to interact with the contract.
The same can happen with a STOP code, thrown by an exception during execution.