Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ---s在StringBuilder.ToString()的上下文中是什么意思?_C#_.net_Clr_Stringbuilder_Reference Source - Fatal编程技术网

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

C# ---s在StringBuilder.ToString()的上下文中是什么意思?,c#,.net,clr,stringbuilder,reference-source,C#,.net,Clr,Stringbuilder,Reference 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

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存储库中,您有一个更完整的引用:

将这些复制到局部变量中,使它们即使在存在竞争条件的情况下也保持稳定


基本上:这是一个线程方面的考虑。

不要认为是这种情况-所讨论的代码会复制到局部变量,以防止在另一个线程上更改字符串生成器实例时发生错误


我认为
---
可能与一个四个字母的脏话有关…

除了@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);
//检查我们是否会越界。

if((uint)(chunkLength+chunkOffset)已发布引用源的源代码通过一个过滤器推送,该过滤器可从源代码中删除不受欢迎的内容。Verboten单词是其中之一,Microsoft程序员在其注释中使用。开发人员的姓名也是如此,Microsoft希望隐藏他们的身份。这样的单词或名称用破折号代替

在这种情况下,您可以从CoreCLR(开源版本的.NET Framework)中了解过去的情况。CoreCLR是一个verboten词:

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


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

我们需要一个黑客来回答这个问题:)我不是黑客,但我猜无论什么
---s
都意味着以s结尾的单词或短语,程序员只是不想把它泄露出去easily@54l3d,你的名字看起来像我的名字。我打赌你会是一个很好的提问者。我猜这个短语(Jerron Vanneval的回答说是“种族条件”)在参考源发布时被省略了——而在原始MS源中它保持不变。重复的(这是更通用的,并且在前面被问到)。为了获得额外的学分,应该有人找到更多的CoreCLR中的“竞争条件”,并查找----“。这并不是一个更完整的引用,因为它肯定不仅仅是
----
。我认为它被编辑是为了避免暗示他们试图避免什么样的利用。”。如果你试图隐藏它,你到底为什么要告诉人们有多少个字符是剥削的名字?@DanField这可能只是为了确保政治正确性(特别是为了消除种族歧视)而过度热衷于寻找和替换。我认为“种族条件”最初是缩写为“种族”。即使过滤器不保留字符数,吞食“条件”也是非常奇怪的。所以种族是一个禁止的词?哪些是手工编辑的意思是“自动编辑的”?因为一个人类编辑认为种族意味着人类似乎有点奇怪不,你可以通过查看CoreCLR源代码来判断它不是。该过滤器相当愚蠢,早期版本也有一个令人讨厌的bug,导致源被发出两次。它只是盲目地使用了一系列被认为有风险的词汇。性、宗教、种族、政治、亵渎。与之相比。@HansPassant:这不是一个指导方针。嗯,不,那是给他们的读者的指南,不是给他们的内容贡献者的。OpenCLR有一个贡献指南,但没有提到亵渎。当你骂人太多太多的时候,他们很可能不会注意拉请求。真的很好奇,你认为黑客会“做”什么四个字母的脏话,从而在一个更幼稚的实现中造成不稳定?