Jestem zainteresowany najkrótszym, najmodniejszym fragmentem kodu C#, który w niezawodny sposób wygeneruje błąd segfault - najlepiej bez bezpośredniego wywoływania jakiegokolwiek niezarządzanego kodu.Co to jest kanoniczna metoda generowania błędu segmentacji w języku C#?
Odpowiedz
To, o co panu chodzi, jest nieco niejasne, ale sądzę, że jest to tak dobre jak jakakolwiek dotychczasowa odpowiedź, i jest tak minimalne, jak tylko można.
System.Runtime.InteropServices.Marshal.ReadInt32(IntPtr.Zero);
Tak, dziękuję. Tego właśnie szukałem. – Tom
skompilować z csc
z opcją /unsafe
:
class Program
{
static void Main(string[] args)
{
unsafe
{
int *p = null;
*p = 5;
}
}
}
To faktycznie rzuca wyjątek NullReferenceException, który jest dość łatwy do uzyskania ze zwykłego starego .NET. Zakładam, że OP jest po coś bardziej przypomina wyjątek AccessViolationException. –
Pod pokrywami naruszenie dostępu (natywny kod wyjątku 0xC0000005) wynika z dereferencji wskaźnika pustego, która jest następnie przechwytywana przez CLR i tłumaczona na wystąpienie "System.NullReferenceException". –
Jak zauważył w komentarzach powyżej, nie ma czegoś takiego jak segfault w systemie Windows, a nie mówi nic o mono na Linux. Zakładam, że w rzeczywistości chodziło o naruszenie dostępu.
Oto sposób, aby uzyskać jedno:
unsafe {
int* a = (int*) -4;
*a = 0;
}
(musi być skompilowany z opcją /unsafe
).
Moja pierwsza próba stosowany 0 jak adres, ale okazało się to rzucać zwykły stary Wyjątek NullReferenceException, który można uzyskać bez niebezpiecznego kodu. Ale adres ujemny dostaje wyjątek AccessViolationException na moim pudełku Vista x64.
Co ciekawe, powoduje to 'NullReferenceException' na Mono 1.9.1 działa pod Linuksem, więc myślę, że jest to zależne od architektury (lub Mono robi to źle!). –
Dzięki. Jeśli chodzi o terminologię, cieszę się, że "naruszenie zasad dostępu" nazywa się segfault - zawsze tak było. – Tom
odpowiedź Michaela nie działa dla mnie, chyba że sprawa zostanie złapany teraz. Marshal.ReadInt32() po prostu daje mi "SystemError: Próba odczytu lub zapisu chronionej pamięci." z .NET 4.5 w Windows dla różnych przekazanych wartości. Użyłem jednak następujących rzeczy, które mogą być dla mnie zarówno w Windows, jak i pod 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. Co to jest "ścieżka kanoniczna"?
- 2. Co to jest ".. ::." w języku C#?
- 3. Co to jest void * w języku C#?
- 4. Co to jest metoda inline?
- 5. Co to jest metoda kanoniczna dla klienta HTTP, która nakazuje serwerowi HTTP wyłączenie odpowiedzi Gzip?
- 6. Co to jest metoda generatywna?
- 7. Co to jest metoda getApplicationContext()?
- 8. Co to jest błąd czasu wykonywania SIGSEGV w C++?
- 9. Co to jest "@_silgen_name" w języku Swift?
- 10. Co to jest "1ULL" w języku programowania
- 11. Co oznacza "[to]" oznacza w języku C++
- 12. Co to jest metoda wygodna w Javie?
- 13. Co to jest metoda skrótowa w MeteorJS?
- 14. Co to jest "return x? : 1 "oznacza w języku C?
- 15. Co to jest odpowiednik vbNullChar w języku C#?
- 16. Co to jest odpowiednik NSDictionary w języku C#?
- 17. Co to jest "alias przestrzeni nazw" w języku C++?
- 18. Co to jest użycie funkcji c_str W języku C++
- 19. Co to jest typ zerowy w języku C#?
- 20. Co to jest "==" w C?
- 21. Co to jest wyrażenie w języku Python?
- 22. Co to jest "String ..." w języku Java?
- 23. Co to jest "_csv" w języku Python?
- 24. W języku PHP, co to jest Tick?
- 25. Co to jest dosłownie w języku Java?
- 26. Co to jest "\ 00" w języku Python?
- 27. Co to jest mnemonik w języku Java?
- 28. Co to jest kodowanie w języku XML?
- 29. Co to jest dynamiczny odpowiednik C# w C++ CLI?
- 30. Co to jest odpowiednik C# w dynamicznym C++ w C++?
Nie prawdopodobne. Segfault w kodzie zarządzanym oznaczałby błąd w JIT/środowisku wykonawczym, aw niektórych przypadkach także lukę. Jeśli to możliwe, zostanie to wkrótce naprawione. – viraptor
Pełna odpowiedź na to pytanie powinna wynosić tylko kilkanaście linii. –
@viraptor: Nie, środowisko wykonawcze może obsłużyć błąd segmentacji (w systemie Windows jest to termin "naruszenie zasad dostępu") i wygenerować wyjątek NullPointerException, ale to nie to samo, co niepowodzenie segmentacji. Wszystko czego potrzebujesz to niezweryfikowalny kod (w języku C#, to znaczy kompilowanie '/ unsafe') –