In MISRA-C: regola del 2004 17.4 esisteva una regola di consulenza che vieta tutte le forme di aritmetica dei puntatori. L'intento era buono, lo scopo della norma è stato un tentativo di bandire codice potenzialmente pericoloso come ad esempio:
stuff* p;
p = p + 5; // 5 stuff, not 5 bytes, bug or intentional?
e da leggere difficile codice come
*(p + 5) = something; // harder to read but equivalent to p[5]
In generale, l'intenzione è quella di consigliamo di utilizzare un iteratore intero anziché l'aritmetica del puntatore, quando si esegue il looping dei dati puntati.
Tuttavia, la regola ha anche vietato varie operazioni fondamentali del puntatore che probabilmente non sono pericolose, ad esempio ptr++
. In generale, la regola era troppo severa.
In MISRA-C: 2012 questa regola (18.4) era rilassata per vietare solo gli operatori + - += -=
.
Nel tuo caso, il buffPtr = &buffPtr[1];
era un maldestro tentativo di schivare regola 17.4, poiché la regola non ha molto senso. Invece il programmatore ha deciso di offuscare il loro programma, rendendolo meno leggibile e quindi meno sicuro.
Il modo corretto per risolvere questo problema è utilizzare l'operatore ++ e ignorare la regola 17.4. È una regola di consulenza, quindi non è necessario fare alcuna deviazione (a meno che l'implementazione locale di MISRA-C non indichi diversamente). Se hai bisogno di deviare, potresti semplicemente dire che la regola non ha alcun senso per l'operatore ++ e quindi fare riferimento a MISRA-C: 2012 18.4.
(Naturalmente, riscrivere l'intero ciclo per un ciclo for come mostrato in un'altra risposta è la migliore soluzione)
programmazione senza usare senso comune è sempre molto pericoloso, come è seguire ciecamente MISRA senza comprendere la logica suono dietro le regole, o in questo caso la mancanza di tali.
perché '(* buffPtr) ++' sarebbe sbagliato. Intendi '* buffPtr ++ = 0xFF;'? – mch
@mch Immagino che sia un refuso nel corpo della domanda. guarda il commento nel codice. –