64 lines
2.1 KiB
ReStructuredText
64 lines
2.1 KiB
ReStructuredText
|
.. title:: clang-tidy - bugprone-implicit-widening-of-multiplication-result
|
||
|
|
||
|
bugprone-implicit-widening-of-multiplication-result
|
||
|
===================================================
|
||
|
|
||
|
The check diagnoses instances where a result of a multiplication is implicitly
|
||
|
widened, and suggests (with fix-it) to either silence the code by making
|
||
|
widening explicit, or to perform the multiplication in a wider type,
|
||
|
to avoid the widening afterwards.
|
||
|
|
||
|
This is mainly useful when operating on very large buffers.
|
||
|
For example, consider:
|
||
|
|
||
|
.. code-block:: c++
|
||
|
|
||
|
void zeroinit(char* base, unsigned width, unsigned height) {
|
||
|
for(unsigned row = 0; row != height; ++row) {
|
||
|
for(unsigned col = 0; col != width; ++col) {
|
||
|
char* ptr = base + row * width + col;
|
||
|
*ptr = 0;
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
|
||
|
This is fine in general, but if ``width * height`` overflows,
|
||
|
you end up wrapping back to the beginning of ``base``
|
||
|
instead of processing the entire requested buffer.
|
||
|
|
||
|
Indeed, this only matters for pretty large buffers (4GB+),
|
||
|
but that can happen very easily for example in image processing,
|
||
|
where for that to happen you "only" need a ~269MPix image.
|
||
|
|
||
|
|
||
|
Options
|
||
|
-------
|
||
|
|
||
|
.. option:: UseCXXStaticCastsInCppSources
|
||
|
|
||
|
When suggesting fix-its for C++ code, should C++-style ``static_cast<>()``'s
|
||
|
be suggested, or C-style casts. Defaults to ``true``.
|
||
|
|
||
|
.. option:: UseCXXHeadersInCppSources
|
||
|
|
||
|
When suggesting to include the appropriate header in C++ code,
|
||
|
should ``<cstddef>`` header be suggested, or ``<stddef.h>``.
|
||
|
Defaults to ``true``.
|
||
|
|
||
|
|
||
|
Examples:
|
||
|
|
||
|
.. code-block:: c++
|
||
|
|
||
|
long mul(int a, int b) {
|
||
|
return a * b; // warning: performing an implicit widening conversion to type 'long' of a multiplication performed in type 'int'
|
||
|
}
|
||
|
|
||
|
char* ptr_add(char *base, int a, int b) {
|
||
|
return base + a * b; // warning: result of multiplication in type 'int' is used as a pointer offset after an implicit widening conversion to type 'ssize_t'
|
||
|
}
|
||
|
|
||
|
char ptr_subscript(char *base, int a, int b) {
|
||
|
return base[a * b]; // warning: result of multiplication in type 'int' is used as a pointer offset after an implicit widening conversion to type 'ssize_t'
|
||
|
}
|