﻿# V2644\. MISRA\. Controlling expression of generic selection must not have side effects\.

This diagnostic rule is based on the [MISRA](https://misra.org.uk/) \(Motor Industry Software Reliability Association\) software development guidelines\.

This diagnostic rule is relevant only for C\.

The controlling expression of the [\_Generic](https://en.cppreference.com/w/c/language/generic.html) \(C11\) construct shall not contain any side effects if the generic selection expression is not obtained via macro expansion\.

This restriction exists because the controlling expression is [never evaluated](https://en.cppreference.com/w/c/language/generic.html#Notes)\. Therefore, any side effects in the expression do not change the program state\.

The side effects include:

1. modifications of any variable \(any increment/decrement or assignment\);
1. any function calls\.

The example:

```cpp
#if SOME_CONDITION
#define DATA_TYPE int
#else
#define DATA_TYPE unsigned
#endif // SOME_CONDITION

typedef struct CustomType
{
  DATA_TYPE data;
} *const CustomCPTR;

void InitializeData(const void *ptr)
{
  CustomCPTR customData = (CustomCPTR)(ptr);

  _Bool isOk = (_Generic(customData->data = 0
               , unsigned int : 1
               , default: 0));

  if (!isOk) return;
  // Do something
}
```

The code contains a function that shall initialize a member of a structure\. It starts with checking whether the `data` member has the expected type\. The initialization of the `data` member is executed along with the check\. Regardless of the scenario, it is expected that the `data` member is initialized to zero\. However, the initialization does not occur because the `customData->data = 0` expression appears in an unevaluated context\.

The fix:

```cpp
void InitializeData(const void *ptr) {
  CustomCPTR customData = (CustomCPTR)(ptr);
  customData->data = 0;

  _Bool isOk = (_Generic(customData->data
               , unsigned int : 1
               , default: 0));
  if (!isOk) return;
  // Do something
}
```