# V1065. Expression can be simplified: check similar operands.

Анализатор обнаружил подозрительное выражение, в котором операнды могут быть сокращены. Это может свидетельствовать о наличии в коде логической ошибки или опечатки.

Рассмотрим простой синтетический пример:

    void Foo(int A, int B, int C)
    {
      if (A - A + 1 < C)
        Go(A, B);
    }

Из-за опечатки получилось избыточное выражение, которое можно сократить до '1 < C'. На самом деле, планировалось написать, например, так:

    void Foo(int A, int B, int C)
    {
      if (A - B + 1 < C)
        Go(A, B);
    }

В других случаях могут быть выявлены выражения, которые, хотя и не содержат ошибку, будет полезно упростить. Это может сделать выражения более простыми и понятными. Пример:

    if ((rec.winDim.left + (rec.winDim.right - rec.winDim.left)) < inset) // <=
    {
      rec.winDim.left  = -((rec.winDim.right – rec.winDim.left) - inset);
      rec.winDim.right = inset;
    }

    if ((rec.winDim.top + (rec.winDim.bottom – rec.winDim.top)) < inset) // <=
    {
      rec.winDim.top = -((rec.winDim.bottom – rec.winDim.top) - inset);
      rec.winDim.bottom = inset;
    }

В обоих условиях выражения могут быть упрощены путем устранения операндов 'rec.winDim.left' и 'rec.winDim.top' соответственно. Сокращённый вариант кода:

    if (rec.winDim.right < inset)
    {
      rec.winDim.left  = -((rec.winDim.right – rec.winDim.left) - inset);
      rec.winDim.right = inset;
    }

    if (rec.winDim.bottom < inset)
    {
      rec.winDim.top = -((rec.winDim.bottom – rec.winDim.top) - inset);
      rec.winDim.bottom = inset;
    }

Примечание. Иногда избыточность вовсе не уменьшает, а увеличивает читабельность кода. Например, избыточность может нести поясняющий смысл в математических формулах. В этом случае есть смысл не сокращать выражение, а использовать один из механизмов подавления ложных срабатываний.

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

CWE-682

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