我正在玩弄Pex,其中一个参数传递到我的方法中是"\0"
。
这是什么意思?根据我的方法内容,我猜它是一个空字符串(""
)。但是,如果它和空字符串相同,为什么不直接使用""
而要使用"\0"
呢?
有人知道它是什么吗?
'\0'是一个“Null字符”,在C和某些部分的C++中用于终止字符串。Pex正在测试您的代码如何处理空字符,很可能正在寻找Poison Null Byte安全漏洞。
大多数C#代码无需担心;但如果将字符串传递给非托管代码,则可能会遇到问题。
编辑:
只是为了明确... Pex正在传递包含空字符的字符串。这不是空引用。
它是一个带有空字符的字符串。旧的字符串库(例如C语言或旧的C++库)使用'\0'字符来表示字符串的结尾。
新的环境,比如.Net使用不同的系统,但是以'\0'来结束字符串的历史很长,因此这是一个常见的错误点。测试库,例如Pex,将使用它来确保您的程序正确处理它。
这是一个包含字符 '\0' 的字符串。在C#中,它并没有特别的处理方式 - 它只是Unicode字符U+0000。如果您写:
int firstCodePoint = text[0];
那么你会发现firstCodePoint
的值为0。
一个长度为1的字符串,包含字符\u0000(也称NUL)。该字符不会被特殊处理。
C语言中使用\0来终止字符串,因此您需要分配一个长度为1的字符串。在这种情况下,标准的字符串函数将报告长度为0,因为字符串包含\0并以其结尾。您可以安全地修改str [0],或者将单个字符strncat到其中。
我刚刚发现一个很好的例子,其中\0
非常重要且必要。
假设我们想要在以下代码中删除最后一个不必要的,
。
for (int i = 0; i < 5; i++)
{
foreach (var a in "Money")
Console.Write($"{a},");
}
如果我们只是按照以下方式添加Console.Write("\b\n");
,for (int i = 0; i < 5; i++)
{
foreach (var a in "Money")
Console.Write($"{a},");
Console.Write("\b\n");
}
\0
,for (int i = 0; i < 5; i++)
{
foreach (var a in "Money")
Console.Write($"{a},");
Console.Write("\b\0\n");
}
不需要的尾随,
会消失。
this.TestSaveString("\0");
- Vaccano