Main Content

MISRA C++:2008 Rule 6-6-1

Any label referenced by a goto statement shall be declared in the same block, or in a block enclosing the goto statement

Description

Rule Definition

Any label referenced by a goto statement shall be declared in the same block, or in a block enclosing the goto statement.

Rationale

Using a goto statement to jump into nested blocks creates complex control flow, which might cause developer confusion or unexpected results. To avoid unexpected results, place the label the goto statement is referring to in the same block or in a block that encloses the goto statement.

Polyspace Implementation

Polyspace® raises this defect when the goto destination is in a different block than the goto statement. This defect is not raised if the goto destination is in a block enclosing the goto statement.

Troubleshooting

If you expect a rule violation but Polyspace does not report it, see Diagnose Why Coding Standard Violations Do Not Appear as Expected.

Examples

expand all

#include <iostream>

int x, y = 0;

void foo1()
{
    int i = 0;
    if (x <= 10) {
        goto err;                    //Noncompliant
    }

    if(x > 10) {
    err:
        std::cout << "Error encountered in loop" << std::endl;
    }

}

void foo2()
{
    for (x = 0; x < 100; ++x) {
        for (y = 0; y < 100; ++y) {
            if (x > y) {
                goto stop;            //Compliant
            }
            //...
        }
    }
stop:
    std::cout << "Error encountered in loop" << std::endl;
}

Because the label err is located within a separate code block than goto err, and that code block does not enclose the code block where goto err resides, Polyspace flags the goto statement as noncompliant.

The label stop is not in the same block as goto stop, but is in a block enclosing the goto stop statement. This behavior is compliant behavior.

Check Information

Group: Statements
Category: Required

Version History

Introduced in R2013b