----s 在 StringBuilder.ToString() 的上下文中是什么意思?
What does ----s mean in the context of StringBuilder.ToString()?
Reference Source page for stringbuilder.cs 在 ToString
方法中有这个注释:
if (chunk.m_ChunkLength > 0)
{
// Copy these into local variables so that they
// are stable even in the presence of ----s (hackers might do this)
char[] sourceArray = chunk.m_ChunkChars;
int chunkOffset = chunk.m_ChunkOffset;
int chunkLength = chunk.m_ChunkLength;
这是什么意思? ----s
恶意用户可能会插入要格式化的字符串吗?
在 CoreCLR 存储库中,您有更完整的引用:
Copy these into local variables so that they are stable even in the presence of race conditions
基本上:这是一个线程考虑因素。
不要认为是这种情况 - 有问题的代码会复制到局部变量,以防止在字符串生成器实例在另一个线程上发生突变时发生坏事。
我认为 ----
可能与四个字母的脏话有关...
除了@Jeroen 的出色回答之外,这不仅仅是一个线程考虑因素。这是为了防止有人故意创建竞争条件并以这种方式导致缓冲区溢出。稍后在代码中,检查该局部变量的长度。如果代码改为检查可访问变量的长度,它可能在检查时间长度和调用 wstrcpy
之间的不同线程上发生变化:
// Check that we will not overrun our boundaries.
if ((uint)(chunkLength + chunkOffset) <= ret.Length && (uint)chunkLength <= (uint)sourceArray.Length)
{
///
/// imagine that another thread has changed the chunk.m_ChunkChars array here!
/// we're now in big trouble, our attempt to prevent a buffer overflow has been thawrted!
/// oh wait, we're ok, because we're using a local variable that the other thread can't access anyway.
fixed (char* sourcePtr = sourceArray)
string.wstrcpy(destinationPtr + chunkOffset, sourcePtr, chunkLength);
}
else
{
throw new ArgumentOutOfRangeException("chunkLength", Environment.GetResourceString("ArgumentOutOfRange_Index"));
}
}
chunk = chunk.m_ChunkPrevious;
} while (chunk != null);
虽然这个问题真的很有趣。
已发布的参考源的源代码通过过滤器推送,从源中删除令人反感的内容。 Verboten 话是一个,Microsoft 程序员use profanity 在他们的评论中。开发者的名字也是如此,微软想隐藏他们的身份。这样的词或名称用破折号代替。
在这种情况下,您可以从 .NET Framework 的开源版本 CoreCLR 中分辨出过去的内容。这是一个禁止词:
// Copy these into local variables so that they are stable even in the presence of race conditions
这是你在提交给 Github 之前看到的原文的手工编辑,微软也不想指责他们的客户是黑客,它最初说 races
,从而变成 ----s
:)
Reference Source page for stringbuilder.cs 在 ToString
方法中有这个注释:
if (chunk.m_ChunkLength > 0)
{
// Copy these into local variables so that they
// are stable even in the presence of ----s (hackers might do this)
char[] sourceArray = chunk.m_ChunkChars;
int chunkOffset = chunk.m_ChunkOffset;
int chunkLength = chunk.m_ChunkLength;
这是什么意思? ----s
恶意用户可能会插入要格式化的字符串吗?
在 CoreCLR 存储库中,您有更完整的引用:
Copy these into local variables so that they are stable even in the presence of race conditions
基本上:这是一个线程考虑因素。
不要认为是这种情况 - 有问题的代码会复制到局部变量,以防止在字符串生成器实例在另一个线程上发生突变时发生坏事。
我认为 ----
可能与四个字母的脏话有关...
除了@Jeroen 的出色回答之外,这不仅仅是一个线程考虑因素。这是为了防止有人故意创建竞争条件并以这种方式导致缓冲区溢出。稍后在代码中,检查该局部变量的长度。如果代码改为检查可访问变量的长度,它可能在检查时间长度和调用 wstrcpy
之间的不同线程上发生变化:
// Check that we will not overrun our boundaries.
if ((uint)(chunkLength + chunkOffset) <= ret.Length && (uint)chunkLength <= (uint)sourceArray.Length)
{
///
/// imagine that another thread has changed the chunk.m_ChunkChars array here!
/// we're now in big trouble, our attempt to prevent a buffer overflow has been thawrted!
/// oh wait, we're ok, because we're using a local variable that the other thread can't access anyway.
fixed (char* sourcePtr = sourceArray)
string.wstrcpy(destinationPtr + chunkOffset, sourcePtr, chunkLength);
}
else
{
throw new ArgumentOutOfRangeException("chunkLength", Environment.GetResourceString("ArgumentOutOfRange_Index"));
}
}
chunk = chunk.m_ChunkPrevious;
} while (chunk != null);
虽然这个问题真的很有趣。
已发布的参考源的源代码通过过滤器推送,从源中删除令人反感的内容。 Verboten 话是一个,Microsoft 程序员use profanity 在他们的评论中。开发者的名字也是如此,微软想隐藏他们的身份。这样的词或名称用破折号代替。
在这种情况下,您可以从 .NET Framework 的开源版本 CoreCLR 中分辨出过去的内容。这是一个禁止词:
// Copy these into local variables so that they are stable even in the presence of race conditions
这是你在提交给 Github 之前看到的原文的手工编辑,微软也不想指责他们的客户是黑客,它最初说 races
,从而变成 ----s
:)