Ответ 1
В репозитории CoreCLR у вас есть более полная цитата:
Скопируйте их в локальные переменные, чтобы они были стабильными даже при наличии условий гонки
В принципе: это вопрос с учетом потоков.
Страница 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
тем, что вредоносный пользователь может вставить в строку, которая будет отформатирована?
В репозитории CoreCLR у вас есть более полная цитата:
Скопируйте их в локальные переменные, чтобы они были стабильными даже при наличии условий гонки
В принципе: это вопрос с учетом потоков.
Исходный код для опубликованного исходного источника помещается через фильтр, который удаляет нежелательный контент из источника. Слова Verboten - это один, программисты Microsoft используют в своих комментариях ненормативную лексику. Точно так же имена разработчиков, Microsoft хочет скрыть свою личность. Такое слово или имя заменяется тире.
В этом случае вы можете узнать, что раньше использовалось в CoreCLR, версии .NET Framework с открытым исходным кодом. Это словесное слово:
//Скопируйте их в локальные переменные, чтобы они были стабильными даже при наличии условий раса
который был отредактирован вручную из оригинала, на который вы смотрели, прежде чем отправлять его в Github, Microsoft также не хочет обвинять своих клиентов в том, что они хакеры, изначально он сказал races
, превратившись в ----s
:)
В дополнение к большому ответу @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);
Действительно интересный вопрос, хотя.
Не думайте, что это так - данный код копирует локальные переменные, чтобы предотвратить возникновение плохих событий, если экземпляр строкового строфа мутируется в другом потоке.
Я думаю, что ----
может относиться к письму с четырьмя письмами...