File: implicit-widening-of-multiplication-result.rst

package info (click to toggle)
swiftlang 6.0.3-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 2,519,992 kB
  • sloc: cpp: 9,107,863; ansic: 2,040,022; asm: 1,135,751; python: 296,500; objc: 82,456; f90: 60,502; lisp: 34,951; pascal: 19,946; sh: 18,133; perl: 7,482; ml: 4,937; javascript: 4,117; makefile: 3,840; awk: 3,535; xml: 914; fortran: 619; cs: 573; ruby: 573
file content (63 lines) | stat: -rw-r--r-- 2,154 bytes parent folder | download | duplicates (9)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
.. 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'
  }