forked from OSchip/llvm-project
47 lines
1.6 KiB
ReStructuredText
47 lines
1.6 KiB
ReStructuredText
.. title:: clang-tidy - bugprone-too-small-loop-variable
|
|
|
|
bugprone-too-small-loop-variable
|
|
================================
|
|
|
|
Detects those ``for`` loops that have a loop variable with a "too small" type
|
|
which means this type can't represent all values which are part of the
|
|
iteration range.
|
|
|
|
.. code-block:: c++
|
|
|
|
int main() {
|
|
long size = 294967296l;
|
|
for (short i = 0; i < size; ++i) {}
|
|
}
|
|
|
|
This ``for`` loop is an infinite loop because the ``short`` type can't represent
|
|
all values in the ``[0..size]`` interval.
|
|
|
|
In a real use case size means a container's size which depends on the user input.
|
|
|
|
.. code-block:: c++
|
|
|
|
int doSomething(const std::vector& items) {
|
|
for (short i = 0; i < items.size(); ++i) {}
|
|
}
|
|
|
|
This algorithm works for small amount of objects, but will lead to freeze for a
|
|
a larger user input.
|
|
|
|
.. option:: MagnitudeBitsUpperLimit
|
|
|
|
Upper limit for the magnitude bits of the loop variable. If it's set the check
|
|
filters out those catches in which the loop variable's type has more magnitude
|
|
bits as the specified upper limit. The default value is 16.
|
|
For example, if the user sets this option to 31 (bits), then a 32-bit ``unsigned int``
|
|
is ignored by the check, however a 32-bit ``int`` is not (A 32-bit ``signed int``
|
|
has 31 magnitude bits).
|
|
|
|
.. code-block:: c++
|
|
|
|
int main() {
|
|
long size = 294967296l;
|
|
for (unsigned i = 0; i < size; ++i) {} // no warning with MagnitudeBitsUpperLimit = 31 on a system where unsigned is 32-bit
|
|
for (int i = 0; i < size; ++i) {} // warning with MagnitudeBitsUpperLimit = 31 on a system where int is 32-bit
|
|
}
|