[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] MISRA C Rule 20.7 disambiguation
Hi all, This patch is to start a discussion in regard to rule 20.7 and its interpretation. During the last MISRA C call we discussed that "our" interpretation of the rule means that the following two cases don't need extra parenthesis: #define M(a, b) func(a, b) #define M(a, b) (a) = b Moreover, MISRA C states that parenthesis should be added when the expansion of a MACRO parameters would result in an *expression*. Expression is the important word. Looking at this *compliant* example from the manual: #define GET_MEMBER( S, M ) ( S ).M It is compliant because S results in an expression so it needs parenthesis, while M does not, so it doesn't need parenthesis. My understanding is the following: - is it possible to pass an expression as a parameter of the MACRO? - if yes -> need parenthesis - if no -> doesn't need parenthesis As an example, cppcheck reports the following (from xmalloc.h) as violation: #define xmalloc_array(_type, _num) \ ((_type *)_xmalloc_array(sizeof(_type), __alignof__(_type), _num)) I think this is a false positive. We have already enstablished that the "," operator doesn't require parenthesis, so "_num" is not the problem. And there is no way that adding parenthesis to "type" would allow an expression to be passed as the type argument. Let's take another example: #define xzalloc_flex_struct(type, field, nr) \ ((type *)_xzalloc(offsetof(type, field[nr]), __alignof__(type))) "type" is the same as last time. There are 2 other interesting macro parameters here: nr and field. nr could result in an expression, but I don't think it needs parenthesis because it is between []? However, we know we have a clear exception for the "," operator. We don't have a clear exception for the [] operator. Do we need (nr)? field could result in an expression, so I think it needs parenthesis. Just to be clear, I'll list all the possible options below. a) no changes needed, xzalloc_flex_struct is good as is b) only "field" needs parenthesis c) only "nr" needs parenthesis d) both "field" and "nr" need parenthesis Option d) would look like this: #define xzalloc_flex_struct(type, field, nr) \ ((type *)_xzalloc(offsetof(type, (field)[(nr)]), __alignof__(type))) What do you guys think? Cheers, Stefano
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |