2015-11-11 8 views
5

Sto scrivendo un driver per un sistema incorporato che esegue una versione personalizzata di linux modificato (è un handscanner). Il produttore fornisce una distribuzione Eclipse Juno personalizzata con alcune librerie ed esempi in ingresso.Sicurezza dell'uso di 0 prima della fine degli array di caratteri

L'output che ricevo dal comportamento si presenta sotto forma di un array di caratteri standard. Sto usando i singoli caratteri nella matrice per trasmettere informazioni (ids di errore e codici di errore) come questo:

if (tmp[i] == 250]) 

Dove tmp è un array di caratteri in forma di char tmp[500]; che viene prima inizializzato a 0 e poi riempito con input dal comport.

La mia domanda è:

supponendo che scorrere ogni pezzo della matrice, è sicuro da usare 0 (come in \0) in qualsiasi momento prima della fine del Array? Assumendo Io sono:

  1. Non trattarlo come una stringa (scorrendo e di utilizzarlo come un array int)
  2. In conoscenza di ciò che sta per essere lì e che cosa esattamente questo caso \ 0 in mezzo di ciò dovrebbe significare.

La ragione im chiedendo è perché ho avuto molti colleghi mi dicono che non avrei mai mai mai usare un array di caratteri che contiene \0 prima della fine, non importa le circostanze.

Il mio codice esegue attualmente come previsto, ma non so se potrebbe causare problemi in seguito.

Riscrivendolo per evitare questo comportamento sarebbe una parte non banale di lavoro.

+1

Penso che se non usi mai le funzioni di stringa ('strcpy',' strcat', ecc.) Non dovrebbe esserci nessun problema –

+1

penso che il tuo problema principale sarà fare con cose come 'tmp [i] == 250'. se tmp è un carattere, non è definito se è o meno firmato o non firmato. se è firmato, allora tale affermazione non può mai essere vera in quanto deve essere compresa tra -128 e 127 –

+0

@TomTanner È dato che il carattere è sempre senza segno. – Magisch

risposta

7

Utilizzo di un array di char come una matrice di piccoli numeri interi perfettamente a posto. Basta fare attenzione a non trasmetterlo a nessun tipo di funzione che si aspetti "stringhe".

E se vuoi essere più esplicito a riguardo, e assicurati anche che l'array stia usando unsigned char potresti usare uint8_t invece.

+0

Non decido quale sia l'array. Si prevede che sia un array di caratteri dalla funzione produttore che utilizzo per recuperare i dati. Im incerto se non convertirlo in un altro tipo farebbe male in questo. – Magisch

+0

@Magisch Non c'è nulla di male conservarlo come una matrice 'char', purché si sia consapevoli della limitazione (nessuna funzione di stringa) e anche di documentarla per futuri lettori/utenti del codice. –

+0

Va bene allora. Grazie per la tua affermazione. (I miei colleghi di solito si rimettono anche a SO come mezzo di orientamento, quindi collegarli a questo aiuterà) – Magisch