El operando de la derecha de un operador lógico || tiene efectos secundarios persistentes debido a la llamada a la función detectError() .
if ( ( detect() == VALID ) || ( detectError() == INVALID ) ) { up( a,b ); } typedef enum { C; }E_name; typedef struct { E_name be:4; }S_name; S_name name;persistent_side_effect: La expresión name.be = C tiene un efecto secundario persistente: modifica el objeto no local okay.be = C.
sint16 detectError(void) { name.be = C; }Pude resolver el operador lógico &&, ¿hay alguna solución para || ¿operador?
Seguramente el trabajo más simple para esto es:
whateverType detectFlag1 = detect(); whateverType detectFlag2 = detectError(); if ( ( detectFlag1 == VALID ) || ( detectFlag2 == INVALID ) ) { up( a,b ); }¿Código simple y claro, sin posibles efectos secundarios?
En general, el código con problemas de calidad de MISRA-C debe ser determinista y debe existir al menos un caso de uso en el que se ejecute alguna parte del código (cobertura de código). En este caso, no se sabe si se llama a detectError() o no, lo que puede o no ser problemático dependiendo de si esa función contiene algún efecto secundario.
Además, el sentido común no encaja bien con "si la detección es válida o la detección del error no es válida". ¿Qué se supone que significa eso, si la detección falló pero no pudo detectar errores, entonces eso no dejaría su programa en un estado indefinido?
Por supuesto, no tengo idea de qué están haciendo estas funciones, pero tal vez al menos considere una mejor denominación del identificador. Tal vez "detectar error" debería llamarse "obtener el último error" o algo así.
Suponiendo que el código es correcto, puede reescribirlo de una manera más clara pero equivalente a esta:
if(detect() == VALID) { up(a, b); } else if(detectError() == INVALID) { up(a, b); } else { ; // possibly handle this scenario or leave it blank } Tenga en cuenta que el else es obligatorio según el código de autodocumentación/programación defensiva de MISRA-C.
Otras preocupaciones:
sint16 . Utilice C sint16_t estándar de stdint.h en su lugar. Si está atascado con C90, haga typedefs correspondientes a los nombres stdint.h .