Estoy interesado en la parte más corta y más precisa del código C# que produzca de manera confiable una segfault, idealmente sin llamar directamente a ningún código no administrado.¿Cuál es una manera canónica de producir una falla de segmentación en C#?
Respuesta
Lo que está buscando no está nada claro, pero supongo que hasta ahora es tan bueno como cualquier respuesta, y es lo mínimo posible.
System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero);
Sí, gracias. Eso es lo que buscaba. – Tom
compilar con csc
con la opción /unsafe
:
class Program
{
static void Main(string[] args)
{
unsafe
{
int *p = null;
*p = 5;
}
}
}
Eso en realidad arroja una NullReferenceException, que es bastante fácil de obtener con simple .NET. Supongo que OP está buscando algo más parecido a AccessViolationException. –
Debajo de las cubiertas, una violación de acceso (código de excepción nativo 0xC0000005) resulta de la desreferencia del puntero nulo que luego es atrapada por el CLR y traducida a una instancia de 'System.NullReferenceException'. –
Como se señaló en los comentarios anteriores, no hay tal cosa como una violación de segmento en Windows, y no dijo nada acerca de mono en Linux. Así que supongo que realmente quiso decir una violación de acceso.
Aquí está una manera de conseguir uno:
unsafe {
int* a = (int*) -4;
*a = 0;
}
(se debe compilar con la opción /unsafe
.)
Mi primer intento utilizan los botones 0 como la dirección, pero que resultó lanzar una llanura de edad NullReferenceException, que puede obtener sin un código inseguro. Pero la dirección negativa obtiene una AccessViolationException en mi cuadro Vista x64.
Curiosamente, esto da como resultado 'NullReferenceException' en Mono 1.9.1 que se ejecuta en Linux, por lo que supongo que depende de la arquitectura (o Mono se equivoca!). –
Gracias. En lo que respecta a la terminología, estoy contento de llamar a una "violación de acceso" un segfault, siempre lo he sido. – Tom
respuesta de Michael no estaba trabajando para mí, tal vez ese caso está atrapado ahora. Marshal.ReadInt32() solo me da un "SystemError: Intenté leer o escribir en la memoria protegida". con .NET 4.5 en Windows para varios valores pasados. Utilicé lo siguiente, sin embargo, segfeults para mí tanto en Windows como en mono 4.0.4.1:
using System.Runtime.InteropServices;
[UnmanagedFunctionPointer(CallingConvention.Cdecl)]
public delegate void UNMANAGED_CALLBACK();
public void Crash()
{
var crash = (UNMANAGED_CALLBACK)Marshal.GetDelegateForFunctionPointer((IntPtr) 123, typeof(UNMANAGED_CALLBACK));
crash();
}
- 1. ¿Por qué recibo una falla de segmentación?
- 2. función de ordenación C++ falla de segmentación
- 3. falla de segmentación getopt_long_only
- 4. ¿Cuál es la diferencia entre una falla de segmentación y un desbordamiento de pila?
- 5. Manejo de falla de segmentación
- 6. falla de segmentación: 11
- 7. ¿Qué causa una falla de segmentación de Python?
- 8. Falla de segmentación de Sprintf
- 9. ¿Cuál es la mejor manera de producir una tilde en LaTeX para un sitio web?
- 10. falla de segmentación node.js: 11
- 11. ¿Cuál es la mejor manera de producir resultados HTML en C++?
- 12. falla de segmentación con strcpy
- 13. ¿Cuál es la forma canónica de recortar una cadena en Ruby sin crear una nueva cadena?
- 14. manera canónica de aleatorizar un NSArray en el Objetivo C
- 15. GHC: falla de segmentación en condiciones extrañas
- 16. ¿Cuál es la implementación canónica del descuento?
- 17. glGenBuffers() bloqueando con falla de Segmentación. (C++/GLFW/GLEW)
- 18. programación en C, ¿por qué esta declaración de matriz grande produce una falla de segmentación?
- 19. Ejecución de printf() y falla de segmentación
- 20. accediendo a un mapa estático de una función de miembro estático - falla de segmentación - C++
- 21. ¿Cuál es SIGSEGV, error de segmentación en Qt
- 22. Generando una ruta canónica
- 23. Número de línea de falla de segmentación
- 24. En OCaml, ¿cuál es la forma canónica de comparar contra múltiples argumentos de una función?
- 25. ¿Cuál es la mejor manera de hacer una simple GUI multiplataforma en C++?
- 26. ¿Cuál es la forma canónica de unir cadenas en una lista?
- 27. Problema con strtok y falla de segmentación
- 28. ¿Cuál es la manera más fácil en C# para recortar una nueva línea de una cuerda?
- 29. ¿Cuál es una buena manera de escribir una interfaz de usuario Cocoa en una aplicación Erlang?
- 30. ¿Cuál es su forma preferida de producir gráficos en una aplicación web de Ruby on Rails?
No es probable que suceda. Segfault en el código administrado significaría un error en el JIT/tiempo de ejecución y en algunas situaciones una vulnerabilidad. Si es posible, se solucionará pronto. – viraptor
Una respuesta compilable completa a esto debería ser solo una docena de líneas. –
@viraptor: No, el tiempo de ejecución puede manejar el error de segmentación (en Windows el término es "infracción de acceso") y lanzar una NullPointerException, pero eso no es lo mismo que no tener nunca un error de segmentación. Todo lo que necesita es código no verificable (en C#, eso significa compilar '/ inseguro ') –