Подтвердить что ты не робот

Что означает ---- s в контексте StringBuilder.ToString()?

Страница Reference Source для 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 тем, что вредоносный пользователь может вставить в строку, которая будет отформатирована?

4b9b3361

Ответ 1

В репозитории CoreCLR у вас есть более полная цитата:

Скопируйте их в локальные переменные, чтобы они были стабильными даже при наличии условий гонки

Github

В принципе: это вопрос с учетом потоков.

Ответ 2

Исходный код для опубликованного исходного источника помещается через фильтр, который удаляет нежелательный контент из источника. Слова Verboten - это один, программисты Microsoft используют в своих комментариях ненормативную лексику. Точно так же имена разработчиков, Microsoft хочет скрыть свою личность. Такое слово или имя заменяется тире.

В этом случае вы можете узнать, что раньше использовалось в CoreCLR, версии .NET Framework с открытым исходным кодом. Это словесное слово:

//Скопируйте их в локальные переменные, чтобы они были стабильными даже при наличии условий раса

который был отредактирован вручную из оригинала, на который вы смотрели, прежде чем отправлять его в Github, Microsoft также не хочет обвинять своих клиентов в том, что они хакеры, изначально он сказал races, превратившись в ----s:)

Ответ 3

В дополнение к большому ответу @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);

Действительно интересный вопрос, хотя.

Ответ 4

Не думайте, что это так - данный код копирует локальные переменные, чтобы предотвратить возникновение плохих событий, если экземпляр строкового строфа мутируется в другом потоке.

Я думаю, что ---- может относиться к письму с четырьмя письмами...