2010-02-18 14 views
17

Sto giocando con Pex e uno dei parametri che passa nel mio metodo è "\0".C# - Che cosa equivale a " 0"?

Che cosa significa? La mia ipotesi è una stringa vuota ("") basata sul contenuto del mio metodo. Tuttavia, se è lo stesso, perché non usare solo "" anziché "\0"?

Qualcuno sa di cosa si tratta?

+0

è altrove passando la stringa contenente un backslash seguito da uno zero, o sta passando una stringa contenente il carattere nullo? –

+0

Questo è ciò che dice il codice: 'this.TestSaveString (" \ 0 ");' – Vaccano

+0

Grazie per tutte le ottime risposte! Ho scelto Randolpho perché mi ha dato il maggior numero di dettagli su cosa stava succedendo. – Vaccano

risposta

32

'\ 0' è un "null character". È usato per terminare le stringhe in C e alcune parti di C++. Pex sta facendo un test per vedere come il tuo codice gestisce il carattere null, probabilmente cercando l'exploit di sicurezza Poison Null Byte.

La maggior parte del codice C# non ha nulla da temere; se si passa la stringa al codice non gestito, tuttavia, si potrebbero avere problemi.

Edit:

solo per essere esplicito ... Pex sta passando una stringa contenente un carattere null. Questo è non un riferimento null.

+3

Si noti che una stringa NULL NON È uguale a una stringa vuota. Dall'articolo MSDN: "Al contrario, una stringa nulla non fa riferimento a un'istanza di un oggetto System.String e qualsiasi tentativo di richiamare un metodo su una stringa nulla risulta in una NullReferenceException. Tuttavia, è possibile utilizzare stringhe null nella concatenazione e operazioni di confronto con altre stringhe .I seguenti esempi illustrano alcuni casi in cui un riferimento a una stringa null fa e non causa l'emissione di un'eccezione " – jfawcett

5

È una stringa contenente il carattere '\ 0'. C# non tratta questo in modo particolarmente speciale: è solo unicode, il carattere U + 0000. Se si scrive:

int firstCodePoint = text[0]; 

allora troverete firstCodePoint è 0.

3

Si tratta di una stringa con un carattere null. Le librerie di stringhe meno recenti — come quella utilizzata in C o precedenti librerie C++ — utilizzavano il carattere '\ 0' per indicare la fine della stringa.

Ambienti più recenti come .Net utilizzano un sistema diverso, ma c'è molta storia attorno alla fine di una stringa con '\ 0', tale che è un comune punto di errore. Testare librerie come Pex lo userà per assicurarsi che il tuo programma lo gestisca correttamente.

+0

Eh ....Non posso portarmi a -1 questo, ma sembra che tu stia insinuando che le stringhe C# siano terminate con null. Non sono. – Randolpho

+0

@Randolpho "Ambienti più recenti come .Net utilizzano un sistema diverso" - mi sembra che sottintenda l'esatto opposto. –

+0

Sì. Non sono sicuro di come qualcosa di simile sia implicito. –

2

Una stringa di lunghezza 1, contenente il carattere \ u0000 (noto anche come NUL). Questo personaggio non è trattato in modo speciale.

In C, che utilizza \ 0 per terminare la stringa, si assegna anche una stringa di lunghezza 1. In questo caso, le funzioni di stringa standard riporteranno una lunghezza di 0, poiché la stringa contiene \ 0 e termina con esso. Puoi tranquillamente modificare str [0], o strncat un singolo carattere in esso.