----在StringBuilder.ToString()的上下文中是什么意思?

Mic*_*teu 35 .net c# clr stringbuilder reference-source

stringbuilder.csReference Source页面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;
Run Code Online (Sandbox Code Playgroud)

这是什么意思?被----s一些恶意用户可能会插入一个字符串格式化?

Han*_*ant 39

已发布的参考源的源代码通过过滤器推送,该过滤器从源中删除令人反感的内容. Verboten的话是一个,微软的程序员在他们的评论中使用亵渎语言.微软的名字也是如此,微软希望隐藏自己的身份.这样的单词或名称由短划线代替.

在这种情况下,您可以从CoreCLR(.NET Framework的开源版本)中分辨出曾经存在的内容.这是一个禁止的词:

//将这些复制到局部变量中,这样即使在竞争条件下它们也是稳定的

这是你在提交给Github之前看到的原始版本的手工编辑,微软也不想指责他们的客户是黑客,它最初说races,因此变成----s:)

  • 所以*种族*是一个禁止的词?*哪个是手工编辑的*意味着"自动编辑"?因为人类编辑认为*种族*意味着*人类*似乎有点奇怪 (5认同)

Jer*_*vel 23

在CoreCLR存储库中,您有一个更全面的报价:

将这些复制到局部变量中,即使在竞争条件下也能保持稳定

Github上

基本上:这是一个线程考虑因素.

  • @DanField这可能只是一个过于热心的发现和替换,试图确保政治正确性(特别是,消除种族主义). (6认同)
  • 我认为"竞争条件"最初缩短了"种族".即使过滤器不能保留字符的数量,吞噬"条件"也是非常奇怪的. (6认同)
  • 这不完全是一个更完整的引用,因为它绝对不仅仅是`----`. (3认同)
  • 我认为这是为了避免暗示他们试图避免使用什么样的漏洞.如果你试图隐藏它,你为什么要告诉人们利用这个名字的字符是多少呢? (3认同)
  • 对于额外的功劳,有人应该在CoreCLR中发现更多"竞争条件",并找到相应的"----". (2认同)

Dan*_*eld 9

除了@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);
Run Code Online (Sandbox Code Playgroud)

真的很有趣的问题.