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

The analyzer detected a potential error: a suspicious expression serves as an argument of the sizeof() operator.

Suspicious expressions can be arranged in two groups:

1. An expression attempts to change some variable.

The sizeof() operator calculates the expression's type and returns the size of this type. But the expression itself is not calculated. Here is a sample of suspicious code:

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

This code does not increment the 'A' variable. If you need to increment 'A', you'd better rewrite the code in the following way:

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

2. Operations of addition, multiplication and the like are used in the expression.

Complex expressions signal errors. These errors are usually related to misprints. For example:

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

The programmer wrote "sizeof(buff - 1)" instead of "sizeof(buff) - 1". This is the correct code:

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

Here is another sample of a misprint in program text:

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

The correct code:

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

3. The argument of the sizeof() operator is a pointer to a class. In most cases this shows that the programmer forgot to dereference the pointer.

Example:

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

The getSize() method returns the size of the pointer, not of the object. Here is a correct variant:

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

This diagnostic is classified as:

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

You can look at examples of errors detected by the V568 diagnostic.