Perilaku Tidak Terdefinisi Membunuh Kucing Saya [ditutup]

82

Perilaku Tidak Terdefinisi Membunuh Kucing Saya

Ini juga diketahui bahwa perilaku undefined dapat membunuh kucing Anda [rujukan?] .
Tapi bisakah itu?

Tugas Anda

  1. Tulis program yang memunculkan perilaku tidak terdefinisi.
  2. Jelaskan skenario yang dimulai dengan program di atas dijalankan, menghasilkan Felis catus mengakhiri hidupnya saat Anda berada, sebagai akibat dari UB yang disebutkan di atas.
  3. Perkirakan probabilitas untuk setiap tahap dalam skenario.
  4. Hitung probabilitas total bahwa satu menjalankan program akan membunuh kucing Anda.

Aturan

  1. Ini adalah , jadi kreatiflah jika Anda bisa.
  2. Ini adalah tantangan yang berhubungan dengan pemrograman, jadi rantai kejadian sebagian besar harus berada di dalam komputer, bukan di dunia nyata (tentu saja, jika harus menjangkau dunia nyata jika di situlah kucing Anda berada).
  3. Jika Anda memilih bahasa yang tidak memiliki perilaku tidak terdefinisi, gunakan sesuatu yang serupa.
  4. Tidak ada hewan yang dapat dirugikan dalam menghasilkan jawaban Anda.

Mencetak gol

Penghitungan suara ditambah probabilitas total skenario (yang tidak dapat melebihi 1).

Contoh dalam C:

main(){printf();}

Skenario:

  1. printfdipanggil dengan sampah dari tumpukan - perilaku tidak terdefinisi. Kemungkinan: 100%.
  2. Parameter pertama adalah string Your cat is ugly!. Kemungkinan: (1/256) 17 = (1.148 * 10 -37 )%.
  3. Melihat pesan, Anda mengambil pistol dan menembak kucing Anda. Probabilitas: 3%.
  4. Kucing itu mati. Probabilitas: 93%.

Total probabilitas: (3.202 * 10 -39 )%.

ugoren
sumber
50
1) Meminta perilaku yang tidak terdefinisi 2) Tetap terinspirasi oleh fakta bahwa Anda bisa memohon perilaku yang tidak terdefinisi, dan menjalani hidup yang panjang dan bahagia 3) Kucing mati karena usia tua. Total probabilitas: 100%
Geobits
5
@Oberon Saya akan bunuh diri jika saya tidak bisa menemukan cara tunggal untuk membuat UB setelah pemrograman begitu lama. Maka kucing tidak lagi berada di tangan saya. Memohon pada UB membuat saya tetap hidup, sehingga "... mengakhiri hidupnya sementara dalam kepemilikan Anda , sebagai hasilnya ...". FTW parsing yang mendua.
Geobits
8
Saya akan lebih senang jika seseorang menginterpretasikan ulang ini untuk membunuh catperintah atau semacamnya.
keshlam
5
-1 Saya suka kucing. Kenapa kucing? Mengapa tidak membunuh kutu besar?
VX
22
Jika kucing dimakan, Python adalah solusinya.
Nicolas Barbulesco

Jawaban:

113

C

Sebagian besar jawaban untuk pertanyaan ini salah mengartikan pertanyaan bahwa itu membunuh catproses pada sistem UNIX. Berikut adalah program yang dapat menyebabkan matinya kehidupan biologis spesies Felis Cattus seperti yang dikhususkan oleh pertanyaan.

Contoh ini berjalan pada Windows, tetapi bisa dengan mudah porting ke sebagian besar sistem operasi UNIX dengan mengganti iexplore -kdengan perintah untuk meluncurkan browser web yang diinstal.

#include <stdlib.h>
#include <stdio.h>    

int main() {
    char i; // uninitialised
    printf("Redirecting you to a website which will inform you how to properly feed your cat.");
    if (i != 42) {
         system("iexplore -k https://pets.stackexchange.com/questions/tagged/cats+diet");
    } else {
         system("iexplore -k https://cooking.stackexchange.com/questions/tagged/chocolate");
    }
    return 0;
}

Program ini berpura-pura memberikan saran tentang diet kucing kepada pengguna.

Ini akan memulai Internet Explorer dan mengarahkan pengguna ke daftar stackexchange banyak pertanyaan bermanfaat tentang cara memberi makan kucing. Namun, ada kemungkinan rendah (1/256) bahwa itu akan mengirim pengguna untuk memasak stackexchange, bukan mendaftar kiat bagaimana menyiapkan hidangan yang mengandung cokelat, yang sangat beracun bagi kucing . Lebih buruk lagi, itu akan meluncurkan internet explorer dalam mode kios (layar penuh), yang menyembunyikan bilah alamat dan sulit untuk melarikan diri dari untuk pengguna non-tech-savy.

Tipuan pintar ini akan membujuk pengguna untuk memberi makan cokelat kucing mereka dengan percaya bahwa itu adalah diet yang tepat untuk itu, sehingga menyebabkan mereka membunuhnya secara tidak sengaja.

Philipp
sumber
3
Pena lebih kuat dari pada pedang! :)
Pieter Witvoet
12
Ini sepertinya satu-satunya solusi sejauh ini yang memiliki peluang realistis membunuh kucing. Saya terpaksa memilih, meskipun saya sungguh berharap tidak ada yang benar-benar mempraktikkannya.
Charles Staats
43
Internet Explorer dapat membunuh kucing Anda sendiri.
Michael Hampton
4
Bisakah Anda menambahkan skenario, langkah demi langkah, yang membunuh kucing, dengan analisis probabilitas (seperti dalam contoh)? Seperti ini, ini bukan jawaban yang valid.
ugoren
3
Menggunakan Internet Explorer menginduksi perilaku yang tidak terdefinisi dalam ME. - maaf, harus mengatakan itu.
tommeding
88

Pesta

Menurut ini , INT_MIN % -1mungkin atau mungkin tidak terdefinisi (apa ???) , dan dapat menyebabkan masalah untuk bahasa yang diimplementasikan dalam c / c ++.

#!/bin/bash

cat <<< $((2**63%-1))

The catakan dibunuh dini jika orang tua bashproses crash, yang mungkin atau tidak mungkin terjadi.

Pada VM saya, saya mendapatkan output ini:

$ ./schroedinger.sh
./schroedinger.sh: line 3:  7805 Floating point exception(core dumped) cat <<< $((2**63/-1))
$ 

(Saya benar-benar tidak mengerti skor untuk pertanyaan ini, tapi begini saja)

Hitung $((2**63%-1)). Kecelakaan selalu terjadi pada bash 4.2.25, tetapi tampaknya hanya bertahan pada beberapa versi 3.x. Lebih banyak ketidakpastian. Saya bisa memberi tahu Anda probabilitas yang tepat, tetapi karena prinsip ketidakpastian Heisenburg, saya kemudian akan jatuh ke lubang hitam. Atau sesuatu. Jadi saya pikir kita dapat dengan aman mengatakan kemungkinannya sekitar 42%.

Trauma Digital
sumber
4
@ klingt.net: Ini disebut "Here Strings" - ini jauh lebih googlable ... itu adalah jalan pintas untukecho $((-2**63/-1)) | cat
VX
14
+1 untuk menggunakan nyata cat.
Alvin Wong
1
@Mardavi INT_MAX = 2^63 - 1. Jika kita menambahkan 1 ke INT_MAX, ruang nomor 64bit membungkus dan kita dapatkan INT_MIN. Dengan kata lain dalam aritmetika integer 64bit bertanda 2^63 == -2^63,. Saya bisa saja menggunakan -2**63, tetapi lebih memilih kesederhanaan tanpa -, karena aritmatika modular adalah sama dalam hal ini.
Digital Trauma
1
Bisakah Anda menambahkan skenario, langkah demi langkah, yang membunuh kucing, dengan analisis probabilitas (seperti dalam contoh)? Seperti ini, ini bukan jawaban yang valid.
ugoren
40

C (titik urutan)

deadcat.c:

#include <stdio.h>
int main()
{
    int i=3;
    int k=0;
    k=i+(++i);
    if (k==7)
        printf("The cat is fine. k=i+(++i) =%d\n",k);
    else
        printf("Urgent Notice: Your cat has rabies. k=i+(++i) =%d\n",k);
}

Eksekusi (atau tidak):

$ clang -w deadcat.c -o deadcat; ./deadcat
The cat is fine. k=i+(++i) =7
$ gcc deadcat.c -o deadcat; ./deadcat
Urgent Notice: Your cat has rabies. k=i+(++i) =8

Skenario dan probabilitas

Dengan asumsi bahwa lima persen orang yang menjalankan program ini menggunakan dentang untuk mengkompilasi kode C (versus 90 persen menggunakan gcc dan 5 persen menggunakan kompiler C lainnya):

Kemungkinan mendapat "Kucing itu baik-baik saja." = .050
 Kemungkinan mendapat "Pemberitahuan Mendesak: Kucing Anda menderita rabies." = 0,950

 Kemungkinan bereaksi terhadap "Kucing Anda menderita rabies" dengan meletakkannya = 0,040
 Kemungkinan mengabaikan pemberitahuan =, 900
 Kemungkinan membawa kucing ke dokter hewan untuk perawatan = .060

 Total probabilitas hidup kucing: .05 + .95 * (.90 + .06) = .962
 Total probabilitas kucing meninggal: .95 * .04 = .038
 Periksa: Total probabilitas kucing hidup atau mati: = 1.000

Penjelasan:

k = i + (++ i) mengakses dan mengubah "i" antara titik-titik urutan. Probabilitas tidak dapat ditentukan oleh program; itu tergantung pada pilihan kompiler, yang dibuat oleh pengguna. "Tidak terdefinisi" tidak berarti "acak".

Lihat https://stackoverflow.com/questions/4176328/undefined-behavior-and-afterence-points

Glenn Randers-Pehrson
sumber
4
+1 untuk mendemonstrasikan perilaku dengan kompiler yang berbeda.
ntoskrnl
1
tingkat optimisasi juga dapat mengubah perilaku
ratchet freak
1
@ scratchet freak: Ya, tapi saya tidak bisa menunjukkannya dengan masalah khusus ini. Saya mencoba -O0, -O1, -O2, dan -O3 pada sejumlah versi gcc mulai dari gcc-4.2.3 hingga gcc-4.8.2, dan cc-5.0 di SunOS, tetapi semuanya membunuh kucing.
Glenn Randers-Pehrson
2
Bisakah Anda menambahkan skenario, langkah demi langkah, yang membunuh kucing, dengan analisis probabilitas (seperti dalam contoh)? Seperti ini, ini bukan jawaban yang valid.
ugoren
1
Saya berasumsi bahwa semua kucing yang dibawa ke dokter hewan akan hidup. Mungkin beberapa dari mereka akan mati karena tertular penyakit kucing menular atau dari malpraktik dokter hewan. Itu mungkin sedikit mengubah probabilitas akhir, untuk mengatakan .96 / .04
Glenn Randers-Pehrson
37

C

Backstory

Istri saya mewarisi seekor kucing dari keluarga. Sayangnya, saya sangat alergi terhadap hewan. Kucing itu sudah melewati masa jayanya dan seharusnya sudah di-eutanasia bahkan sebelum kita mendapatkannya, tetapi dia tidak bisa menyingkirkannya karena nilai sentimentalnya. Saya membuat rencana untuk mengakhiri penderitaan saya .

Kami akan berlibur panjang, tetapi dia tidak ingin menaiki kucing di kantor dokter hewan. Dia khawatir tentang itu tertular penyakit atau dianiaya. Saya membuat pengumpan kucing otomatis sehingga kami bisa meninggalkannya di rumah. Saya menulis firmware mikrokontroler di C. File yang berisi maintampak mirip dengan kode di bawah ini.

Namun, istri saya juga seorang programmer dan tahu perasaan saya terhadap kucing itu, jadi dia bersikeras melakukan review kode sebelum setuju untuk meninggalkannya di rumah tanpa pengawasan. Dia memiliki beberapa masalah, termasuk:

  • main tidak memiliki tanda tangan yang memenuhi standar (untuk implementasi yang di-host)
  • main tidak mengembalikan nilai
  • tempTmdigunakan tidak diinisialisasi sejak mallocdipanggil, bukancalloc
  • nilai pengembalian malloctidak boleh dilemparkan
  • waktu mikrokontroler mungkin tidak akurat atau terguling (mirip dengan masalah waktu Y2K atau Unix 2038)
  • yang elapsedTimevariabel mungkin tidak memiliki rentang yang cukup

Butuh banyak meyakinkan, tetapi dia akhirnya setuju bahwa tesis ini tidak masalah karena berbagai alasan (tidak ada salahnya kita sudah terlambat untuk penerbangan kami). Karena tidak ada waktu untuk pengujian langsung, dia menyetujui kode dan kami pergi berlibur. Ketika kami kembali beberapa minggu kemudian, kesengsaraan kucing saya telah berakhir (meskipun sebagai hasilnya saya sekarang memiliki lebih banyak lagi).

Scenario Skenario sepenuhnya fiktif, tidak perlu khawatir.


Kode

#include <time.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

//#include "feedcat.h"
// contains extern void FeedCat(struct tm *);
// implemented in feedcat.c
// stub included here for demonstration only
#include <stdio.h>
// passed by pointer to avoid putting large structure on stack (which is very limited)
void FeedCat(struct tm *amPm)
{
    if(amPm->tm_hour >= 12)
        printf("Feeding cat dinner portion\n");
    else
        printf("Feeding cat breakfast portion\n");
}

// fallback value calculated based on MCU clock rate and average CPI
const uintmax_t FALLBACK_COUNTER_LIMIT = UINTMAX_MAX;

int main (void (*irqVector)(void))
{
    // small stack variables
    // seconds since last feed
    int elapsedTime = 0;
    // fallback fail-safe counter
    uintmax_t loopIterationsSinceFeed = 0;
    // last time cat was fed
    time_t lastFeedingTime;
    // current time
    time_t nowTime;

    // large struct on the heap
    // stores converted calendar time to help determine how much food to
    // dispense (morning vs. evening)
    struct tm * tempTm = (struct tm *)malloc(sizeof(struct tm));

    // assume the cat hasn't been fed for a long time (in case, for instance,
    // the feeder lost power), so make sure it's fed the first time through
    lastFeedingTime = (size_t)(-1);

    while(1)
    {
        // increment fallback counter to protect in case of time loss
        // or other anomaly
        loopIterationsSinceFeed++;

        // get current time, write into to nowTime 
        time(&nowTime);

        // calculate time since last feeding
        elapsedTime = (int)difftime(nowTime, lastFeedingTime);

        // get calendar time, write into tempTm since localtime uses an
        // internal static variable
        memcpy(&tempTm, localtime(&nowTime), sizeof(struct tm));

        // feed the cat if 12 hours have elapsed or if our fallback
        // counter reaches the limit
        if(  elapsedTime >= 12*60*60 || 
             loopIterationsSinceFeed >= FALLBACK_COUNTER_LIMIT)
        {
            // dispense food
            FeedCat(tempTm);

            // update last feeding time
            time(&lastFeedingTime);

            // reset fallback counter
            loopIterationsSinceFeed = 0;
        }
    }
}

Perilaku tidak terdefinisi:

Bagi yang tidak mau repot-repot mencari UB sendiri:

Jelas ada perilaku spesifik lokal, tidak spesifik, dan terdefinisi implementasi dalam kode ini, tetapi semua harus bekerja dengan benar. Masalahnya adalah pada baris kode berikut:

struct tm * tempTm //... //... memcpy(&tempTm, localtime(&nowTime), sizeof(struct tm));
memcpymenimpa tempTMpointer bukan objek yang ditunjuknya, menghancurkan tumpukan. Ini menimpa, selain hal-hal lain, elapsedTimedan loopIterationsSinceFeed. Berikut ini contoh menjalankan tempat saya mencetak nilai:

pre-smash : elapsedTime=1394210441 loopIterationsSinceFeed=1 post-smash : elapsedTime=65 loopIterationsSinceFeed=0


Kemungkinan membunuh kucing:

  • Mengingat lingkungan eksekusi yang dibatasi dan rantai build, perilaku yang tidak terdefinisi selalu terjadi.
  • Demikian pula, perilaku yang tidak terdefinisi selalu mencegah pengumpan kucing bekerja sebagaimana dimaksud (atau lebih tepatnya, memungkinkannya untuk "bekerja" sebagaimana dimaksud).
  • Jika pengumpan tidak berfungsi, kemungkinan besar kucing akan mati. Ini bukan kucing yang bisa menjaga dirinya sendiri, dan saya gagal meminta tetangga untuk melihatnya.

Saya memperkirakan bahwa kucing itu mati dengan probabilitas 0,995 .

jerry
sumber
Ini (pertama) &di memcpy, kan?
Score_Under
@Score_Di Bawah Ya, izinkan saya mengedit sedikit jawabannya. Saya bermain-main dengan cara lain untuk memanfaatkan perilaku yang tidak terdefinisi, tetapi kebanyakan bahkan lebih jelas.
jerry
1
+1 untuk membunuh kucing, bukan cat.
Kevin
31

pesta

Versi klasik

cat & # This is your cat.
pkill -$RANDOM cat

Memiliki keuntungan membunuh semua kucing dalam jangkauannya.

Perhatikan bahwa proses dihentikan segera, jadi satu-satunya cara untuk mengakhirinya dengan satu pemanggilan pkill adalah mengirim SIGKILL (9).

Karena itu:

p(SUCCESS) = p(RANDOM == 9) = 0.0275 %


Versi kuantum

schroedinger=/dev/null             # We'll need this guy.
heisenberg=/dev/urandom            # Also needed, for uncertainty principle.
cat $heisenberg > $schroedinger &  # Steal cat from Heisenberg and give it to Schrödinger.
felix=$!                           # Name cat for future references.
exec 2> $schroedinger              # Send all results to Schrödinger.
kill -SIGSTOP $felix               # Catch Felix and put him into a box.
if (($RANDOM & 1))                 # Flip a coin.
then kill $felix                   # Heads: Kill! Kill! Kill!
fi                                 # By now, Felix can be thought of as both alive and dead.
read -sn 1                         # Wait for somebody to open the box.
kill -SIGCONT $felix               # Let him open it.
if ps p $felix > $schroedinger     # Let Schrödinger check on Felix.
then echo The cat is alive.        # Hooray for tails!
else echo The cat is dead.         # At least, now we know.
fi                                 # This concludes the experiment.
kill -SIGKILL $felix               # Felix is no longer required.

Kemungkinan membunuh kucing selama percobaan: 50%

Dennis
sumber
+1 Tapi itu agak lebih mungkin daripada yang saya pikirkan. SIGINT (2), SIGQUIT (3), SIGABRT (6), SIGPIPE (13) dan SIGTERM (15), setidaknya, membunuhnya di sini.
l0b0
@ l0b0: Tidak, setidaknya tidak segera. cat &mencoba membaca dari terminal, tetapi tidak bisa. Setiap sinyal yang Anda sebutkan (dan beberapa lainnya) akan berfungsi jika Anda mengirim SIGCONT (18) sesudahnya. Juga, saya setuju bahwa menggantung dan mengakhiri kucing akan sama dengan membunuhnya , tetapi memotongnya sepertinya tidak memuaskan ...: P
Dennis
3
Perilaku tidak terdefinisi menggunakan fitur bahasa yang telah ditentukan sebagai tidak terdefinisi . Artinya, perancang bahasa sengaja membiarkan perilaku beberapa konstruk sintaksis tidak terdefinisi untuk membuat implementasi lebih mudah, atau untuk menunjukkan bahwa konstruk tidak boleh digunakan dalam program yang valid. Perilaku tidak terdefinisi biasanya tidak ada hubungannya dengan pembuatan bilangan acak, dan tidak ada perilaku tidak terdefinisi yang digunakan di sini.
OregonTrail
@OregonTrail: Aturannya mengatakan Jika Anda memilih bahasa yang tidak memiliki perilaku tidak terdefinisi, gunakan sesuatu yang serupa. Bash tidak memiliki perilaku yang tidak terdefinisi, jadi saya menggunakan angka acak.
Dennis
3
Ada banyak perilaku tidak terdefinisi di lingkungan bash yang dapat digunakan. Sebagai contoh, jawaban dari printf @DigitalTrauma Bash juga menggunakan printf sistem yang memiliki banyak perilaku tidak terdefinisi.
OregonTrail
17

C

Perhatikan bahwa ini hanya berfungsi di linux.

main() {
  FILE *f = fopen("skynet", "w");
  srand(time(0));
  while(rand() != rand())
    fputc(rand()%256, f);
  fclose(f);
  system("chmod +x skynet");
  system("./skynet");
}
  1. Menulis data acak ke file dan memohonnya (100%)
  2. Data acak merupakan kode sumber untuk skynet (1x10 ^ -999999999999999999999999999999999999999999999999999999999999999999999, aprox.)
  3. Kucing mati dalam kiamat yang dihasilkan (99,999%)

Total probabilitas: 1x10 ^ -99999999999999999999999999999999999999999999999999999999999999999999999, aprox.

Josh
sumber
hmmmm, apa itu skynet?
Sarge Borsch
20
Di mana perilaku yang tidak terdefinisi?
ugoren
1
@ugoren Saya pikir menjalankan file dengan konten acak tidak benar-benar ditentukan.
11684
2
@ 11684, Jika isinya adalah kode untuk skynet, programmer skynet tahu apa yang mereka lakukan, tidak ada perilaku yang tidak ditentukan.
ugoren
15

C ++

Kucing Anda Mati dan Hidup sampai Anda Ingin Tahu. Kemudian Anda menyadari bahwa ada kemungkinan 0,5 bahwa Kucing Anda Mati.

#ifdef WIN32
#pragma warning(disable: 4700)
#endif
#include <random>
#include <iostream>
#include <vector>
#include <climits>
#include <memory>
class Cat
{
public:
    enum class State {DEAD, ALIVE};
    Cat()
    {
        int x; // Uninitialized Variable on Stack
        if (x % 2 == 0) // Is the Uninitialized Variable even? 50-50
        {
            m_dead = State::DEAD;

        }
        else
        {
            m_dead = State::ALIVE;
        }
    };
    operator State() //Check if your Cat is Dead / Alive
    {
        if (m_dead == State::DEAD)
        {
            delete this; //Boom Cat is dead
            std::cout<<"Your Curiosity killed your Cat"<<std::endl;
            return false;
        }
        return m_dead;
    }
private:
    State m_dead;
};

class Schrödinger
{
public:
    Schrödinger(size_t size):m_size(size)
    {
        for(size_t i = 0; i < size; i++)
        {
            cats.push_back(new Cat());
        }
    }
    ~Schrödinger()
    {
    }
    void Curiosity()
    {
        std::default_random_engine generator;
        std::uniform_int_distribution<int> distribution(0,m_size);
        if(*cats[distribution(generator)] == Cat::State::ALIVE)
        {
            std::cout<<"You Cat is alive and still kicking" <<std::endl;
        }
    }
private:
    std::vector<Cat *> cats;
    size_t m_size;
};
int main()
{
    int size;    
    std::cout<<"How Big is Your Example Space ?";
    std::cin>>size;
    Schrödinger your(size);
    your.Curiosity();
    return 0;

}
Abhijit
sumber
bisakah kamu mengakses this->m_deadsetelah itu delete this?
Bryan Chen
@BryanChen: Pengembaliannya hilang. Terima kasih telah menunjukkan :-)
Abhijit
ötampaknya tidak menjadi simbol yang valid di C ++. Mungkin ganti dengan oe.
Ruslan
13

C

Berjalan di Linux.

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
void f(char x) {
    if(sleep(1)==x) system("killall cat");
}
int main() {
    char x; // uninitialised
    system("cat /dev/urandom &");
    f(x);
    return 0;
}

Kemungkinan membunuh kucing: 1/256 (Pengembalian sleep(1)0, jadi akan terbunuh jika xnol.)

Sebagai bonus, ia membunuh semua kucing yang saat ini berjalan di sistem Anda.


Jika Anda sangat membenci kucing, saya persembahkan kepada Anda:

The Cat Centipede (Bash)

echo "Hello World"|cat|cat|cat

Berdasarkan fakta bahwa, dalam The Human Centipede (Urutan Pertama) , ketiga anjing dari kelabang anjing mati, dan dua dari tiga orang kelabang manusia meninggal, saya memperkirakan bahwa kemungkinan membunuh satu kucing adalah 5/6.

ace_HongKongIndependence
sumber
Cat Centipede benar-benar lucu
Sarge Borsch
Kucing kelabang harus menjadi jawaban "yang sebenarnya".
Ismael Miguel
@ Ismael Miguel Anda mungkin benar, saya telah menghapus kode C. Pada awalnya itu dimaksudkan untuk menjadi lelucon, tetapi kemudian saya menyadari bahwa saya bisa mengulanginya untuk membuatnya menjadi jawaban yang sebenarnya.
ace_HongKongIndependence
Anda dapat menyimpan kode C Anda, saya miliki dan tidak menentangnya. Saya hanya berpikir bahwa versi bash lebih cocok sebagai jawaban.
Ismael Miguel
@Ismael Miguel Nah, kode C itu cukup bodoh
ace_HongKongIndependence
9

JavaScript

~"cat".localeCompare("dead")
  ? "Cat is dead"
  : "Cat is fine"

Eksekusi:

  • Chrome: Hasil dalam"Cat is fine"
  • Firefox: Hasil dalam"Cat is dead"

Penjelasan:

15.5.4.9 String.prototype.localeCompare (itu)

Dua String dibandingkan dalam pelaksanaan yang ditetapkan busana

Mengutip Glenn Randers-Pehrson, probabilitas tidak dapat ditentukan oleh program; itu tergantung pada pilihan browser, yang dibuat oleh pengguna.

Florent
sumber
Tidak dapat direproduksi pada FF 27. Versi apa yang Anda uji?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
-1: perilaku tidak terdefinisi dan perilaku implementasi-didefinisikan sangat berbeda.
whitequark
2
@ whitequark Tidak, mereka tidak. Ini adalah fungsi yang didefinisikan dengan hasil yang tidak ditentukan. Ergo perilaku tidak terdefinisi.
George Reith
1
@ whitequark Saya tidak melihat C di sini. Sejauh JavaScript yang bersangkutan Apakah JavaScript memiliki perilaku yang tidak terdefinisi tampaknya berpikir bahwa perilaku yang didefinisikan implementasi dapat diterima.
George Reith
1
@whitequark tidak ada orang lain yang bingung. Sepatah kata adalah sebuah kata, saya tidak perlu komite untuk memberi tahu saya apa artinya.
George Reith
9
int foo() {}

void main() {
    int x = foo();
}

Membaca nilai fungsi yang seharusnya mengembalikan nilai menghasilkan perilaku yang tidak terdefinisi. Sekarang, sudah jelas, [rujukan?] Bahwa "Setiap kali Anda mencapai perilaku yang tidak terdefinisi, Tuhan membunuh seekor kucing." Dengan ini kami menyimpulkan:

  • Probabilitas Anda mencapai perilaku yang tidak terdefinisi - 100%
  • Kemungkinan itu adalah kucing Anda yang dewa bunuh - 1/200 000 000 lihat mengapa
  • Jadi probabilitasnya adalah 0,0000005%

Dapat dengan mudah diperpanjang dengan loop untuk memusnahkan semua kucing di dunia.

Petr
sumber
5
Peluang Anda 100 kali terlalu tinggi (200 juta kucing, bukan 2 juta).
ugoren
Saya memiliki dalam persen. :)
Petr
1
Ini dalam persen, dan masih 100 kali terlalu tinggi.
ugoren
Anda benar, saya tidak bisa membaca angka lagi, rupanya.
Petr
Ini salah. UB hanya dipanggil jika penelepon mencoba menggunakan nilai kembali. Kalau tidak, itu benar-benar legal dan terdefinisi dengan baik untuk keluar dari fungsi dengan tipe pengembalian yang tidak batal.
R ..
5

Jawa (Pengumpulan Sampah)

Meskipun kode dapat menjalankan System.gc () tidak memastikan bahwa Pengumpul Sampah akan mengumpulkan semua objek yang tidak digunakan. Jadi, untuk kode berikut, tidak dapat diprediksi apakah kucing akan dibunuh atau tidak.

public class KillTheCat {
    public static void main(String[] args) throws InterruptedException {
        KillTheCat cat = new KillTheCat();
        cat = null;
        System.gc();
        System.out.println("Cat is still alive.");
    }

    @Override
    protected void finalize() throws Throwable {
        System.out.println("Cat has been killed.");
        System.exit(0);
    }
}

Probabilitas tidak dapat dihitung.

Perhatikan bahwa masih ada kemungkinan kucing akan "dihidupkan kembali" jika ada saklar konteks di utas GC setelah sysout dan sebelum System.exit (0) tapi saya lebih suka untuk tidak menutupinya agar konsepnya tetap sederhana.

pengguna3001267
sumber
1
Ini tidak baik. Kode ini seperti yang ditulis akan hampir selalu mencetak keduanya. Lebih baik menambahkan System.out.close()setelah System.out.println("Cat is still alive.");baris.
durron597
Sejauh yang saya mengerti, "hampir selalu" cocok dengan aspek ketidakpastian pertanyaan.
user3001267
5

Adakah yang berpikir untuk benar-benar membunuh (a) cat?

[ $[ $RANDOM % 6 ] == 0 ] && rm /bin/cat || echo Meow

Kemungkinan catmeninggal

Untuk probabilitas ... Saya kira kita perlu membedakan beberapa kasus:

  1. Pengguna Windows : Mungkin tidak akan bisa menjalankannya. Peluang sekarat catsangat rendah, dapat dengan aman dianggap nol. Jika dia menginstal Cygwin, dia akan dihitung sebagai pengguna unix.
  2. Unix pengguna, berjalan tanpa hak root : Membunuh catakan gagal.
  3. Unix pengguna, berjalan dengan hak akses root : Sementara setiap panggilan hanya akan membunuh catdengan peluang 1/6, ia sangat mungkin akan mengulanginya sampai sesuatu yang tidak terduga terjadi. Tanpa kehilangan keumuman, saya berasumsi catpasti akan mati.

Probabilitas keseluruhan tergantung pada bagaimana pengguna dicampur dan sulit untuk ditentukan. Tapi kita pasti bisa mengatakan: Windows adalah tempat yang aman untuk anak kucing.

Menguji kepatuhan aturan

Tidak ada hewan yang dapat dirugikan dalam menghasilkan jawaban Anda.

Ini tidak membunuh hewan, jawabannya disetujui oleh American Humane Association .

$ file `which cat`
/bin/cat: Mach-O 64-bit executable x86_64

jelas membuktikan bahwa catitu bukan binatang (selama filetidak tahu jenis warisan jenis file tersembunyi).

Jens Erat
sumber
5

C

Jika nama kucing Anda terlalu panjang, ia mati. getsmenyebabkan kematian kucing, bersama dengan masalah lain.

#include <stdio.h>
#include <stdbool.h>

/* Stores instances of cats. */
struct cat {
    /* 6 bytes are more than enough. */
    char name[6];

    /* Stores whether your cat is dead. */
    bool dead;
};

int main(void) {
    /* This is your cat. */
    struct cat your_cat;
    /* It lives. */
    your_cat.dead = false;
    /* Determine its name. */
    printf("Your cat name: ");
    gets(your_cat.name);

    /* Output the cat state. */
    const char *state = your_cat.dead ? "dead" : "alive";
    printf("Your cat, %s, is %s.\n", your_cat.name, state);

    return your_cat.dead;
}
Konrad Borowski
sumber
4

Haskell

import Acme.Missiles
import System.IO.Unsafe
main = print (unsafePerformIO launchMissiles, undefined)

Di sini, kami menerapkan unsafePerformIOuntuk suatu tindakan yang memiliki diamati efek samping . Itu selalu merupakan perilaku yang tidak terdefinisi, setidaknya demikian juga urutan efeknya. Jadi, apakah program undefinedtersebut akan gagal untuk mencoba mengevaluasi (bahwa, ironisnya, itu bukan perilaku yang tidak terdefinisi: ia tidak boleh menghasilkan nilai yang akan memungkinkan program untuk melanjutkan sesuatu yang lain), atau justru akan menimbulkan masalah internasional yang serius. efek samping. Dalam hal ini, peluang bertahan hidup hanya 0,001% .

Kemungkinan membunuh kucing dengan demikian: 49,9995%.

berhenti mengubah counterclockwis
sumber
3

Itu

Karena pertanyaan memungkinkan untuk bahasa yang tidak memiliki perilaku yang tidak terdefinisi selama efeknya sama, saya memilih Thue karena non-determinismenya dalam memilih aturan mana yang akan dieksekusi ketika ada lebih dari 1 aturan yang dapat diterapkan pada saat ini negara.

Program ini akan dimasukkan ke dalam pengontrol untuk oven microwave, yang di dalamnya adalah kucing saya. Pintu ke oven microwave ditutup dan diperkuat oleh dasi ritsleting. Output dari program akan memutuskan apakah oven microwave mulai microwave kucing atau tidak.

  • Jika outputnya adalah 0, kami akan memulai percobaan tentang efek paparan microwave yang lama pada mamalia hidup (yang saat ini kurang diteliti).
  • Jika hasilnya 1, kita hanya akan puas dengan kenyataan bahwa kucing baru saja kehilangan satu dari 9 nyawanya dan membiarkannya keluar.

i::=~0
i::=~1
::=
i

Kemungkinan membunuh kucing tergantung pada implementasi penerjemah, tetapi katakanlah 50%. Maka kemungkinan kucing itu akan mati adalah 0,5 .

n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
sumber
Ketidakpastian bukan berarti tidak terdefinisi
Score_Under
@Score_Under: Apa poin Anda?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
Pertanyaannya menanyakan perilaku yang tidak terdefinisi, yang melibatkan perilaku pengungkit bahasa yang akan dikompilasi dan dijalankan, tetapi tidak memiliki spesifikasi mengenai apa yang seharusnya dilakukan. Menggantung sesuatu Math.random()misalnya bukan perilaku yang tidak ditentukan, hanya perilaku yang tidak dapat diprediksi.
Score_Di Bawah
1
@Score_Under: Dalam pertanyaan3. If you choose a language that doesn't have undefined behavior, use something similar.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
1

Jawa

Menurut spec java.util.Date akan memiliki perilaku yang tidak terdefinisi. Jadi cobalah keberuntungan Anda:

import java.util.Date;

public class App3
{
    public static void main (String args[])
    {
        String aliveOrDead;
        Date d = new Date(-1000,-1000,-1000);
        aliveOrDead = (d.getTime()<0)? "dead" : "alive";
        System.out.println("The cat is:" +aliveOrDead );
    }
}
RobAu
sumber