Rule 6-2-1 Assignment operators shall not be used in subexpressions

Moderators: david ward, misra cpp

nishiyama
Posts: 5
Joined: Tue Mar 13, 2018 7:58 am
Company: Denso Create

Rule 6-2-1 Assignment operators shall not be used in subexpressions

Postby nishiyama » Wed May 30, 2018 1:44 pm


dg1980
Posts: 108
Joined: Wed Apr 27, 2016 2:33 pm
Company: Elektrobit Automotive GmbH

Re: Rule 6-2-1 Assignment operators shall not be used in subexpressions

Postby dg1980 » Wed May 30, 2018 9:54 pm

IMHO, both are technically sub-expressions.
It's either a mistake that the second one is compliant or the intent of MISRA was to add an explicit exception for declaration+initialization of block scope variables like i (x is not, so you have the side effect of changing its value + confusing it with ==).
Anyway, an official clarification would be nice.

misra cpp
Posts: 145
Joined: Mon Jun 02, 2008 1:55 pm
Company: MISRA

Re: Rule 6-2-1 Assignment operators shall not be used in subexpressions

Postby misra cpp » Tue Jul 17, 2018 2:04 pm

Firstly, we agree with nishiyama’s interpretation of 6-2-1, the first example is compliant and the second isn’t. The technical reason for why the first is compliant is that it doesn’t contain an assignment (as defined by the C++ standard). When an object is declared, what appears to be an assignment is an initialisation. The C++ standard defines different behaviours for assignment and initialisation (e.g. you cannot assign to a const object, but you can – indeed must – initialise it), so MISRA C++ makes the same distinction.

The more practical reason is that there is no reason to ban if ( int16_t i = foo ( ) ) as there is no possibility of unexpected or undefined behaviour and it would be difficult to ban without also banning for ( int16_t i = 0; … which is such a common coding idiom that it has to be allowed.
Posted by and on behalf of
the MISRA C++ Working Group


Return to “6.6 Statements (C++)”

Who is online

Users browsing this forum: No registered users and 3 guests