| .. 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' |
| } |