35

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悪意のあるユーザーがフォーマットする文字列に挿入する可能性のあるものはありますか?

4

4 に答える 4

39

公開された参照ソースのソース コードは、好ましくないコンテンツをソースから削除するフィルターを介してプッシュされます。 禁止用語は 1 つです。Microsoft のプログラマーは、コメントで冒とく的な表現を使用します。開発者の名前も同様で、Microsoft は彼らの身元を隠したいと考えています。そのような単語または名前はダッシュで置き換えられます。

この場合、.NET Framework のオープンソース バージョンである CoreCLR から何があったかがわかります。それは禁止された言葉です:

// これらをローカル変数にコピーして、競合状態が発生しても安定するようにします

racesこれはGithubに提出される前に----sあなたが見たオリジナルから手作業で編集されたものですが、マイクロソフトは顧客をハッカーであると非難したくありません.

于 2015-06-03T22:31:17.560 に答える
23

CoreCLR リポジトリには、より完全な引用があります。

これらをローカル変数にコピーして、競合状態が発生しても安定するようにします

ギットハブ

基本的に、これはスレッドに関する考慮事項です。

于 2015-06-03T22:11:35.863 に答える
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);

しかし、本当に興味深い質問です。

于 2015-06-03T22:18:23.677 に答える
2

これが事実だとは思わないでください - 問題のコードはローカル変数にコピーされ、文字列ビルダのインスタンスが別のスレッドで変更された場合に悪いことが起こるのを防ぎます。

----4文字の罵り言葉に関係していると思います...

于 2015-06-03T22:13:16.057 に答える