On Tuesday, 16 July 2013 at 01:13:15 UTC, H. S. Teoh wrote:
On Mon, Jul 15, 2013 at 08:59:44PM -0400, Jonathan M Davis wrote:
On Monday, July 15, 2013 14:48:08 Manfred Nowak wrote:
> Jonathan M Davis wrote:
> > gotos in such a context seem like a bit
> > of a nightmare to me though.
> > I did realize this nightmare. Therefore the assurance in the > docs > is probably true only in the absence within the scope of at > least
> gotos to targets within the scope.

Well, I'd have to study exactly how goto works to say how exactly it would interact with stuff like try-catch. I've pretty much only used goto with case statements and loops and haven't spent the time trying to sort out all of its idiosyncracies. I guess that I should add that
to be my todo list.
[...]

My understanding is that goto translates directly to a jump in assembly, so jumping in/out of blocks with declarations or stuff that needs cleanups should immediately raise red flags. Of course, the compiler may do something intelligent by inserting implicit stack pointer adjustments and/or cleanup blocks, but I wouldn't count on it unless the language
spec explicitly requires so.


T

That's wrong. That's "longjmp", which does a raw ASM jump.

C's goto correctly handles stack decrement if the jump would make you leave a scope (destroying a variable), and make a variable disappear. goto's aren't allowed to jump over declarations (unless they "skip" a scope entirelly). Some implementations allow it, but I have no idea how they non-POD type construction :S but stack pointer is always correctly handled.

With C++'s destructors, goto has also been "improved" to guarantee that the destructor is called when a goto would make a variable leave a scope. In C++, I don't think it is possible to "leak" a stack variable's destructor, short of doing a longjmp.

Long story short, in C, goto always perfectly safe (AFAIK). In C++, it depends on what the compiler will allow you to to do, depending on its "features". If it respects "strict ANSI", though, then you shouldn't be able to go wrong.

--------

Related: I use goto fairly often, but I've yet to find a use-case for it outside of loop "improvement", or goto end cleanup. In both these cases, scope blocks should not be a problem.

Reply via email to