----s在StringBuilder.ToString()上下文中是什么意思?
本文关键字:是什么 意思 上下文 StringBuilder ToString ----s | 更新日期: 2023-09-27 17:53:27
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 (. net框架的开源版本)中看出以前的内容。
//将这些变量复制到局部变量中,这样即使存在race条件
是在提交给Github之前从你看到的原始手工编辑的,微软也不想指责他们的客户是黑客,它最初说races
,因此变成了----s
:)
在CoreCLR存储库中你有一个更完整的引用:
Github将这些复制到局部变量中,使它们即使在存在竞争条件时也是稳定的
基本上:这是一个线程的考虑。
除了@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);
这个问题很有趣
不要认为情况是这样的——如果字符串构建器实例在另一个线程上发生了变化,那么问题代码会复制到局部变量中,以防止糟糕的事情发生。
我认为----
可能与四个字母的脏话有关…