2015-04-13 17 views
5

Sto sviluppando un'applicazione incorporata in C, che deve essere conforme agli standard MISRA. Comporterà l'uso di stringhe contenenti segni polacchi (ąęćłńśźż). Ho provato codifica utilizzando ottali/esadecimali sequenze di escape:Come codificare i segni est-europei (polacchi) usando semplici sequenze di escape?

dictionary[archive_error] = "B" "\x88" "ąd pamieci"; 

ma quelli sono proibite dalla regola 4.1. di MISRA-C 2004. Questa regola è richiesta .

La mia domanda è: è possibile e come codificare questo set di caratteri utilizzando solo sequenze di escape semplici di ISO/IEC 9899?

+0

non credo di avere sequenze di escape per tali caratteri (ma quelli che coinvolgono la loro numerico valore). Cosa ti impedisce di usare i caratteri reali nella stringa? – Jack

+0

@Jack Quando si tratta di caratteri non standard oltre al classico ASCII a 7 bit, si incontrano ora situazioni in cui la tabella dei caratteri dell'editor di testo e/o del sistema operativo desktop e/o del compilatore e/o del sistema di destinazione sono diversi . Sarebbe l'ideale se tutti usassero Unicode, ma non è sempre così. – Lundin

risposta

3

In non è chiaro quale versione MISRA si sta utilizzando.

Regola 4.1 di MISRA-C: il 2004 proibisce semplicemente sequenze di escape non standard. In MISRA-C: 2004 TC1 questo è stato in seguito modificato per vietare tutte le sequenze di escape esadecimali e ottali (hanno un comportamento definito dall'implementazione a meno che non si presta attenzione). Apparentemente questa regola e la sua presunta correzione erano un po 'trucidate dal comitato.

La regola è stata correttamente corretta nell'ultimo MISRA-C: 2012, dove la regola 4.1 afferma che le sequenze di escape devono essere terminate, sia con l'inizio di una nuova sequenza di escape che con la fine della stringa letterale, proprio come nel tuo esempio.

Quindi il codice che hai postato non è conforme a MISRA-C: 2004, ma è completamente conforme a MISRA-C: 2012. Se stai usando il primo, vorrei solo aumentare una deviazione e fare riferimento alla regola MISRA-C: 2012 4.1.

In caso contrario, un work-around è di usare semplicemente letterali carattere misto con gli interi, invece di stringhe letterali:

dictionary[archive_error] = {'B', 0x88u, 'a', ... , '\0'}; 
+0

Io uso la versione 2004, inclusa ora nelle modifiche. Verificherò e fornirò un feedback –

+0

Ok, la tua soluzione sembra essere corretta, anche se piuttosto noiosa da usare, se ho un sacco di stringhe molto lunghe. Ciò introdurrà più disordine nel codice che qualsiasi guadagno potrei avere su di esso. Tuttavia, mi hai fatto sollevare la questione del cambiamento degli standard MISRA nel progetto. –

+2

@ MichałSzydłowski Oltre all'assistenza C99, MISRA 2012 ha ottenuto anche molte "correzioni" come questa. Il problema principale è in genere che dovresti aggiornare il tuo analizzatore statico, che è costoso. Per lo meno è possibile acquistare una copia di MISRA 2012 e leggerla, vedere se ci sono altre cose lì che renderebbero più semplice la vostra implementazione MISRA. – Lundin