Hallo zusammen,
Bei folgendem Programmcode erhalte ich die Regelverletzung Nr. 12.2 und
12.4 gemäss MISRA-C (2004), die ich mir nicht erklären kann bzw. ich
nicht weiss, wie ich das beheben könnte. Das Regelwerk bezüglich diesen
Punkten habe ich gelesen, aber die bringen mich auch nicht weiter, was
ich konkret verändern müsste.
Vielleicht habt ihr eine Idee?
Besten Dank.
1 | [ MISRA 12.2 ] The value of an expression shall be the same under any order of evaluation that the standard permits.
|
2 | ->Line No : 27 : while( ( get_a( ) == OFF ) && ( ( get_b( ) == ON ) || ( get_c( ) == ON ) ) )
|
3 |
|
4 | [ MISRA 12.4 ] The right-hand operand of a logical && or || operator shall not contain side effects.
|
5 | ->Line No : 27 : while( ( get_a( ) == OFF ) && ( ( get_b( ) == ON ) || ( get_c( ) == ON ) ) )
|
Codebeispiel (ist nicht wirklich sinnvoll und dient nur zum Test der
Regelverletzung):
1 | typedef signed int int32_t;
|
2 |
|
3 | #define OFF 0U
|
4 | #define ON 1U
|
5 |
|
6 |
|
7 | int32_t main( void );
|
8 | void get_a( void );
|
9 | void get_b( void );
|
10 | void get_c( void );
|
11 |
|
12 | int32_t main( void )
|
13 | {
|
14 | int32_t a = OFF;
|
15 | int32_t b = OFF;
|
16 | int32_t c = OFF;
|
17 |
|
18 | while( ( get_a( ) == OFF ) && ( ( get_b( ) == ON ) || ( get_c( ) == ON ) ) )
|
19 | {
|
20 |
|
21 | }
|
22 |
|
23 | return 0U;
|
24 | }
|
25 |
|
26 | void get_a( void )
|
27 | {
|
28 | if( a == OFF )
|
29 | {
|
30 | }
|
31 | else
|
32 | {
|
33 | a = OFF;
|
34 | }
|
35 | }
|
36 |
|
37 | void get_b( void )
|
38 | {
|
39 | if( b == OFF )
|
40 | {
|
41 | b = ON;
|
42 | }
|
43 | else
|
44 | {
|
45 | }
|
46 | }
|
47 |
|
48 | void get_c( void )
|
49 | {
|
50 | if( c == OFF )
|
51 | {
|
52 | c = ON;
|
53 | }
|
54 | else
|
55 | {
|
56 | }
|
57 | }
|