2010-02-18 10 views
17

Estoy jugando con Pex y uno de los parámetros que pasa a mi método es "\0".C# - ¿A qué se equipara " 0"?

¿Qué significa eso? Supongo que es una cadena vacía ("") según el contenido de mi método. Sin embargo, si es lo mismo, ¿por qué no simplemente usar "" en lugar de "\0"?

¿Alguien sabe de qué se trata?

+0

Está pasando la cadena que contiene una barra invertida seguida por un cero, o es pasar una cadena que contiene el carácter nulo? –

+0

Esto es lo que dice el código: 'this.TestSaveString (" \ 0 ");' – Vaccano

+0

¡Gracias por todas las excelentes respuestas! Elegí Randolpho porque me dio el mayor detalle sobre lo que estaba pasando. – Vaccano

Respuesta

32

'\ 0' es un "null character". Se usa para terminar cadenas en C y algunas partes de C++. Pex está haciendo una prueba para ver cómo su código maneja el carácter nulo, probablemente buscando el exploit de seguridad Poison Null Byte.

La mayoría del código C# no tiene nada que temer; Sin embargo, si pasa su cadena al código no administrado, puede tener problemas.

Editar:

sólo para ser explícita ... Pex está pasando una cadena que contiene un carácter nulo. Esto es no una referencia nula.

+3

Tenga en cuenta que una cadena NULL NO ES lo mismo que una cadena vacía. Del artículo de MSDN: "Por el contrario, una cadena nula no se refiere a una instancia de un objeto System.String y cualquier intento de invocar un método en una cadena nula da como resultado una NullReferenceException. Sin embargo, puede usar cadenas nulas en la concatenación y operaciones de comparación con otras cadenas. Los siguientes ejemplos ilustran algunos casos en los que una referencia a una cadena nula hace y no provoca una excepción " – jfawcett

5

Es una cadena que contiene el caracter '\ 0'. C# no trata esto de ninguna manera particularmente especial: es solo el carácter unicode U + 0000. Si se escribe:

int firstCodePoint = text[0]; 

continuación encontrará firstCodePoint es 0.

3

Es una cadena con un carácter nulo. Las bibliotecas de cadenas anteriores — como las que se usan en las bibliotecas C++ o C++ más antiguas — usaron el carácter '\ 0' para indicar el final de la cadena.

Los entornos más nuevos como .Net utilizan un sistema diferente, pero hay un montón de historia alrededor de terminar una cadena con '\ 0', por lo que es un punto de error común. Las bibliotecas de prueba como Pex lo usarán para asegurarse de que su programa lo maneje correctamente.

+0

Eh ....No puedo llevarme a -1 esta vez, pero parece que estás implicando que las cadenas de C# tienen terminación nula. Ellos no son. – Randolpho

+0

@Randolpho "Los entornos más nuevos como .Net usan un sistema diferente" - me parece que estoy implicando exactamente lo contrario. –

+0

Sí. No estoy seguro de cómo algo así está implicado. –

2

Una cadena de longitud 1, que contiene el carácter \ u0000 (también conocido como NUL). Este personaje no es tratado especialmente.

En C, que utiliza \ 0 a finalizar la secuencia, también se asigna una cadena de longitud 1. En este caso, las funciones de cadena estándar reportarán una longitud de 0, ya que la cadena contiene \ 0, además de ser terminado con eso. Puede modificar de forma segura str [0], o strncat un solo carácter en él.

Cuestiones relacionadas