| .. title:: clang-tidy - cppcoreguidelines-avoid-goto |
| |
| cppcoreguidelines-avoid-goto |
| ============================ |
| |
| The usage of ``goto`` for control flow is error prone and should be replaced |
| with looping constructs. Only forward jumps in nested loops are accepted. |
| |
| This check implements `ES.76 <https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#es76-avoid-goto>`_ |
| from the CppCoreGuidelines and |
| `6.3.1 from High Integrity C++ <http://www.codingstandard.com/rule/6-3-1-ensure-that-the-labels-for-a-jump-statement-or-a-switch-condition-appear-later-in-the-same-or-an-enclosing-block/>`_. |
| |
| For more information on why to avoid programming |
| with ``goto`` you can read the famous paper `A Case against the GO TO Statement. <https://www.cs.utexas.edu/users/EWD/ewd02xx/EWD215.PDF>`_. |
| |
| The check diagnoses ``goto`` for backward jumps in every language mode. These |
| should be replaced with `C/C++` looping constructs. |
| |
| .. code-block:: c++ |
| |
| // Bad, handwritten for loop. |
| int i = 0; |
| // Jump label for the loop |
| loop_start: |
| do_some_operation(); |
| |
| if (i < 100) { |
| ++i; |
| goto loop_start; |
| } |
| |
| // Better |
| for(int i = 0; i < 100; ++i) |
| do_some_operation(); |
| |
| Modern C++ needs ``goto`` only to jump out of nested loops. |
| |
| .. code-block:: c++ |
| |
| for(int i = 0; i < 100; ++i) { |
| for(int j = 0; j < 100; ++j) { |
| if (i * j > 500) |
| goto early_exit; |
| } |
| } |
| |
| early_exit: |
| some_operation(); |
| |
| All other uses of ``goto`` are diagnosed in `C++`. |