Was there a more fundamental problem in the assumptions of the code? The state of the operation is "success" (err==zero) until some step changes the state to "failure" (non-zero). The state should be assumed to be…
From a different point of view, part of the problem is the undefined state of the code at the "fail" label. Execution will arrive there somehow, but the 'how' is unclear. The word "fail" implies you should reach that…
What about these? - don't leave local variables uninitialized. - don't try to hand-optimize lines unnecessarily. - don't mix assignments into boolean expressions. (Which is really an unneeded optimization.)
At that point the variable 'err' is still zero (noErr). So the function returns noErr, the caller thinks everything is good, and the communication is allowed.
Even if there were braces, the bug would still exist if the extra goto was outside the braces. It might be more noticeable, but then, the original bug existed because no one noticed.
Was there a more fundamental problem in the assumptions of the code? The state of the operation is "success" (err==zero) until some step changes the state to "failure" (non-zero). The state should be assumed to be…
From a different point of view, part of the problem is the undefined state of the code at the "fail" label. Execution will arrive there somehow, but the 'how' is unclear. The word "fail" implies you should reach that…
What about these? - don't leave local variables uninitialized. - don't try to hand-optimize lines unnecessarily. - don't mix assignments into boolean expressions. (Which is really an unneeded optimization.)
At that point the variable 'err' is still zero (noErr). So the function returns noErr, the caller thinks everything is good, and the communication is allowed.
Even if there were braces, the bug would still exist if the extra goto was outside the braces. It might be more noticeable, but then, the original bug existed because no one noticed.