]> git.sur5r.net Git - cc65/commitdiff
Proper warnings for "risky" gotos.
authorlaubzega <mileksmyk@gmail.com>
Sat, 29 Sep 2018 05:11:09 +0000 (22:11 -0700)
committerOliver Schmidt <ol.sc@web.de>
Tue, 2 Oct 2018 16:49:53 +0000 (18:49 +0200)
src/cc65/function.c
src/cc65/function.h
src/cc65/locals.c
src/cc65/stmt.c
src/cc65/symentry.c
src/cc65/symentry.h
src/cc65/symtab.c
test/misc/Makefile
test/misc/goto.c [new file with mode: 0644]
test/misc/goto.ref [new file with mode: 0644]

index 96b3d6c750b977916b83fde4c1402bdb9c583185..1d63d55c54feb5a0a9182c2d1bd22de4569a0756 100644 (file)
@@ -87,7 +87,6 @@ static Function* NewFunction (struct SymEntry* Sym)
     F->TopLevelSP       = 0;
     F->RegOffs          = RegisterSpace;
     F->Flags            = IsTypeVoid (F->ReturnType) ? FF_VOID_RETURN : FF_NONE;
-    F->LocalsBlockCount = 0;
 
     InitCollection (&F->LocalsBlockStack);
 
@@ -524,6 +523,8 @@ void NewFunc (SymEntry* Func)
 
     /* Need a starting curly brace */
     ConsumeLCurly ();
+
+    /* Make sure there is always something on the stack of local variable blocks */
     CollAppend (&CurrentFunc->LocalsBlockStack, 0);
 
     /* Parse local variable declarations if any */
index 5c58220451dc053a36cc4fb91d4831db3b9d0ff2..0954322ace2f0df06822034e614c9dbe11deb208 100644 (file)
@@ -61,7 +61,6 @@ struct Function {
     int                 TopLevelSP;       /* SP at function top level */
     unsigned            RegOffs;          /* Register variable space offset */
     funcflags_t         Flags;            /* Function flags */
-    long                LocalsBlockCount; /* Number of blocks with local vars */
     Collection          LocalsBlockStack; /* Stack of blocks with local vars */
 };
 
index 20d370c46207780b0a2b895d47e802a26ba43b53..d3d73d1979936e8215e200251652a37b38912637 100644 (file)
@@ -52,6 +52,7 @@
 #include "standard.h"
 #include "symtab.h"
 #include "typeconv.h"
+#include "input.h"
 
 
 
@@ -270,6 +271,12 @@ static void ParseAutoDecl (Declaration* Decl)
             /* Mark the variable as referenced */
             Sym->Flags |= SC_REF;
 
+            /* Make note of auto variables initialized in current block.
+               We abuse the Collection somewhat by using it to store line
+               numbers. */
+            CollReplace (&CurrentFunc->LocalsBlockStack, (void *)(long)GetCurrentLine (),
+                CollCount (&CurrentFunc->LocalsBlockStack) - 1);
+
         } else {
             /* Non-initialized local variable. Just keep track of
             ** the space needed.
@@ -489,6 +496,9 @@ void DeclareLocals (void)
     /* Remember the current stack pointer */
     int InitialStack = StackPtr;
 
+    /* A place to store info about potential initializations of auto variables */
+    CollAppend (&CurrentFunc->LocalsBlockStack, 0);
+
     /* Loop until we don't find any more variables */
     while (1) {
 
@@ -538,10 +548,9 @@ void DeclareLocals (void)
     /* Be sure to allocate any reserved space for locals */
     F_AllocLocalSpace (CurrentFunc);
 
-    if (InitialStack != StackPtr) {
-        ++CurrentFunc->LocalsBlockCount;
-        /* Is it ok to abuse Collection in this way? */
-        CollAppend (&CurrentFunc->LocalsBlockStack, (void *)CurrentFunc->LocalsBlockCount);
+    /* No auto variables were inited. No new block on the stack then. */
+    if (CollLast (&CurrentFunc->LocalsBlockStack) == NULL) {
+        CollPop (&CurrentFunc->LocalsBlockStack);
     }
 
     /* In case we've allocated local variables in this block, emit a call to
index b766ec044e48e952a491208e483197fa300d57f5..0c891c386a5501f318f455547c263817557b0a91 100644 (file)
@@ -513,6 +513,7 @@ static int CompoundStatement (void)
 
     /* Remember the stack at block entry */
     int OldStack = StackPtr;
+    long OldBlockStackSize = CollCount (&CurrentFunc->LocalsBlockStack);
 
     /* Enter a new lexical level */
     EnterBlockLevel ();
@@ -535,7 +536,9 @@ static int CompoundStatement (void)
         g_space (StackPtr - OldStack);
     }
 
-    if (OldStack != StackPtr) {
+    /* If the segment had autoinited variables, let's pop it of a stack
+    of such blocks. */
+    if (OldBlockStackSize != CollCount (&CurrentFunc->LocalsBlockStack)) {
         CollPop (&CurrentFunc->LocalsBlockStack);
     }
 
index f78c5da8047fe96e505f3bec7ddeaee63d2de1ce..18cc026ea6b4ec9e250bb16fd6c31c8fd475541a 100644 (file)
@@ -90,7 +90,7 @@ void FreeSymEntry (SymEntry* E)
 
     if (E->Flags & SC_LABEL) {
         for (i = 0; i < CollCount (E->V.L.DefsOrRefs); i++) {
-            xfree (CollAt(E->V.L.DefsOrRefs, i));
+            xfree (CollAt (E->V.L.DefsOrRefs, i));
         }
 
         DoneCollection (E->V.L.DefsOrRefs);
index 03a63a7d2cca6dc9b6a4cb51eeb5985ea4c444ec..2dc731f35f3b4f940f903faed9d81864ef9499d8 100644 (file)
@@ -105,7 +105,7 @@ struct LiteralPool;
 typedef struct DefOrRef DefOrRef;
 struct DefOrRef {
     unsigned            Line;
-    long                LocalsBlockNum;
+    long                LocalsBlockId;
     unsigned            Flags;
     int                 StackPtr;
     unsigned            Depth;
index f7fb07f61dae2e9f542fa4015c63c2dad915d80c..5ca2d496765ca1b6511d5c7207bf679b00ffa2ea 100644 (file)
@@ -668,7 +668,7 @@ DefOrRef* AddDefOrRef(SymEntry* E, unsigned Flags)
     DOR = xmalloc (sizeof (DefOrRef));
     CollAppend (E->V.L.DefsOrRefs, DOR);
     DOR->Line = GetCurrentLine ();
-    DOR->LocalsBlockNum = (long)CollLast (&CurrentFunc->LocalsBlockStack);
+    DOR->LocalsBlockId = (long)CollLast (&CurrentFunc->LocalsBlockStack);
     DOR->Flags = Flags;
     DOR->StackPtr = StackPtr;
     DOR->Depth = CollCount (&CurrentFunc->LocalsBlockStack);
@@ -677,12 +677,13 @@ DefOrRef* AddDefOrRef(SymEntry* E, unsigned Flags)
     return DOR;
 }
 
-
 SymEntry* AddLabelSym (const char* Name, unsigned Flags)
 /* Add a goto label to the label table */
 {
     unsigned i;
     DefOrRef *DOR, *NewDOR;
+    /* We juggle it so much that a shortcut will help with clarity */
+    Collection *AIC = &CurrentFunc->LocalsBlockStack;
 
     /* Do we have an entry with this name already? */
     SymEntry* Entry = FindSymInTable (LabelTab, Name, HashStr (Name));
@@ -700,35 +701,40 @@ SymEntry* AddLabelSym (const char* Name, unsigned Flags)
         for (i = 0; i < CollCount (Entry->V.L.DefsOrRefs); i++) {
             DOR = CollAt (Entry->V.L.DefsOrRefs, i);
 
-            if((DOR->Flags & SC_DEF) && (Flags & SC_REF)) {
+            if ((DOR->Flags & SC_DEF) && (Flags & SC_REF)) {
                 /* We're processing a goto and here is its destination label.
                    This means the difference between SP values is already known,
                    so we simply emit the SP adjustment code. */
-                if(StackPtr != DOR->StackPtr)
+                if (StackPtr != DOR->StackPtr) {
                     g_space (StackPtr - DOR->StackPtr);
+                }
 
-                /* Are we jumping into same or deeper nesting region? That's risky,
-                   so let's emit a warning. */
-                if (CollCount (&CurrentFunc->LocalsBlockStack) <= DOR->Depth &&
-                    DOR->LocalsBlockNum != (long)CollLast (&CurrentFunc->LocalsBlockStack)) {
-                    Warning ("Goto from line %d to label \'%s\' can result in a "
-                        "trashed stack", DOR->Line, Name);
+                /* Are we jumping into a block with initalization of an object that
+                   has automatic storage duration? Let's emit a warning. */
+                if ((long)CollLast (AIC) != DOR->LocalsBlockId &&
+                    (CollCount (AIC) < DOR->Depth ||
+                    (long)CollAt (AIC, DOR->Depth - 1) != DOR->LocalsBlockId)) {
+                    Warning ("Goto at line %d to label %s jumps into a block with "
+                    "initialization of an object that has automatic storage duration.",
+                    GetCurrentLine (), Name);
                 }
             }
 
-            if((DOR->Flags & SC_REF) && (Flags & SC_DEF)) {
+
+            if ((DOR->Flags & SC_REF) && (Flags & SC_DEF)) {
                 /* We're processing a label, let's update all gotos encountered
                    so far */
                 g_defdatalabel (DOR->LateSP_Label);
                 g_defdata (CF_CONST | CF_INT, StackPtr - DOR->StackPtr, 0);
 
-                /* Are we jumping into same or deeper nesting region? That's risky,
-                   so let's emit a warning. */
-                if (CollCount (&CurrentFunc->LocalsBlockStack) >= DOR->Depth &&
-                    DOR->LocalsBlockNum != (long)CollLast (&CurrentFunc->LocalsBlockStack)) {
-                    Warning ("Goto from line %d to label \'%s\' can result in a "
-                        "trashed stack", DOR->Line, Name);
-                }
+                /* Are we jumping into a block with initalization of an object that
+                   has automatic storage duration? Let's emit a warning. */
+                if ((long)CollLast (AIC) != DOR->LocalsBlockId &&
+                    (CollCount (AIC) >= DOR->Depth ||
+                    (long)CollLast (AIC) >= DOR->Line))
+                    Warning ("Goto at line %d to label %s jumps into a block with "
+                    "initialization of an object that has automatic storage duration.",
+                    DOR->Line, Name);
              }
 
         }
index 330c9d5004e38319ab6d515e017736ed810ef400..ad39176bdbd21ddc873a8adbe09f87308bbf9080 100644 (file)
@@ -72,6 +72,11 @@ $(WORKDIR)/limits.$1.$2.prg: limits.c $(DIFF)
        $(SIM65) $(SIM65FLAGS) $$@ > $(WORKDIR)/limits.$1.out
        $(DIFF) $(WORKDIR)/limits.$1.out limits.ref
 
+$(WORKDIR)/goto.$1.$2.prg: goto.c $(DIFF)
+       $(if $(QUIET),echo misc/goto.$1.$2.prg)
+       $(CL65) -t sim$2 -$1 -o $$@ $$< 2>$(WORKDIR)/goto.$1.out
+       $(DIFF) $(WORKDIR)/goto.$1.out goto.ref
+
 # the rest are tests that fail currently for one reason or another
 $(WORKDIR)/fields.$1.$2.prg: fields.c | $(WORKDIR)
        @echo "FIXME: " $$@ "currently will fail."
diff --git a/test/misc/goto.c b/test/misc/goto.c
new file mode 100644 (file)
index 0000000..69247a4
--- /dev/null
@@ -0,0 +1,437 @@
+void main () {
+    goto end;
+    {
+        int a = 1;
+start:
+        goto end;
+    }
+    goto start;
+end:;
+}
+
+void f2 () {
+    int a = 2;
+
+l1:
+    goto l1;
+    goto l2;
+    goto l3;
+    goto l4;
+    goto l5;
+    goto l6;
+    goto l7;
+    goto l8;
+    goto l9;
+    goto la;
+    goto lb;
+    goto lc;
+    goto ld;
+    goto le;
+    goto lf;
+    goto lg;
+    goto lh;
+    goto li;
+    {
+        int a;
+    l2:;
+        goto l1;
+        goto l2;
+        goto l3;
+        goto l4;
+        goto l5;
+        goto l6;
+        goto l7;
+        goto l8;
+        goto l9;
+        goto la;
+        goto lb;
+        goto lc;
+        goto ld;
+        goto le;
+        goto lf;
+        goto lg;
+        goto lh;
+        goto li;
+        {
+            int a;
+        l3:;
+            goto l1;
+            goto l2;
+            goto l3;
+            goto l4;
+            goto l5;
+            goto l6;
+            goto l7;
+            goto l8;
+            goto l9;
+            goto la;
+            goto lb;
+            goto lc;
+            goto ld;
+            goto le;
+            goto lf;
+            goto lg;
+            goto lh;
+            goto li;
+            {
+                int a;
+            l4:;
+                goto l1;
+                goto l2;
+                goto l3;
+                goto l4;
+                goto l5;
+                goto l6;
+                goto l7;
+                goto l8;
+                goto l9;
+                goto la;
+                goto lb;
+                goto lc;
+                goto ld;
+                goto le;
+                goto lf;
+                goto lg;
+                goto lh;
+                goto li;
+            }
+        l5:;
+            goto l1;
+            goto l2;
+            goto l3;
+            goto l4;
+            goto l5;
+            goto l6;
+            goto l7;
+            goto l8;
+            goto l9;
+            goto la;
+            goto lb;
+            goto lc;
+            goto ld;
+            goto le;
+            goto lf;
+            goto lg;
+            goto lh;
+            goto li;
+        }
+    l6:;
+        goto l1;
+        goto l2;
+        goto l3;
+        goto l4;
+        goto l5;
+        goto l6;
+        goto l7;
+        goto l8;
+        goto l9;
+        goto la;
+        goto lb;
+        goto lc;
+        goto ld;
+        goto le;
+        goto lf;
+        goto lg;
+        goto lh;
+        goto li;
+    }
+l7:;
+    goto l1;
+    goto l2;
+    goto l3;
+    goto l4;
+    goto l5;
+    goto l6;
+    goto l7;
+    goto l8;
+    goto l9;
+    goto la;
+    goto lb;
+    goto lc;
+    goto ld;
+    goto le;
+    goto lf;
+    goto lg;
+    goto lh;
+    goto li;
+    {
+        int a = 1;
+    l8:;
+        goto l1;
+        goto l2;
+        goto l3;
+        goto l4;
+        goto l5;
+        goto l6;
+        goto l7;
+        goto l8;
+        goto l9;
+        goto la;
+        goto lb;
+        goto lc;
+        goto ld;
+        goto le;
+        goto lf;
+        goto lg;
+        goto lh;
+        goto li;
+        {
+            int a = 1;
+        l9:;
+            goto l1;
+            goto l2;
+            goto l3;
+            goto l4;
+            goto l5;
+            goto l6;
+            goto l7;
+            goto l8;
+            goto l9;
+            goto la;
+            goto lb;
+            goto lc;
+            goto ld;
+            goto le;
+            goto lf;
+            goto lg;
+            goto lh;
+            goto li;
+            {
+                int a = 1;
+            la:;
+                goto l1;
+                goto l2;
+                goto l3;
+                goto l4;
+                goto l5;
+                goto l6;
+                goto l7;
+                goto l8;
+                goto l9;
+                goto la;
+                goto lb;
+                goto lc;
+                goto ld;
+                goto le;
+                goto lf;
+                goto lg;
+                goto lh;
+                goto li;
+            }
+        lb:;
+            goto l1;
+            goto l2;
+            goto l3;
+            goto l4;
+            goto l5;
+            goto l6;
+            goto l7;
+            goto l8;
+            goto l9;
+            goto la;
+            goto lb;
+            goto lc;
+            goto ld;
+            goto le;
+            goto lf;
+            goto lg;
+            goto lh;
+            goto li;
+        }
+    lc:;
+        goto l1;
+        goto l2;
+        goto l3;
+        goto l4;
+        goto l5;
+        goto l6;
+        goto l7;
+        goto l8;
+        goto l9;
+        goto la;
+        goto lb;
+        goto lc;
+        goto ld;
+        goto le;
+        goto lf;
+        goto lg;
+        goto lh;
+        goto li;
+    }
+    {
+        int a = 1;
+    ld:;
+        goto l1;
+        goto l2;
+        goto l3;
+        goto l4;
+        goto l5;
+        goto l6;
+        goto l7;
+        goto l8;
+        goto l9;
+        goto la;
+        goto lb;
+        goto lc;
+        goto ld;
+        goto le;
+        goto lf;
+        goto lg;
+        goto lh;
+        goto li;
+        {
+            int a = 1;
+        le:;
+            goto l1;
+            goto l2;
+            goto l3;
+            goto l4;
+            goto l5;
+            goto l6;
+            goto l7;
+            goto l8;
+            goto l9;
+            goto la;
+            goto lb;
+            goto lc;
+            goto ld;
+            goto le;
+            goto lf;
+            goto lg;
+            goto lh;
+            goto li;
+            {
+                int a = 1;
+            lf:;
+                goto l1;
+                goto l2;
+                goto l3;
+                goto l4;
+                goto l5;
+                goto l6;
+                goto l7;
+                goto l8;
+                goto l9;
+                goto la;
+                goto lb;
+                goto lc;
+                goto ld;
+                goto le;
+                goto lf;
+                goto lg;
+                goto lh;
+                goto li;
+            }
+        lg:;
+            goto l1;
+            goto l2;
+            goto l3;
+            goto l4;
+            goto l5;
+            goto l6;
+            goto l7;
+            goto l8;
+            goto l9;
+            goto la;
+            goto lb;
+            goto lc;
+            goto ld;
+            goto le;
+            goto lf;
+            goto lg;
+            goto lh;
+            goto li;
+        }
+    lh:;
+        goto l1;
+        goto l2;
+        goto l3;
+        goto l4;
+        goto l5;
+        goto l6;
+        goto l7;
+        goto l8;
+        goto l9;
+        goto la;
+        goto lb;
+        goto lc;
+        goto ld;
+        goto le;
+        goto lf;
+        goto lg;
+        goto lh;
+        goto li;
+    }
+li:;
+    goto l1;
+    goto l2;
+    goto l3;
+    goto l4;
+    goto l5;
+    goto l6;
+    goto l7;
+    goto l8;
+    goto l9;
+    goto la;
+    goto lb;
+    goto lc;
+    goto ld;
+    goto le;
+    goto lf;
+    goto lg;
+    goto lh;
+    goto li;
+}
+
+/* Structure of the above function.
+
+void f2 () {
+    int a = 2;
+
+l1:
+    {
+        int a;
+    l2:;
+        {
+            int a;
+        l3:;
+            {
+                int a;
+            l4:;
+            }
+        l5:;
+        }
+    l6:;
+    }
+l7:;
+    {
+        int a = 1;
+    l8:;
+        {
+            int a = 1;
+        l9:;
+            {
+                int a = 1;
+            la:;
+            }
+        lb:;
+        }
+    lc:;
+    }
+    {
+        int a = 1;
+    ld:;
+        {
+            int a = 1;
+        le:;
+            {
+                int a = 1;
+            lf:;
+            }
+        lg:;
+        }
+    lh:;
+    }
+li:;
+}
+*/
diff --git a/test/misc/goto.ref b/test/misc/goto.ref
new file mode 100644 (file)
index 0000000..0f57d97
--- /dev/null
@@ -0,0 +1,150 @@
+goto.c(8): Warning: Goto at line 8 to label start jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(97): Warning: `a' is defined but never used
+goto.c(117): Warning: `a' is defined but never used
+goto.c(137): Warning: `a' is defined but never used
+goto.c(159): Warning: Goto at line 23 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(159): Warning: Goto at line 44 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(159): Warning: Goto at line 65 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(159): Warning: Goto at line 86 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(159): Warning: Goto at line 106 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(159): Warning: Goto at line 126 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(159): Warning: Goto at line 146 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(180): Warning: Goto at line 24 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(180): Warning: Goto at line 45 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(180): Warning: Goto at line 66 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(180): Warning: Goto at line 87 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(180): Warning: Goto at line 107 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(180): Warning: Goto at line 127 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(180): Warning: Goto at line 147 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(180): Warning: Goto at line 168 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(201): Warning: Goto at line 25 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(201): Warning: Goto at line 46 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(201): Warning: Goto at line 67 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(201): Warning: Goto at line 88 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(201): Warning: Goto at line 108 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(201): Warning: Goto at line 128 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(201): Warning: Goto at line 148 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(201): Warning: Goto at line 169 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(201): Warning: Goto at line 190 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(221): Warning: Goto at line 26 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(221): Warning: Goto at line 47 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(221): Warning: Goto at line 68 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(221): Warning: Goto at line 89 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(221): Warning: Goto at line 109 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(221): Warning: Goto at line 129 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(221): Warning: Goto at line 149 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(221): Warning: Goto at line 170 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(231): Warning: Goto at line 231 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(241): Warning: Goto at line 27 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(241): Warning: Goto at line 48 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(241): Warning: Goto at line 69 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(241): Warning: Goto at line 90 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(241): Warning: Goto at line 110 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(241): Warning: Goto at line 130 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(241): Warning: Goto at line 150 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(250): Warning: Goto at line 250 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(251): Warning: Goto at line 251 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(252): Warning: Goto at line 252 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 28 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 49 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 70 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 91 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 111 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 131 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 151 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 172 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 193 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 214 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 234 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(263): Warning: Goto at line 254 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(271): Warning: Goto at line 271 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(272): Warning: Goto at line 272 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(273): Warning: Goto at line 273 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(274): Warning: Goto at line 274 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(275): Warning: Goto at line 275 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 29 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 50 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 71 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 92 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 112 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 132 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 152 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 173 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 194 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 215 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 235 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 255 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(284): Warning: Goto at line 277 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(292): Warning: Goto at line 292 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(293): Warning: Goto at line 293 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(294): Warning: Goto at line 294 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(295): Warning: Goto at line 295 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(296): Warning: Goto at line 296 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 30 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 51 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 72 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 93 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 113 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 133 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 153 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 174 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 195 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 216 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 236 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 256 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 278 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(305): Warning: Goto at line 299 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(313): Warning: Goto at line 313 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(314): Warning: Goto at line 314 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(315): Warning: Goto at line 315 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(316): Warning: Goto at line 316 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(317): Warning: Goto at line 317 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 31 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 52 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 73 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 94 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 114 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 134 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 154 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 175 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 196 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 217 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 237 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 257 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(325): Warning: Goto at line 279 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(333): Warning: Goto at line 333 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(334): Warning: Goto at line 334 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(335): Warning: Goto at line 335 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(336): Warning: Goto at line 336 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(337): Warning: Goto at line 337 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(340): Warning: Goto at line 340 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 32 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 53 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 74 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 95 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 115 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 135 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 155 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 176 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 197 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 218 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 238 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(345): Warning: Goto at line 258 to label lh jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(353): Warning: Goto at line 353 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(354): Warning: Goto at line 354 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(355): Warning: Goto at line 355 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(356): Warning: Goto at line 356 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(357): Warning: Goto at line 357 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(359): Warning: Goto at line 359 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(360): Warning: Goto at line 360 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(361): Warning: Goto at line 361 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(373): Warning: Goto at line 373 to label l8 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(374): Warning: Goto at line 374 to label l9 jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(375): Warning: Goto at line 375 to label la jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(376): Warning: Goto at line 376 to label lb jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(377): Warning: Goto at line 377 to label lc jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(378): Warning: Goto at line 378 to label ld jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(379): Warning: Goto at line 379 to label le jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(380): Warning: Goto at line 380 to label lf jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(381): Warning: Goto at line 381 to label lg jumps into a block with initialization of an object that has automatic storage duration.
+goto.c(382): Warning: Goto at line 382 to label lh jumps into a block with initialization of an object that has automatic storage duration.