[clang-tidy] New bugprone-infinite-loop check for detecting obvious infinite loops

Finding infinite loops is well-known to be impossible (halting problem).
However, it is possible to detect some obvious infinite loops, for example,
if the loop condition is not changed. Detecting such loops is beneficial
since the tests will hang on programs containing infinite loops so
testing-time detection may be costly in large systems. Obvious cases are
where the programmer forgets to increment/decrement the counter or
increments/decrements the wrong variable.

Differential Revision: https://reviews.llvm.org/D64736

llvm-svn: 372693
This commit is contained in:
Adam Balogh 2019-09-24 07:43:26 +00:00
parent ef06dd4328
commit 54b78f3bb6
4 changed files with 89 additions and 0 deletions

View File

@ -23,6 +23,7 @@
#include "ForwardingReferenceOverloadCheck.h"
#include "InaccurateEraseCheck.h"
#include "IncorrectRoundingsCheck.h"
#include "InfiniteLoopCheck.h"
#include "IntegerDivisionCheck.h"
#include "LambdaFunctionNameCheck.h"
#include "MacroParenthesesCheck.h"
@ -88,6 +89,8 @@ public:
"bugprone-inaccurate-erase");
CheckFactories.registerCheck<IncorrectRoundingsCheck>(
"bugprone-incorrect-roundings");
CheckFactories.registerCheck<InfiniteLoopCheck>(
"bugprone-infinite-loop");
CheckFactories.registerCheck<IntegerDivisionCheck>(
"bugprone-integer-division");
CheckFactories.registerCheck<LambdaFunctionNameCheck>(

View File

@ -15,6 +15,7 @@ add_clang_library(clangTidyBugproneModule
ForwardingReferenceOverloadCheck.cpp
InaccurateEraseCheck.cpp
IncorrectRoundingsCheck.cpp
InfiniteLoopCheck.cpp
IntegerDivisionCheck.cpp
LambdaFunctionNameCheck.cpp
MacroParenthesesCheck.cpp

View File

@ -70,6 +70,86 @@ Improvements to clang-tidy
- New :doc:`bugprone-dynamic-static-initializers
<clang-tidy/checks/bugprone-dynamic-static-initializers>` check.
- New OpenMP module.
For checks specific to `OpenMP <https://www.openmp.org/>`_ API.
- New :doc:`abseil-duration-addition
<clang-tidy/checks/abseil-duration-addition>` check.
Checks for cases where addition should be performed in the ``absl::Time``
domain.
- New :doc:`abseil-duration-conversion-cast
<clang-tidy/checks/abseil-duration-conversion-cast>` check.
Checks for casts of ``absl::Duration`` conversion functions, and recommends
the right conversion function instead.
- New :doc:`abseil-duration-unnecessary-conversion
<clang-tidy/checks/abseil-duration-unnecessary-conversion>` check.
Finds and fixes cases where ``absl::Duration`` values are being converted to
numeric types and back again.
- New :doc:`abseil-time-comparison
<clang-tidy/checks/abseil-time-comparison>` check.
Prefer comparisons in the ``absl::Time`` domain instead of the integer
domain.
- New :doc:`abseil-time-subtraction
<clang-tidy/checks/abseil-time-subtraction>` check.
Finds and fixes ``absl::Time`` subtraction expressions to do subtraction
in the Time domain instead of the numeric domain.
- New :doc:`android-cloexec-pipe
<clang-tidy/checks/android-cloexec-pipe>` check.
This check detects usage of ``pipe()``.
- New :doc:`android-cloexec-pipe2
<clang-tidy/checks/android-cloexec-pipe2>` check.
This checks ensures that ``pipe2()`` is called with the O_CLOEXEC flag.
- New :doc:`bugprone-infinite-loop
<clang-tidy/checks/bugprone-infinite-loop>` check.
Finds obvious infinite loops (loops where the condition variable is not
changed at all).
- New :doc:`bugprone-unhandled-self-assignment
<clang-tidy/checks/bugprone-unhandled-self-assignment>` check.
Finds user-defined copy assignment operators which do not protect the code
against self-assignment either by checking self-assignment explicitly or
using the copy-and-swap or the copy-and-move method.
- New :doc:`bugprone-branch-clone
<clang-tidy/checks/bugprone-branch-clone>` check.
Checks for repeated branches in ``if/else if/else`` chains, consecutive
repeated branches in ``switch`` statements and indentical true and false
branches in conditional operators.
- New :doc:`bugprone-posix-return
<clang-tidy/checks/bugprone-posix-return>` check.
Checks if any calls to POSIX functions (except ``posix_openpt``) expect negative
return values.
- New :doc:`fuchsia-default-arguments-calls
<clang-tidy/checks/fuchsia-default-arguments-calls>` check.
Warns if a function or method is called with default arguments.
This was previously done by `fuchsia-default-arguments check`, which has been
removed.
- New :doc:`fuchsia-default-arguments-calls
<clang-tidy/checks/fuchsia-default-arguments-calls>` check.
Finds instances where variables with static storage are initialized
dynamically in header files.
@ -103,6 +183,10 @@ Improvements to clang-tidy
Now also checks if any calls to ``pthread_*`` functions expect negative return
values.
- New :doc:`bugprone-infinite-loop <clang-tidy/checks/bugprone-infinite-loop>`
check to detect obvious infinite loops (loops where the condition variable is
not changed at all).
Improvements to include-fixer
-----------------------------

View File

@ -51,6 +51,7 @@ Clang-Tidy Checks
bugprone-forwarding-reference-overload
bugprone-inaccurate-erase
bugprone-incorrect-roundings
bugprone-infinite-loop
bugprone-integer-division
bugprone-lambda-function-name
bugprone-macro-parentheses