| .. title:: clang-tidy - bugprone-suspicious-semicolon |
| |
| bugprone-suspicious-semicolon |
| ============================= |
| |
| Finds most instances of stray semicolons that unexpectedly alter the meaning of |
| the code. More specifically, it looks for ``if``, ``while``, ``for`` and |
| ``for-range`` statements whose body is a single semicolon, and then analyzes the |
| context of the code (e.g. indentation) in an attempt to determine whether that |
| is intentional. |
| |
| .. code-block:: c++ |
| |
| if (x < y); |
| { |
| x++; |
| } |
| |
| Here the body of the ``if`` statement consists of only the semicolon at the end |
| of the first line, and `x` will be incremented regardless of the condition. |
| |
| |
| .. code-block:: c++ |
| |
| while ((line = readLine(file)) != NULL); |
| processLine(line); |
| |
| As a result of this code, `processLine()` will only be called once, when the |
| ``while`` loop with the empty body exits with `line == NULL`. The indentation of |
| the code indicates the intention of the programmer. |
| |
| |
| .. code-block:: c++ |
| |
| if (x >= y); |
| x -= y; |
| |
| While the indentation does not imply any nesting, there is simply no valid |
| reason to have an `if` statement with an empty body (but it can make sense for |
| a loop). So this check issues a warning for the code above. |
| |
| To solve the issue remove the stray semicolon or in case the empty body is |
| intentional, reflect this using code indentation or put the semicolon in a new |
| line. For example: |
| |
| .. code-block:: c++ |
| |
| while (readWhitespace()); |
| Token t = readNextToken(); |
| |
| Here the second line is indented in a way that suggests that it is meant to be |
| the body of the `while` loop - whose body is in fact empty, because of the |
| semicolon at the end of the first line. |
| |
| Either remove the indentation from the second line: |
| |
| .. code-block:: c++ |
| |
| while (readWhitespace()); |
| Token t = readNextToken(); |
| |
| ... or move the semicolon from the end of the first line to a new line: |
| |
| .. code-block:: c++ |
| |
| while (readWhitespace()) |
| ; |
| |
| Token t = readNextToken(); |
| |
| In this case the check will assume that you know what you are doing, and will |
| not raise a warning. |