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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример:

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

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

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

Данная диагностика классифицируется как:

CWE-131 CERT-ARR01-C CERT-EXP44-C

Взгляните на примеры ошибок, обнаруженных с помощью диагностики V568.