C and C++ Binaries


LANG.STRUCT.USEASSIGN : Assignment Result in Expression

Summary

An assignment operator is used in a sub-expression. In consequence, the expression:

Warnings of this class will not be triggered by the following.

Properties

Class Name Assignment Result in Expression
Significance style
Mnemonic LANG.STRUCT.USEASSIGN
Categories
MisraC2023 MisraC2023:13.4 The result of an assignment operator should not be used
Misra2012 Misra2012:13.4 The result of an assignment operator should not be used
Misra2004 Misra2004:13.1 Assignment operators shall not be used in expressions that yield a Boolean value
AUTOSARC++14 AUTOSARC++14:M6-2-1 Assignment operators shall not be used in sub-expressions.
MisraC++2008 MisraC++2008:6-2-1 Assignment operators shall not be used in sub-expressions.
MisraC++2023 MisraC++2023:8.18.2 The result of an assignment operator should not be used
CWE CWE:481 Assigning instead of Comparing
CERT-C CERT-C:EXP45-C Do not perform assignments in selection statements
JSF++ JSF++:160 An assignment expression shall be used only as the expression in an expression statement.
JPL JPL:19 Do not use expressions with side effects.
Availability Available for C and C++.
Enabling Checks for this warning class are disabled by default, and require the unnormalized C ASTs for the project. To enable them, add the following WARNING_FILTER rule and RETAIN_UNNORMALIZED_C_AST specification to the project configuration file.
RETAIN_UNNORMALIZED_C_AST = Yes
WARNING_FILTER += allow class="Assignment Result in Expression"
Note that retaining the unnormalized ASTs will increase the disk space used to store the project representation, and may make the analysis take longer.

Example

int g;
int f(int i);

int lang_struct_useassign(int *a){
    int x;
    int y;
    int vla[g=32];        /* 'Assignment Result in Expression' warning issued here */

    y = x = 1;            /* 'Assignment Result in Expression' warning issued here */

    f(x+=3);              /* 'Assignment Result in Expression' warning issued here */

    if (x=3){             /* 'Assignment Result in Expression' warning issued here
                           * ('Redundant Condition' also issued)
                           */
        x = y++;                            /* postincrement result */
    }
                
    if ((x==x) || (x=3)){ /* 'Assignment Result in Expression' warning issued here
                           * (even though subexpression will never be executed:
                           * 'Unreachable Conditional' and 'Redundant Condition' warnings also issued)
                           */
    x = ++x;              /* 'Assignment Result in Expression' warning issued here */
    }
    x += (y += x, y);                          /* comma operand */
    return x;
}

Relevant Configuration File Parameters

The following configuration file parameters affect checks for this warning class.