我正在玩Pex,它传递给我的方法的参数之一是"\0"
.
这意味着什么?""
我的猜测是基于我的方法内容的空字符串 ( )。但是,如果它是相同的,那么为什么不只使用""
而不是"\0"
呢?
有人知道这是什么吗?
'\0' 是一个“空字符”。它用于在 C 和 C++ 的某些部分中终止字符串。Pex 正在测试您的代码如何处理空字符,可能是在寻找Poison Null Byte安全漏洞。
大多数 C# 代码无所畏惧;但是,如果您将字符串传递给非托管代码,则可能会遇到问题。
编辑:
明确地说... Pex 正在传递一个包含空字符的字符串。这不是空引用。
它是一个包含字符 '\0' 的字符串。C# 没有以任何特别的方式处理它——它只是 unicode 字符 U+0000。如果你写:
int firstCodePoint = text[0];
然后你会发现firstCodePoint
是0。
它是一个带有空字符的字符串。较旧的字符串库(如 C 或较旧的 C++ 库中使用的那样)使用 '\0' 字符来指示字符串的结尾。
.Net 等较新的环境使用不同的系统,但有很多关于以 '\0' 结尾的字符串的历史,因此这是一个常见的错误点。像 Pex 这样的测试库将使用它来确保您的程序正确处理它。
Escape Sequence
\0
Character Name
Null
Unicode Encoding
0x0000
长度为 1 的字符串,包含字符 \u0000(又名 NUL)。这个字符没有被特殊对待。
在使用 \0 终止字符串的 C 中,您还分配了长度为 1 的字符串。在这种情况下,标准字符串函数将报告长度为 0,因为字符串包含 \0 并以它终止。您可以安全地修改 str[0],或将单个字符插入其中。
我刚刚找到了一个很好的例子,其中\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");
}
不需要的尾随,
消失。