Rule 10.3 - Bitfield narrower essential type

Moderators: misra-c, david ward

Post Reply
apereira
Posts: 4
Joined: Fri Feb 08, 2019 12:57 pm
Company: Infineon Technologies

Rule 10.3 - Bitfield narrower essential type

Post by apereira » Thu Oct 24, 2019 7:01 am

Hello,

Assuming that I have the following structure and enum:

Code: Select all

  typedef struct s{
  unsigned int a:5;
  unsigned int b:1;
  unsigned int c:1;
} s;

typedef enum e{
  ZERO = 0,
  ONE = 1,
  TWO = 2,
  THREE = 3
} e;
Why does the following code trigger rule 10.3?

Code: Select all

s fcn(void)
{
  s test;

  test.a = (unsigned int) THREE;

  return test;
}

misra-c
Posts: 560
Joined: Thu Jan 05, 2006 1:11 pm

Re: Rule 10.3 - Bitfield narrower essential type

Post by misra-c » Wed Nov 27, 2019 9:54 am

This response assumes an 8-bit char, 16-bit short and 32-bit int.

The essential type for bit-fields is explained in appendix D.4. It is the smallest standard type which is able to represent all possible values of the bit-field.
Therefore the essential type for test.a is "unsigned char".

The essential type of "(unsigned int)THREE" is "unsigned int" as the cast operation is not listed in Appendix D.7.

There is therefore a "narrower conversion" from "unsigned int" to "unsigned char" and hence a violation of rule 10.3.

The following would be valid with this rule:

Code: Select all

test.a = (unsigned char)THREE;
---
Posted by and on behalf of
the MISRA C Working Group

Post Reply

Return to “8.10 The essential type model”