2011-09-27 14 views
11

Tengo un montón de corrupción en mi programa administrado de subprocesos múltiples. Al hacer algunas pruebas, descubrí que la corrupción ocurre solo cuando los hilos de fondo están activos en el programa (son intercambiables). Los hilos usan algunos componentes de terceros..NET 4: ¿Puede el código administrado solo causar una corrupción de montón?

Después de examinar el código de los hilos y componentes 3 ª parte (con .NET Reflector) me encontré con que todos ellos son administrados, es decir, sin "inseguros" o "DllImportAttribute" o "P/Invoke". Parece que el código puramente administrado causa una corrupción de montón, ¿es esto posible?

ACTUALIZACIÓN

Aparte de utilizar la clase Marshal, es posible dañar la pila con hilos no estando sincronizado correctamente? Un ejemplo sería muy apreciado.

+2

El hecho de que sean todo administrado, no significa que todo sea seguro para subprocesos. ¿Se está asegurando de que el código se ejecute de manera segura para hilos, utilizando bloqueos, etc. cuando sea necesario? –

+0

También hay métodos de clase Marshal que pueden hacer esto. –

+2

@ChrisDunaway, ¿está diciendo que el bloqueo inadecuado o la ejecución de subprocesos de manera no segura para subprocesos puede dañar el montón incluso sin utilizar la clase Marshal? Tenía una respuesta que esto no es posible ([aquí] (http://stackoverflow.com/questions/7471288/what-tools-are-available-to-detect-heap-corruption-in-net-c-program/ 7471468 # 7471468)). –

Respuesta

12

Es definitivamente posible corromper el montón sin el uso de código inseguro. La clase Marshal es su amigo/enemigo aquí

IntPtr ptr = new IntPtr(50000); // Random memory 
byte[] b = new byte[100]; 
Marshalp.Copy(b, 0, ptr, 100); 

Esto efectivamente copias 100 consecutivos 0 de en el montón en la dirección 50000.

Otra forma es con diseños struct explícitas

[StructLayout(LayoutKind.Explicit)] 
struct S1 
{ 
    [FieldOffset(0)] 
    internal string str; 

    [FieldOffset(0)] 
    internal object obj; 
} 

S1 s = new S1(); 
s.obj = new Program(); 
s.str.Trim(); // Hope that works ... :) 
+0

Re. structs, común '[StructLayout (LayoutKind.Sequential)]' no causará la corrupción del montón, ¿verdad? –

+0

@net_prog no, 'LayoutKind.Explicit' es necesario para que este truco funcione/crash :) – JaredPar

+0

@net_prog en * general * no es posible que el código administrado corrompa el montón. Estos son solo algunos ... casos extremos que podrían causarlo. Es * posible * aunque improbable que aciertes un error CLR. – JaredPar

Cuestiones relacionadas