forked from OSchip/llvm-project
66 lines
1.5 KiB
ReStructuredText
66 lines
1.5 KiB
ReStructuredText
.. title:: clang-tidy - bugprone-misplaced-widening-cast
|
|
|
|
bugprone-misplaced-widening-cast
|
|
================================
|
|
|
|
This check will warn when there is a cast of a calculation result to a bigger
|
|
type. If the intention of the cast is to avoid loss of precision then the cast
|
|
is misplaced, and there can be loss of precision. Otherwise the cast is
|
|
ineffective.
|
|
|
|
Example code:
|
|
|
|
.. code-block:: c++
|
|
|
|
long f(int x) {
|
|
return (long)(x * 1000);
|
|
}
|
|
|
|
The result ``x * 1000`` is first calculated using ``int`` precision. If the
|
|
result exceeds ``int`` precision there is loss of precision. Then the result is
|
|
casted to ``long``.
|
|
|
|
If there is no loss of precision then the cast can be removed or you can
|
|
explicitly cast to ``int`` instead.
|
|
|
|
If you want to avoid loss of precision then put the cast in a proper location,
|
|
for instance:
|
|
|
|
.. code-block:: c++
|
|
|
|
long f(int x) {
|
|
return (long)x * 1000;
|
|
}
|
|
|
|
Implicit casts
|
|
--------------
|
|
|
|
Forgetting to place the cast at all is at least as dangerous and at least as
|
|
common as misplacing it. If :option:`CheckImplicitCasts` is enabled the check
|
|
also detects these cases, for instance:
|
|
|
|
.. code-block:: c++
|
|
|
|
long f(int x) {
|
|
return x * 1000;
|
|
}
|
|
|
|
Floating point
|
|
--------------
|
|
|
|
Currently warnings are only written for integer conversion. No warning is
|
|
written for this code:
|
|
|
|
.. code-block:: c++
|
|
|
|
double f(float x) {
|
|
return (double)(x * 10.0f);
|
|
}
|
|
|
|
Options
|
|
-------
|
|
|
|
.. option:: CheckImplicitCasts
|
|
|
|
If non-zero, enables detection of implicit casts. Default is non-zero.
|