Apa cara termudah untuk membuat crash program C ++?

318

Saya mencoba membuat program Python yang berinteraksi dengan proses crash yang berbeda (itu di luar kendali saya). Sayangnya program saya berinteraksi dengan bahkan tidak crash dengan andal! Jadi saya ingin membuat program C ++ cepat yang macet dengan sengaja tapi saya tidak benar-benar tahu cara terbaik dan terpendek untuk melakukan itu, apakah ada yang tahu apa yang harus dimasukkan di antara saya:

int main() {
    crashyCodeGoesHere();
}

untuk membuat crash program C ++ saya andal

jonathan topf
sumber
4
Anda dapat menggunakan perakitan inline untuk mencoba mengeksekusi instruksi asm { cli; };
rahasia
@aitchnyu Saya pikir ada perbedaan dalam kegunaan jawaban untuk setiap pertanyaan. (FYI: Saya belum memilih apa pun untuk kedua pertanyaan)
Andrew Barber
ada komentar tentang melempar pengecualian saat seseorang sudah mempropagandakan ?? tlg jawaban saya di bawah ini sebagai komentar
Abhinav
4
Redis menggunakan *((char*)-1) = 'x';kode berikut untuk memicu kerusakan agar dapat melakukan debug, baca selengkapnya di jawaban
Shafik Yaghmour
Saya menemukan pertanyaan ini mencari kasus uji untuk sistem pelaporan kerusakan. Saya perlu memaksa crash selama runtime normal untuk memanggil crash reporter dan pengiriman stack dump. Terima kasih!
Cory Trese

Jawaban:

264

The abort()fungsi mungkin Anda terbaik. Ini adalah bagian dari pustaka standar C, dan didefinisikan sebagai "menyebabkan penghentian program yang tidak normal" (misalnya, kesalahan fatal atau crash).

duskwuff -inactive-
sumber
14
Perhatikan bahwa crash through abort()tidak memanggil destruktor atau atexitfungsi apa pun , meskipun itu mungkin tidak masalah di sini.
Xeo
139
@ Xeo: Jika ia memanggil destruktor dan atexits, itu tidak akan menjadi crash sekarang kan?
Donal Fellows
Karena abort()jawaban yang benar, maka apakah 'keluar (-1); `dapat diterima?
asir6
9
Tidak, karena tidak menyebabkan kerusakan, hanya melaporkan sesuatu yang tidak dapat dilakukan.
boatcoder
Windows. GCC-5.4.0. Kode keluar: 3. Tidak ada kotak pesan kesalahan. Pesan konsol: "Aplikasi ini telah meminta Runtime untuk menghentikannya dengan cara yang tidak biasa. Silakan hubungi tim dukungan aplikasi untuk informasi lebih lanjut.".
Vadzim
113

Mencoba:

raise(SIGSEGV);  // simulates a standard crash when access invalid memory
                 // ie anything that can go wrong with pointers.

Ditemukan di:

#include <signal.h>
Martin York
sumber
3
Ini lebih dari sekedar implementasi-didefinisikan - sinyal dapat ditangkap signal(). Namun, sebagian besar aplikasi waras tidak.
duskwuff -inactive-
12
Ini akan crash dengan cara yang persis sama dengan SIGSEGV normal dalam aplikasi (yang merupakan cara kebanyakan aplikasi crash). Ini didefinisikan dengan baik apa yang dilakukannya (secara default ia keluar dari aplikasi dan menghasilkan file inti). Ya, Anda dapat mengatur handler, tetapi jika Anda memilikinya, Anda tidak ingin mengujinya dengan cara yang sama !!
Martin York
1
+1 untuk raise(). Ini memungkinkan Anda menguji banyak jenis pengecualian dengan hanya mengubah argumen.
3
solusi favorit, namun tergantung platform.
Nadim Farhat
@NadimFarhat: Dengan cara apa. Sinyal adalah sinyal pada semua platform.
Martin York
74

Membagi dengan nol akan merusak aplikasi:

int main()
{
    return 1 / 0;
}
Roee Gavirel
sumber
29
Bergantung pada seberapa pintar kompiler Anda, ini akan ditangkap pada waktu kompilasi. Saya tahu bahwa visual studio 2008 tidak akan mengkompilasi ini untuk c ++ atau c #.
AidanO
2
Saya telah mengkompilasi dan menjalankannya, apakah Anda ingin saya mengampelas Anda .exe?
Roee Gavirel
1
Dalam konfigurasi rilis di Visual Studio versi terbaru seperti 2010, itu akan berjalan tanpa masalah. Saya kira ini beberapa optimasi.
tedyyu
2
iirc itu tidak crash di lengan
sherpya
2
Ini adalah perilaku yang tidak terdefinisi dan tidak dijamin macet. Seringkali kompiler menganggap perilaku tidak terdefinisi tidak dapat dijangkau. Ini dapat menyebabkan tubuh mainsepenuhnya dihapus termasuk retinstruksi. Eksekusi bisa saja jatuh ke dalam fungsi berikut.
usr
64
*((unsigned int*)0) = 0xDEAD;
Keith Nicholas
sumber
54
Ini tidak dijamin macet.
Pemrogram Windows
8
@ Program Windows: tidak, tidak dijamin . Tetapi OS mana yang tidak menghentikan aplikasi yang mencoba mengakses memori di alamat 0?
Joachim Sauer
29
"Tapi OS waras mana yang tidak menghentikan aplikasi yang mencoba mengakses memori di alamat 0?" - Itu bukan apa yang ingin kamu tanyakan, tapi aku tetap akan menjawab. Di beberapa komputer ada RAM di alamat 0, dan itu sangat berarti bagi sebuah program untuk menyimpan nilai di sana. Pertanyaan yang lebih bermakna adalah "OS mana yang tidak menghentikan aplikasi yang mengakses memori di alamat yang disediakan oleh implementasi C ++ untuk null pointer?" Dalam hal ini saya tidak tahu. Tetapi program aslinya adalah tentang bahasa C ++ bukan tentang OS.
Pemrogram Windows
6
Perilaku yang tidak terdefinisi. Tidak apa-apa untuk melakukan hal ini. Mesin yang tidak akan mogok: Apa pun yang menjalankan prosesor seri Z80 (saya berasumsi (Z80 saya tidak melakukan apa-apa)).
Martin York
28
Meskipun ini tidak dijamin macet, ini adalah salah satu jenis kerusakan paling umum di C ++. Jadi jika Anda ingin mensimulasikan kecelakaan, ini adalah cara "asli" untuk melakukannya :)
Chris Burt-Brown
53

Nah, apakah kita berada di stack overflow , atau tidak?

for (long long int i = 0; ++i; (&i)[i] = i);

(Tidak dijamin macet dengan standar apa pun, tetapi tidak ada jawaban yang disarankan termasuk yang diterima karena SIGABRTbisa saja tertangkap. Dalam praktiknya, ini akan macet di mana-mana.)

sam hocevar
sumber
4
Saya dapat melihat bahwa menjadi lucu pada sistem dengan halaman kode yang tidak dilindungi dan Anda menimpa program Anda dengan beberapa kode yang secara tidak sengaja merupakan loop tak terbatas yang tidak melakukan apa-apa. Sangat sangat sangat sangat tidak mungkin tetapi berpotensi terjadi.
Martin York
@ Loki: Bagaimana jika hanya membaca dari setiap byte 4000? Apakah itu lebih kecil kemungkinannya untuk crash? Jelas tidak terlalu berbahaya.
Mooing Duck
70
Algoritma menabrak itu bukan O (1)!
Anton Barkovsky
@ MoooDuck: Saya hanya membuat komentar lucu. Jangan menganggapnya serius :-) Tetapi akan menarik jika seseorang menemukan urutan instruksi yang melakukan sesuatu yang lucu.
Martin York
1
@LokiAstari: Anda memang benar. Saya malah memikirkannya (&i)[i] += !i, tetapi saya khawatir kompilernya mungkin cukup pintar dan ingin mengoptimalkannya. :-)
sam hocevar
35
 throw 42;

Hanya jawabannya ... :)

Macke
sumber
1
Windows. GCC-5.4.0. Kode keluar: 3. Tidak ada kotak pesan kesalahan. Pesan konsol: "terminasi yang dipanggil setelah melempar instance 'int' Aplikasi ini telah meminta Runtime untuk menghentikannya dengan cara yang tidak biasa. Silakan hubungi tim dukungan aplikasi untuk informasi lebih lanjut.".
Vadzim
15

assert(false); cukup bagus juga.

Menurut ISO / IEC 9899: 1999 dijamin macet ketika NDEBUG tidak didefinisikan:

Jika NDEBUG didefinisikan [...] makro pernyataan didefinisikan sebagai

#define assert(ignore) ((void)0)

Makro menegaskan didefinisikan ulang sesuai dengan keadaan saat ini NDEBUG setiap kali disertakan.

[...]

Makro tegas menempatkan tes diagnostik ke dalam program; [...] jika ekspresi (yang memiliki tipe skalar) salah [...]. Kemudian memanggil fungsi batalkan.

Dan F
sumber
Samar-samar saya ingat VC 2005 berperilaku berbeda antara debug dan rilis dengan menegaskan?
Tom Kerr
8
@ Tom assertdibuat setara dengan ((void)0)dalam mode Rilis.
Seth Carnegie
2
@SethCarnegie Dont melihat apa yang salah dengan ini - hanya jika didefinisikan NDEBUG akan tidak crash? Jawaban Dans adalah IMHO cukup adil.
Adrian Cornish
@AdrianCornish Saya hanya menjawab pertanyaan Tom Kerr, tidak mengatakan jawaban ini salah. Saya tidak menurunkan jawaban ini.
Seth Carnegie
3
Saya tidak tahu mengapa dia melakukan "rilis" kode tes ini.
Joel B
11

Karena crash adalah gejala dari memanggil perilaku yang tidak terdefinisi, dan karena memanggil perilaku yang tidak terdefinisi dapat menyebabkan apa saja, termasuk crash, saya tidak berpikir Anda ingin benar-benar crash program Anda, tetapi hanya memasukkannya ke debugger. Cara yang paling portabel untuk melakukannya adalah mungkin abort().

Walaupun raise(SIGABRT)memiliki efek yang sama, tentu lebih untuk menulis. Namun kedua cara dapat dicegat dengan memasang pengatur sinyal untuk SIGABRT. Jadi tergantung pada situasi Anda, Anda mungkin ingin / perlu menaikkan sinyal lain. SIGFPE, SIGILL, SIGINT, SIGTERMAtau SIGSEGVmungkin cara untuk pergi, tetapi mereka semua dapat disadap.

Ketika Anda tidak bisa diport, pilihan Anda mungkin lebih luas, seperti menggunakan SIGBUSdi linux.

PlasmaHH
sumber
1
Saya benar-benar ragu dia ingin melibatkan debugger. Dia tampaknya ingin menguji apa yang terjadi ketika penelepon program mogok mendapat crash mengirimnya. Itu sangat masuk akal.
Donal Fellows
9

Satu-satunya flash yang saya miliki adalah fungsi abort () :

Ini membatalkan proses dengan penghentian program yang tidak normal. Ini menghasilkan sinyal SIGABRT , yang secara default menyebabkan program untuk menghentikan mengembalikan kode kesalahan terminasi yang tidak berhasil ke lingkungan host. Program ini diakhiri tanpa mengeksekusi destruktor untuk objek durasi penyimpanan otomatis atau statis. , dan tanpa menyebut setiap atexit (yang disebut oleh exit () sebelum berakhir Program) fungsi. Itu tidak pernah kembali ke peneleponnya.

samridhi
sumber
9

Jawabannya adalah spesifik platform dan tergantung pada tujuan Anda. Tapi inilah fungsi crash Mozilla Javascript, yang menurut saya menggambarkan banyak tantangan untuk membuat ini bekerja:

static JS_NEVER_INLINE void
CrashInJS()
{
    /*
     * We write 123 here so that the machine code for this function is
     * unique. Otherwise the linker, trying to be smart, might use the
     * same code for CrashInJS and for some other function. That
     * messes up the signature in minidumps.
     */

#if defined(WIN32)
    /*
     * We used to call DebugBreak() on Windows, but amazingly, it causes
     * the MSVS 2010 debugger not to be able to recover a call stack.
     */
    *((int *) NULL) = 123;
    exit(3);
#elif defined(__APPLE__)
    /*
     * On Mac OS X, Breakpad ignores signals. Only real Mach exceptions are
     * trapped.
     */
    *((int *) NULL) = 123;  /* To continue from here in GDB: "return" then "continue". */
    raise(SIGABRT);  /* In case above statement gets nixed by the optimizer. */
#else
    raise(SIGABRT);  /* To continue from here in GDB: "signal 0". */
#endif
}
Paul Biggar
sumber
2
Anda harus benar-benar membuangnya dan menggunakan jQuery sebagai gantinya.
Thomas Weller
1
Ini adalah perilaku yang tidak terdefinisi dan tidak dijamin macet. Seringkali kompiler menganggap perilaku tidak terdefinisi tidak dapat dijangkau. Dalam hal ini, setidaknya baris mogok akan dihapus dan kode lain mungkin juga.
usr
8

Saya melihat ada banyak jawaban diposting di sini yang akan jatuh ke dalam kasus beruntung untuk menyelesaikan pekerjaan, tetapi tidak satupun dari mereka yang 100% deterministik untuk crash. Beberapa akan crash pada satu perangkat keras dan OS, yang lain tidak. Namun, ada cara standar sesuai standar C ++ resmi untuk membuatnya crash.

Mengutip dari C ++ Standard ISO / IEC 14882 §15.1-7 :

Jika mekanisme penanganan pengecualian, setelah menyelesaikan inisialisasi objek pengecualian tetapi sebelum aktivasi handler untuk pengecualian, memanggil fungsi yang keluar melalui pengecualian, std :: terminate disebut (15.5.1).

struct C {
    C() { }
    C(const C&) {
        if (std::uncaught_exceptions()) {
            throw 0; // throw during copy to handler’s exception-declaration object (15.3)
        }
    }
};
int main() {
    try {
    throw C(); // calls std::terminate() if construction of the handler’s
    // exception-declaration object is not elided (12.8)
    } catch(C) { }
}

Saya telah menulis kode kecil untuk menunjukkan ini dan dapat ditemukan dan dicoba di Ideone di sini .

class MyClass{
    public:
    ~MyClass() throw(int) { throw 0;}
};

int main() {
  try {
    MyClass myobj; // its destructor will cause an exception

    // This is another exception along with exception due to destructor of myobj and will cause app to terminate
     throw 1;      // It could be some function call which can result in exception.
  }
  catch(...)
  {
    std::cout<<"Exception catched"<<endl;
  }
  return 0;
}

ISO / IEC 14882 §15.1 / 9 menyebutkan lemparan tanpa blok percobaan yang mengakibatkan panggilan implisit untuk dibatalkan:

Jika tidak ada pengecualian yang saat ini ditangani, jalankan ekspresi-lemparan tanpa panggilan operan std :: terminate ()

Lainnya termasuk: throw from destructor: ISO / IEC 14882 §15.2 / 3

Abhinav
sumber
7
*( ( char* ) NULL ) = 0;

Ini akan menghasilkan kesalahan segmentasi.

wrren
sumber
10
Ini tidak dijamin macet.
Pemrogram Windows
23
"Apa yang akan terjadi?" - Apa pun bisa terjadi sebagai gantinya. Perilaku tidak terdefinisi, sehingga implementasinya dapat menetapkan 0 ke salah satu variabel program Anda, atau dapat menetapkan 42 ke salah satu variabel program Anda, atau dapat memformat hard drive Anda dan melanjutkan menjalankan program Anda.
Pemrogram Windows
7
(melanjutkan pemikiran "programmer Windows") Ini dapat membuat komputer Anda meledak, atau dapat menyebabkannya menjadi hidup dan mengambil alih kemanusiaan. atau ... itu akan macet di 99,9% dan itu didefinisikan sebagai "perilaku tidak terdefinisi" karena tidak ada yang mau bertanggung jawab atasnya.
Roee Gavirel
1
Sebenarnya, itu tidak dijamin untuk bahkan melakukan perilaku yang tidak terdefinisi - itu bisa sepenuhnya didefinisikan dan berfungsi dengan baik. Pertimbangkan kode ini: pastebin.com/WXCtTiDD (Diuji di Linux sebagai root, Anda juga bisa melakukan ini sebagai pengguna non-root jika Anda melakukan beberapa perubahan konfigurasi wiki.debian.org/mmap_min_addr )
cha0site
2
@ cha0site: Ini dijamin perilaku tidak terdefinisi oleh Standar, karena itu adalah penunjuk null pointer. Apa pun perilaku yang Anda amati di Linux diperbolehkan di bawah payung "perilaku tidak terdefinisi"
Ben Voigt
6

Yang ini tidak ada:

int main = 42;
mvds
sumber
1
Ya itu benar; tapi itu melakukan sesuatu yang spektakuler ketika Anda menjalankannya.
Joshua
5

Bagaimana dengan stack overflow oleh pemanggilan metode recursive loop mati?

#include <windows.h>
#include <stdio.h>

void main()
{
    StackOverflow(0);
}

void StackOverflow(int depth)
{
    char blockdata[10000];
    printf("Overflow: %d\n", depth);
    StackOverflow(depth+1);
}

Lihat contoh asli pada Microsoft KB

sll
sumber
4
Apa yang akan mencegah Compiler Smart yang Cukup dari mengoptimalkan alokasi stack yang tidak digunakan dan panggilan ekor?
JB.
@JB: sayangnya tidak tahu karena tidak familar dengan logika optimisasi kompiler yang ada
sll
8
Nah, dikompilasi di sini dengan gcc 4.6.0 pada tingkat optimasi -O2 dan di atas, itu mengoptimalkan dengan baik. Perlu -O1 atau lebih rendah untuk segfault.
JB.
@Abhinav: Cukup posting jawaban Anda dengan semua cara ini dinyatakan sebagai contoh dalam C ++ :)
sll
5

Ini macet di sistem Linux saya, karena string literal disimpan dalam memori hanya baca:

0[""]--;

Omong-omong, g ++ menolak untuk mengkompilasi ini. Kompiler semakin pintar dan pintar :)

fredoverflow
sumber
4
int i = 1 / 0;

Kompiler Anda mungkin akan memperingatkan Anda tentang hal ini, tetapi kompilasi dengan baik di bawah GCC 4.4.3 Ini mungkin akan menyebabkan SIGFPE (floating-point exception), yang mungkin tidak mungkin dalam aplikasi nyata seperti SIGSEGV (pelanggaran segmentasi memori) sebagai jawaban yang lain menyebabkan, tetapi masih crash. Menurut pendapat saya, ini jauh lebih mudah dibaca.

Cara lain, jika kita akan menipu dan menggunakan signal.h , adalah:

#include <signal.h>
int main() {
    raise(SIGKILL);
}

Ini dijamin untuk membunuh subproses, berbeda dengan SIGSEGV.


sumber
2
Ini tidak dijamin macet.
Pemrogram Windows
11
Bahasa C ++ tidak menjamin bahwa 1/0 akan menyebabkan SIGFPE. Perilaku tidak terdefinisi. Implementasinya dapat mengatakan hasilnya adalah 42.
Pemrogram Windows
1
Ketika perilaku tidak ditentukan, implementasi dapat melakukan apa pun yang diinginkannya. Bahasa C ++ tidak mencegah atau mengharuskan implementasi untuk menulis crash dump, bahasa C ++ tidak mencegah atau mengharuskan implementasi untuk menetapkan 42, dll.
Pemrogram Windows
2
@Iorgio jika perangkat keras tidak memiliki cara untuk menjebaknya secara otomatis, Anda masih memaksa kompiler untuk memancarkan setidaknya dua instruksi, salah satunya adalah cabang juga. Itu kira-kira dua kali lipat biaya divisi. Semua orang membayar biayanya seperti itu. Jika opsional dan Anda menginginkannya, Anda selalu dapat menggunakan fungsi pustaka untuk itu. Jika tidak opsional dan Anda tidak menginginkannya, Anda tetap harus membayar biayanya.
Flexo
2
@Giorgio: Saya memiliki aplikasi yang dapat melakukan 100.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000.000, ASAH, AS, ASI, TUNJANGAN, Tanggung jawab sosial Saya tahu pasti bahwa 0 dari ini akan menjadi pembagian dengan nol meskipun tidak ada cara kompiler dapat mengetahui hal ini. Saya pasti tidak ingin kompiler menanam cek untuk divisi dengan nol.
Martin York
4

Ini adalah versi yang lebih terjamin dari pembatalan yang disajikan dalam jawaban di atas. Ini menangani situasi saat sigabrt diblokir.

#include<stdio.h>
#include<signal.h>
#include<unistd.h> 
#include<stdlib.h>
int main()
{
    sigset_t act;
    sigemptyset(&act);
    sigfillset(&act);
    sigprocmask(SIG_UNBLOCK,&act,NULL);
    abort();
}
bashrc
sumber
3
int* p=0;
*p=0;

Ini juga harus crash. Pada Windows crash dengan AccessViolation dan seharusnya melakukan hal yang sama pada semua OS-es kurasa.

laci37
sumber
5
on all OS-esTidak, itu tidak crash di OS non lindung (misalnya MS-DOS.) Sebenarnya, kadang-kadang ada yang sesuatu di alamat 0! Untuk mode real x86, Interrupt Vector Table ada di alamat 0.
ikh
Itu tidak menabrak Irix. Saya sedih menyadari ketika kami porting kode itu ke Linux (di mana kami bahkan tidak mencapai main().
Scheff
3

Ini cuplikan yang disediakan oleh Google di Breakpad.

  volatile int* a = reinterpret_cast<volatile int*>(NULL);
  *a = 1;
Cory Trese
sumber
1
Karena saya sedang menguji Breakpad, inilah yang saya inginkan! Saya menemukan bahwa beberapa minidumps Breakpad tidak menghasilkan jejak stack yang menunjuk ke baris dalam kode saya yang menyebabkan crash. Yang ini, jadi saya bisa menggunakannya sebagai tes poc baik.
BuvinJ
2
int main(int argc, char *argv[])
{
    char *buf=NULL;buf[0]=0;
    return 0;
}
Aniket Inge
sumber
2

Meskipun pertanyaan ini sudah memiliki jawaban yang diterima ...

void main(){
    throw 1;
}

Atau... void main(){throw 1;}

noɥʇʎԀʎzɐɹƆ
sumber
2

Menulis ke memori read-only akan menyebabkan kesalahan segmentasi kecuali jika sistem Anda tidak mendukung blok memori read-only.

int main() {
    (int&)main = 0;
}

Saya telah mengujinya dengan MingGW 5.3.0 di Windows 7 dan GCC di Linux Mint. Saya kira kompiler dan sistem lain akan memberikan efek yang sama.

TANPA NAMA
sumber
1

Atau cara lain karena kita berada di kereta band.

Sepotong indah rekursi tak terbatas. Dijamin akan meniup tumpukan Anda.

int main(int argv, char* argc)
{
   return main(argv, argc)
}

Mencetak:

kesalahan segmentasi (inti di buang)

Mat
sumber
13
Memanggil maindiri sendiri sebenarnya adalah perilaku yang tidak terdefinisi, jika Anda tidak tahu :) Juga, rekursi ekor tidak dijamin akan meledakkan tumpukan Anda. Jika Anda menginginkan "jaminan", Anda harus melakukan sesuatu setelah panggilan rekursif, jika tidak kompiler dapat mengoptimalkan rekursi menjadi loop tak terbatas.
fredoverflow
0

Satu yang belum disebutkan:

((void(*)())0)();

Ini akan memperlakukan pointer nol sebagai pointer fungsi dan kemudian menyebutnya. Sama seperti kebanyakan metode, ini tidak dijamin untuk crash program, tetapi kemungkinan OS memungkinkan ini untuk tidak dicentang dan program yang pernah kembali diabaikan.

Anton Golov
sumber
3
Saya tahu beberapa mesin bahwa ini akan menyebabkan boot ulang karena kode startup OS secara efektif dipetakan ke alamat 0. Jangan berasumsi bahwa semuanya akan berfungsi seperti PC Anda. Anda bisa mengatakan itu macet tetapi tidak terlalu berguna karena Anda tidak bisa men-debug itu karena semua negara dihapus pada saat startup.
Martin York
@Loki Astari: Saya akan mengatakan bahwa ini adalah crash - jika ini dapat menyebabkannya, maka program yang sedang di debug mungkin juga, artinya ini adalah ujian yang bagus. Di sisi lain, saya penasaran mesin mana yang bisa menjalankan Python.
Anton Golov
Saya kira kamu melewatkan poin itu. Saya telah melihat kode OS pada 0. Tidak berarti tidak ada sistem dengan kode yang baik normal untuk menjalankan yang akan berfungsi dengan baik pada 0. Atau byte pada 0 bisa dengan mudah menjadi opcode untuk kembali.
Martin York
Saya mengetahui kode OS pada 0; itulah salah satu alasan saya sangat meragukan bahwa byte pada 0 akan menjadi opcode untuk pengembalian. Program ini jelas tidak menjalankan lagi, dan tidak keluar dengan cara biasa, yaitu macet - jika ini tidak cukup baik untuk penanya, saya berharap dia mengomentari itu sendiri.
Anton Golov
2
Anda mengetahui kode OS untuk mesin Anda saja. Apa yang ingin saya katakan adalah bahwa itu mungkin gagal untuk Anda. Tapi itu tidak ada artinya. Ada banyak sistem di luar sana. Saya yakin bahwa beberapa dari mereka ini dapat bekerja (yaitu seperti tidak crash). Mengandalkan perilaku spesifik mesin / OS adalah ide yang buruk dan menyebabkan masalah pemeliharaan dalam jangka panjang. Ide situs ini adalah untuk mempromosikan kode yang baik (bukan hanya kode yang berfungsi).
Martin York
0
void main()
{

  int *aNumber = (int*) malloc(sizeof(int));
  int j = 10;
  for(int i = 2; i <= j; ++i)
  {
      aNumber = (int*) realloc(aNumber, sizeof(int) * i);
      j += 10;
  }

}

Semoga ini macet. Bersulang.

senthil
sumber
0
int main()
{
    int *p=3;
    int s;
    while(1) {
        s=*p;
        p++;
    }
}
sc_cs
sumber
2
Alangkah
baiknya
1
pointer p akan melampaui ruang alamat program yang akan menjadi kesalahan memori, karena suatu proses tidak dapat mengakses memori proses lain. Ini akan menyebabkan program macet. pointer p menunjuk ke lokasi acak di ruang alamatnya, jika ditingkatkan dan didereferensi secara tak terbatas pada beberapa titik, ia akan menunjuk ke ruang alamat (proses) program lain. sehingga akan macet setelah beberapa waktu.
sc_cs
Atau, secara hipotesis itu bisa mencapai integer overflow dan membungkus, berjalan tanpa batas. Saya akan mencoba menggunakan long longatau size_tdan mulai dengan pnilai maksimum masing-masing, atau mendekati itu, untuk crash lebih cepat. Meskipun itu masih belum dijamin macet bahkan dalam kasus itu.
Patrick Roberts
0

Cara bergaya untuk melakukan ini adalah panggilan fungsi virtual murni:

class Base;

void func(Base*);

class Base
{
public:
   virtual void f() = 0;
   Base() 
   {
       func(this);
   }
};

class Derived : Base
{
   virtual void f()
   {
   }
};

void func(Base* p)
{
   p->f();
}


int main()
{
    Derived  d;
}

Dikompilasi dengan gcc, ini mencetak:

disebut metode virtual murni

mengakhiri panggilan tanpa pengecualian aktif

Dibatalkan (inti dibuang)

Martin Broadhurst
sumber
0

Anda dapat menggunakan perakitan di c ++ code BUT Anda INT 3 hanya untuk sistem x86 sistem lain mungkin memiliki instruksi trap / breakpoint lainnya.

int main()
{
    __asm int 3;

    return 0;
}

INT 3 menyebabkan interupsi dan memanggil vektor interupsi yang diatur oleh OS.

BattleTested
sumber
0

Gunakan __builtin_trap () di GCC atau dentang, atau __debugbreak () di MSVC. Tidak menangani breakpoints / traps ini akan menyebabkan eksepsi / crash breakpoint yang tidak tertangani. Saran lain yang menggunakan batalkan () atau keluar (): yang mungkin ditangani oleh utas lainnya, membuatnya lebih sulit untuk melihat tumpukan utas yang menyebarkan crash.

G Huxley
sumber
-2
char*freeThis;
free(freeThis);

Membebaskan pointer yang tidak diinisialisasi adalah perilaku yang tidak terdefinisi. Pada banyak platform / kompiler, freeThisakan memiliki nilai acak (apa pun yang ada di lokasi memori itu sebelumnya). Membebaskannya akan meminta sistem untuk membebaskan memori di alamat itu, yang biasanya akan menyebabkan kesalahan segmentasi dan membuat program macet.

Z Rev
sumber