Classe "SafeString" una valida alternativa alla pessima "String" ...

GOOGLE TRANSLATION

Un aggiornamento:

Dopo aver finito di scrivere SafeStrings, mi è stato chiesto di esaminare più da vicino Arduino Strings.
Si scopre che seguendo alcune linee guida è possibile utilizzare correttamente le stringhe nel codice.
Su Uno e Mega2560 risulta che le stringhe sono essenzialmente a prova di proiettile.
Per altre schede (con più memoria) vedere le linee guida nel mio tutorial
Domare le stringhe Arduino

Per ESP32 / ESP8266 che utilizza ampiamente le stringhe nelle loro librerie di supporto Web, Taming Arduino Strings suggerisce un riavvio automatico periodico e fornisce un codice di esempio per farlo.
Sto usando questo approccio su un progetto commerciale che sto facendo in questo momento.

SafeStrings ha ancora alcuni vantaggi rispetto alle stringhe Arduino

Controllo completo sull'utilizzo della memoria

Le SafeStrings sono un wrapper attorno a un char [] che fornisce sicurezza dai sovraccarichi del buffer e dall'indicizzazione fuori intervallo. Poiché SafeString utilizza un carattere fisso [], l'utilizzo della memoria viene corretto quando si crea SafeString e non cambia. Quando crei SafeString globali, il loro utilizzo della memoria viene segnalato dal compilatore, quindi è più semplice vedere quanta SRAM sta utilizzando il tuo codice. SafeString utilizza anche meno memoria perché non è necessario convertire "testo" in SafeString prima di utilizzarlo nelle funzioni compare e indexOf.

Cattura, contrassegna e ignora gli errori e stampa un messaggio dettagliato per aiutarti a correggere l'errore

SafeString controlla ogni sua chiamata di funzione per puntatori nulli, sovraccarico del buffer e indicizzazione fuori intervallo. Le chiamate di funzione che causerebbero un errore vengono ignorate, ovvero SafeString rimane invariato, l'errore viene contrassegnato e viene visualizzato un messaggio di errore dettagliato che consente di individuare il problema e risolverlo. SafeString inoltre non ha gli errori presenti nel codice di Arduino String

Lettori seriali semplici non bloccanti

Il lettore di stringhe Arduino, Serial.readStringUntil () può bloccare il ciclo in attesa durante l'attesa dei dati. Sebbene sia possibile codificare lettori non bloccanti utilizzando le stringhe, i metodi in SafeString sono più semplici e hanno una serie di funzioni avanzate come tokenizzare l'input, timeout di input non bloccanti, eco selezionabile dell'input e una funzione skipToDelimiter per saltare un- input voluto o parziale. I lettori di SafeString contano anche il numero di caratteri letti in modo da poter controllare quando è stata ricevuta un'intera risposta web.

Migliori metodi di analisi dei numeri

Come notato sopra, il metodo String toInt () può fornire risultati strani. SafeString toInt (int i), toLong (long l) ecc., Restituiscono true se la stringa è un numero valido e aggiorna l'argomento, altrimenti restituiscono false. Il metodo String toInt () restituisce solo 0 se la stringa non è un numero e restituisce 5 per "5.9" e per "5a"

Più facile da usare con le biblioteche

Le librerie di terze parti spesso restituiscono i risultati di testo come carattere *. Se usi le stringhe, farai una copia completa del testo quando assegni il risultato a una stringa, usando memoria extra. D'altra parte con SafeString, puoi semplicemente racchiudere il char * in una SafeString senza prendere una copia e quindi analizzare ed elaborare i dati in modo sicuro.

Altre funzioni di manipolazione del testo

Mentre le stringhe hanno i metodi startsWith ,endsWith, indexOf, lastIndexOf, substring, replace e remove, SafeString ha tutti questi metodi più un set completo di metodi print () per stampare su SafeString e prefix (), startsWithIgnoreCase (), indexOfCharFrom () , removeBefore (), removeFrom (), removeLast (), stoken (), nextToken () e readFrom () non bloccante, writeTo (), read (), readUntil (), readUntilToken ()

La libreria SafeString dispone anche di una classe SafeStringStream che consente di automatizzare il test degli schizzi che si aspettano di elaborare l'input dei dati Stream.

Esistono anche classi BufferedInput e BufferedOutput che forniscono buffer di input più grandi e output seriale non bloccante. Nella libreria SafeString sono incluse anche la classe temporale millisDelay non bloccante e una classe loopTimer.

Da quel poco che capisco di inglese, String non é il male assoluto, string non é poi tanto meglio, ma SafeString é bene.

... come ho già scritto altrove, in reltà, in quel "tutorial", spiega delle tecniche con cui, in realtà, minimizzi solo il danno ... prealloca lo spazio con la reserve(), ti dice che alla peggio ti tronca la String, ecc. ... per cui, da un lato ti fornisce la SafeString con cui NON hai alcun problema, che ti ritorna tuttti i codici di errore e così via, dall'altro ti da delle linee guida su come, se vuoi, puoi usare la String, sapendo però ... come devi fare e quello che può succederti.

Mah ... ok che mi spieghi come non far andare tutto in crash, ma se poi, comunque mi taglia i pezzi e non fa quello che dovrebbe fare ... a che serve ? ? ? ::slight_smile:

Guglielmo

La parte dove spiega che anche le stringhe del C non sono rose e fiori ti convince?

speedyant:
La parte dove spiega che anche le stringhe del C non sono rose e fiori ti convince?

... dice cose ovvie ... chi lavora con le stringhe classiche del 'C sa benissimo che NON deve andare oltre le dimensioni dell'array (... e la cosa è valida per TUTTI i tipi di array, non solo per gli array di char :grin:) e che in <string.h> esistono sia le funzioni senza controlo che ha elencato lui che ... quelle con controllo a cui indichi le dimensioni massime e loro non vanno oltre. Per nominare le stesse cha ha indicato in quel paragrafo: strncat(), strncpy(), ecc. ecc.

Quindi ... NO, non solo non mi convince ma lo trovo un po' fazioso.

Guglielmo

Regarding the 'n' "string.h" functions. Two points
i) most people don't bother to use them
ii) they are not that good anyway

see Security Development Lifecycle (SDL) Banned Function Calls | Microsoft Learn
for a list of 'n' functions Microsoft bans it programmers from using.

And a quote from Secure Coding in C and C ++, 2nd Edition by Robert C. Seacord, Ch5

Because the strncpy () function is not guaranteed to null-terminate the destination string, the programmer must be careful to ensure that the destination string is properly null-terminated without overwriting the last character.

The C Standard strncpy () function is frequently recommended as a “more secure” alternative to strcpy () . However, strncpy () is prone to string termination errors, as detailed shortly under "C11 Annex K Bounds-Checking Interfaces."

Re: strncat()
The problem is that the last argument to strncat () should not be the total buffer length; it should be the space remaining after the call to strncpy () . Both functions require that you specify the remaining space and not the total size of the buffer. Because the remaining space changes every time data is added or removed, programmers must track or constantly recompute the remaining space. These processes are error prone and can lead to vulnerabilities.

GOOGLE TRANSLATION

Per quanto riguarda le funzioni 'n' "string.h". Due punti
i) la maggior parte delle persone non si preoccupa di usarli
ii) comunque non sono così buoni

vedere Security Development Lifecycle (SDL) Banned Function Calls | Microsoft Learn
per un elenco di funzioni "n" Microsoft ne vieta l'utilizzo ai programmatori.

E una citazione da Secure Coding in C and C ++, 2nd Edition by Robert C. Seacord, Ch5

Poiché non è garantito che la funzione strncpy () termini in modo nullo la stringa di destinazione, il programmatore deve fare attenzione a garantire che la stringa di destinazione sia correttamente terminata con null senza sovrascrivere l'ultimo carattere.

La funzione C Standard strncpy () è spesso raccomandata come alternativa "più sicura" a strcpy (). Tuttavia, strncpy () è soggetto a errori di terminazione delle stringhe, come spiegato in dettaglio a breve in "C11 Annex K Bounds-Checking Interfaces."

Re: strncat ()
Il problema è che l'ultimo argomento di strncat () non dovrebbe essere la lunghezza totale del buffer; dovrebbe essere lo spazio rimanente dopo la chiamata a strncpy (). Entrambe le funzioni richiedono di specificare lo spazio rimanente e non la dimensione totale del buffer. Poiché lo spazio rimanente cambia ogni volta che i dati vengono aggiunti o rimossi, i programmatori devono tenere traccia o ricalcolare costantemente lo spazio rimanente. Questi processi sono soggetti a errori e possono portare a vulnerabilità.

Sorry, but ... any manipulation of any type of array is NOT "absolutely safe" in 'C' ... it is a limit of 'C' (no control over the array bounds) ... you need to learn how to live with it! :smiley:

ITALIANO

Perdona, ma ... ogni manipolazione di qualsiasi tipo di array NON è "assolutamente sicura" in 'C' ... è un limite del 'C' (nessun controllo sugli estremi di un array) ... occorre saperci convivere ! :smiley:

Guglielmo

Fortunately you don't have to learn to live with it for char arrays

You can use either Arduino Strings or SafeStrings which do the extra checks for you and protect you from silly mistakes and makes using char[]s safe.

Both these libraries assert control over the extremes of the array and over come the inherit limits of C's '\0' terminated strings.

Either of those libraries are fare safer to program with then using low level c-string methods to manipulate char [].

GOOGLE TRANSLATION

Fortunatamente non devi imparare a conviverci per gli array di caratteri

Puoi usare Arduino Strings o SafeStrings che fanno i controlli extra per te e ti proteggono da errori stupidi e rendono sicuro l'uso di char [] s.

Entrambe queste librerie affermano il controllo sugli estremi dell'array e superano i limiti di ereditarietà delle stringhe terminate '\ 0' del C.

Entrambe queste librerie sono più sicure da programmare utilizzando metodi c-string di basso livello per manipolare char [].

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.