| .. title:: clang-tidy - bugprone-suspicious-memset-usage |
| |
| bugprone-suspicious-memset-usage |
| ================================ |
| |
| This check finds ``memset()`` calls with potential mistakes in their arguments. |
| Considering the function as ``void* memset(void* destination, int fill_value, |
| size_t byte_count)``, the following cases are covered: |
| |
| **Case 1: Fill value is a character ``'0'``** |
| |
| Filling up a memory area with ASCII code 48 characters is not customary, |
| possibly integer zeroes were intended instead. |
| The check offers a replacement of ``'0'`` with ``0``. Memsetting character |
| pointers with ``'0'`` is allowed. |
| |
| **Case 2: Fill value is truncated** |
| |
| Memset converts ``fill_value`` to ``unsigned char`` before using it. If |
| ``fill_value`` is out of unsigned character range, it gets truncated |
| and memory will not contain the desired pattern. |
| |
| **Case 3: Byte count is zero** |
| |
| Calling memset with a literal zero in its ``byte_count`` argument is likely |
| to be unintended and swapped with ``fill_value``. The check offers to swap |
| these two arguments. |
| |
| Corresponding cpplint.py check name: ``runtime/memset``. |
| |
| |
| Examples: |
| |
| .. code-block:: c++ |
| |
| void foo() { |
| int i[5] = {1, 2, 3, 4, 5}; |
| int *ip = i; |
| char c = '1'; |
| char *cp = &c; |
| int v = 0; |
| |
| // Case 1 |
| memset(ip, '0', 1); // suspicious |
| memset(cp, '0', 1); // OK |
| |
| // Case 2 |
| memset(ip, 0xabcd, 1); // fill value gets truncated |
| memset(ip, 0x00, 1); // OK |
| |
| // Case 3 |
| memset(ip, sizeof(int), v); // zero length, potentially swapped |
| memset(ip, 0, 1); // OK |
| } |