私はPexで遊んでいますが、メソッドに渡されるパラメーターの1つはです"\0"
。
どういう意味ですか?私の推測では""
、メソッドの内容に基づく空の文字列()です。しかし、それが同じなら、なぜ""
代わりに使用しないの"\0"
ですか?
誰もがそれが何であるか知っていますか?
'\0'は「ヌル文字」です。これは、CおよびC++の一部で文字列を終了するために使用されます。Pexは、コードがnull文字をどのように処理するかを確認するためのテストを行っており、 PoisonNullByteセキュリティエクスプロイトを探している可能性があります。
ほとんどのC#コードには何も恐れることはありません。ただし、文字列をアンマネージコードに渡すと、問題が発生する可能性があります。
編集:
明確にするために...Pexはヌル文字を含む文字列を渡しています。これはnull参照ではありません。
文字「\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
文字\u0000(別名NUL)を含む長さ1の文字列。このキャラクターは特別に扱われません。
文字列を終了するために\0を使用するCでは、長さ1の文字列も割り当てます。この場合、文字列には\ 0が含まれ、それで終了するため、標準の文字列関数は長さ0を報告します。str [0]を安全に変更するか、1文字を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");
}
不要な末尾,
が消えます。