﻿# V568\. It is suspicious that the argument of sizeof\(\) operator is the expression\.

Анализатор обнаружил потенциально возможную ошибку, связанную с тем, что аргументом оператора sizeof\(\) является подозрительное выражение\.

Подозрительные выражения можно разделить на три группы:

1\. В выражении пытаются изменить какую\-то переменную\.

Оператор sizeof\(\) вычисляет тип выражения и возвращает размер этого типа\. Но само выражение не вычисляется\. Пример подозрительного кода:

```cpp
int A;
...
size_t size = sizeof(A++);
```

Данный код не увеличивает переменную 'A'\. Если необходимо увеличить 'A' то следует переписать код следующим образом:

```cpp
size_t size = sizeof(A);
A++;
```

2\. В выражении используются такие операции, как сложение, умножение и так далее\.

Сложные выражения являются признаком наличия ошибки\. Чаще всего эти ошибки связаны с опечатками\. Пример:

```cpp
SendDlgItemMessage(
  hwndDlg, RULE_INPUT_1 + i, WM_GETTEXT,
  sizeof(buff - 1), (LPARAM) input_buff);
```

Вместо "sizeof\(buff\) \- 1" программист случайно написал "sizeof\(buff \- 1\)"\. Корректный вариант:

```cpp
SendDlgItemMessage(
  hwndDlg, RULE_INPUT_1 + i, WM_GETTEXT,
  sizeof(buff) - 1, (LPARAM) input_buff);
```

Другой пример опечатки в тексте программы:

```cpp
memset(tcmpt->stepsizes, 0,
  sizeof(tcmpt->numstepsizes * sizeof(uint_fast16_t)));
```

Корректный вариант:

```cpp
memset(tcmpt->stepsizes, 0,
  tcmpt->numstepsizes * sizeof(uint_fast16_t));
```

3\. Аргументом оператора sizeof\(\) является указатель на класс\. Чаще всего это означает, что программист забыл разыменовать указатель\.

Пример:

```cpp
class MyClass
{
public:
  int a, b, c;
  size_t getSize() const
  {
    return sizeof(this);
  }
};
```

Метод getSize\(\) возвращает размер указателя, а не размер объекта\. Корректный вариант:

```cpp
size_t getSize() const
{
  return sizeof(*this);
}
```