# V1019. Compound assignment expression is used inside condition.

Анализатор обнаружил использование составного оператора присваивания внутри выражения, имеющего тип 'bool'.

Рассмотрим пример:

    if (adj_number == (size_t)(roving->adj_count - 1) &&
        (total_quantity += quantity_delta) < 0)
    {
        /* ... */
    }

В данном случае переменная 'total_quantity' изменяется внутри блока условия оператора 'if'. Дополнительную подозрительность этому коду придает тот факт, что изменение переменной 'total_quantity' произойдет только в том случае, если будет выполнено условие слева от оператора '&&'. Возможно, имеет место опечатка, и вместо составного оператора присваивания '+=' предполагается оператор сложения '+':

    if (adj_number == (size_t)(roving->adj_count - 1) &&
      (total_quantity + quantity_delta) < 0)
    {
        /* ... */
    };

Даже если первоначальный код был верен, всё равно крайне не рекомендуется писать такие сложные выражения. В логике подобного кода сложно разобраться и очень легко допустить ошибку, модифицируя подобный код.

Анализатор не может однозначно определить, содержит ли выявленный с помощью данной диагностики код настоящую ошибку, или программист перестарался, сокращая код. Мы изучили большое количество открытых проектов и выдели ряд паттернов программирования, когда используются рассмотренные конструкции кода и это не является ошибкой. С целью сокращения числа ложных срабатываний, предупреждение не выдаётся в следующих случаях:

- Левая часть составного оператора присваивания является указателем;
- Составной оператор присваивания является частью макроса;
- Составной оператор присваивания находится в теле цикла.

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

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

CWE-480 CERT-INT31-C