Main Content

MISRA C++:2023 Rule 9.6.2

A goto statement shall reference a label in a surrounding block

Since R2024b

Description

Rule Definition

A goto statement shall reference a label in a surrounding block. 1

Rationale

Using a goto statement to jump across blocks creates complex control flow, which might cause developer confusion or unexpected results. To avoid unexpected results, avoid using goto statements to jump across code blocks.

Polyspace Implementation

Polyspace® raises this defect when a goto statement destination is in a block other than the following:

  • The same block as the goto statement.

  • One of the blocks 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 R2024b


1 All MISRA coding rules and directives are © Copyright The MISRA Consortium Limited 2021.

The MISRA coding standards referenced in the Polyspace Bug Finder™ documentation are from the following MISRA standards:

  • MISRA C:2004

  • MISRA C:2012

  • MISRA C:2023

  • MISRA C++:2008

  • MISRA C++:2023

MISRA and MISRA C are registered trademarks of The MISRA Consortium Limited 2021.