2015-06-03 14 views
35

Die Reference Source page for stringbuilder.cs hat diesen Kommentar im ToString Methode:Was bedeutet ---- im Zusammenhang mit StringBuilder.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; 

Was bedeutet das? Ist ----s etwas, das ein böswilliger Benutzer in eine zu formatierende Zeichenfolge einfügen könnte?

+10

Wir brauchen einen Hacker, um diese Frage zu beantworten :) – 54l3d

+3

Ich bin nicht Hacker, aber ich denke t was auch immer '---- s' bedeutet ein Wort oder eine Phrase, die mit s endet, und der Programmierer wollte es einfach nicht so einfach weggeben –

+3

@ 54l3d, Ihr Name sieht aus wie L33Tspeak. Ich wette, du wärst ein guter zu fragen. – Micteu

Antwort

23

Im CoreCLR Repository Ihnen einen volleren Zitat haben:

kopieren diese in lokale Variablen, so dass sie

Github

Grundsätzlich stabil, auch in Gegenwart von Rennbedingungen sind: es ist eine Threading-Überlegung.

+2

Für zusätzliches Guthaben sollte jemand mehr Vorkommen von "Race Condition" in der CoreCLR finden und entsprechende Vorkommen von "----" finden. –

+3

Es ist nicht gerade ein volleres Zitat, da es definitiv anders ist als nur das '----'. – hatchet

+1

Warum auf jeden Fall anders? Unterschiedliche Anzahl von Zeichen? Warum gehen Sie davon aus, dass die Anzahl der Zeichen während der Transformation gleich bleibt? –

2

Denken Sie nicht, dass dies der Fall ist - der fragliche Code wird in lokale Variablen kopiert, um zu verhindern, dass schlimme Dinge passieren, wenn die String-Builder-Instanz in einem anderen Thread mutiert ist.

Ich denke, die auf ein Wort mit vier Buchstaben ...

Zusätzlich
+2

Wirklich neugierig, was vier Buchstaben Schimpfwort Sie denken, ist etwas, das ein Hacker "tun" könnte, um Instabilität in einer naiven Umsetzung zu verursachen? – OJFord

9

von @Jeroen auf die große Antwort schwören beziehen, das mehr als nur ein Einfädeln Überlegung. Es soll verhindern, dass jemand absichtlich eine Wettlaufsituation erzeugt und auf diese Weise einen Pufferüberlauf verursacht. Später im Code wird die Länge dieser lokalen Variablen überprüft. Wenn der Code die Länge der zugänglichen Variablen überprüfen war stattdessen könnte es auf einem anderen Thread geändert hat zwischen wurde die Zeitdauer geprüft und wstrcpy hieß:

 // 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); 

wirklich interessante Frage though.

38

Der Quellcode für die veröffentlichte Referenzquelle wird durch einen Filter geleitet, der anstößige Inhalte aus der Quelle entfernt. Verboten Worte sind eins, Microsoft-Programmierer use profanity in ihren Kommentaren. So sind die Namen der Entwickler, Microsoft will ihre Identität verbergen. Ein solches Wort oder ein solcher Name wird durch Bindestriche ersetzt.

In diesem Fall können Sie erkennen, was früher aus der CoreCLR, der Open-Source-Version von .NET Framework, da war. Es ist ein Wort verboten:

// diese in lokale Variablen kopieren, so dass sie auch in Gegenwart von Rennen Bedingungen

stabil sind, die von der ursprünglichen von Hand bearbeitet wurde, dass Sie sah Bevor sie an Github übergeben wird, will Microsoft auch nicht ihre Kunden beschuldigen, Hacker zu sein, hieß es ursprünglich races und verwandelte sich in ----s :)

+4

Also * Rennen * ist ein verbotenes Wort? Und * Was wurde von Hand bearbeitet? * Bedeutet "automatisch bearbeitet"? Denn ein menschlicher Redakteur, der * Rasse * für * menschliche Rasse * meint, scheint etwas seltsam zu sein. – xanatos

+1

Nein, Sie können feststellen, dass dies nicht durch einen Blick auf die CoreCLR-Quelle geschieht. Der Filter war ziemlich dumm, eine frühe Version hatte auch einen ekligen Bug, der dazu führte, dass die Quelle zweimal ausgesendet wurde. Es hat blindlings eine Liste von Wörtern angewendet, die als riskant galten. Sex, Religion, Rasse, Politik, Obszönitäten. Vergleichen Sie mit [Wikipedia Richtlinien] (http://en.wikipedia.org/wiki/Wikipedia:Sex ,_Religion_and_Politics). –

+0

@HansPassant: Das ist keine Richtlinie ... [probiere dies stattdessen] (http://en.wikipedia.org/wiki/WP:CENSOR). – Kevin