Tanımsız Davranış Kedimi Öldürdü [kapalı]


82

Tanımsız Davranış Kedimi Öldürdü

Tanımsız davranışların kedinizi [ihtiyaç duyulan atıfta] öldürebildiği iyi bilinmektedir .
Ama olabilir mi?

Senin görevin

  1. Tanımlanamayan davranışı başlatan bir program yazın.
  2. Yukarıda belirtilen UB'nin bir sonucu olarak, yukarıdaki programın çalıştırılmasıyla başlayan ve bir Felis catus'un mülkünüzdeyken ömrünü sonlandıran bir senaryoyu tanımlayın .
  3. Senaryodaki her aşama için olasılığı tahmin edin.
  4. Programın tek bir çalıştırmasının kedinizi öldürmesi olasılığını hesaplayın.

kurallar

  1. Bu bir , eğer yapabilirsen yaratıcı ol.
  2. Bu programlama ile ilgili bir zorluktur, bu nedenle olaylar zinciri çoğunlukla bilgisayar içinde olmalıdır, gerçek dünyada değil (elbette, kedinizin olduğu yerde gerçek dünyaya ulaşmak zorundaysa).
  3. Tanımlanamayan davranışı olmayan bir dil seçtiyseniz, benzer bir şey kullanın.
  4. Cevabınızın üretiminde hiçbir hayvan zarar görmez.

puanlama

Oy sayısı artı senaryonun toplam olasılığı (1'i geçemez).

C'deki örnek:

main(){printf();}

Senaryo:

  1. printftanımlanmamış davranış - yığından çöp olarak adlandırılır. Olasılık:% 100
  2. İlk parametre dize olur Your cat is ugly!. Olasılık (1/256) 17 = (1.148 x 10 -37 )%.
  3. Mesajı görünce silahını alıp kedini vur. Olasılık:% 3
  4. Kedi ölür. Olasılık:% 93

Toplam olasılık: (3,202 * 10 -39 )%.


50
1) Tanımsız davranışı çağırın 2) Tanımsız davranışı başlatabildiğiniz gerçeğinden ilham alın ve uzun, mutlu bir hayat yaşayın 3) Kedi yaşlılıktan ölür. Toplam olasılık: 100%
Geobits

5
@Oberon Programlamadan sonra uzun bir UB oluşturmak için tek bir yol bulamazsam kendimi öldürürüm . O zaman kedi artık elime geçemezdi. UB çağırma böylece "... kendi hayatına son, beni hayatta tutan sahipliğinizden iken , sonuç olarak ...". Belirsiz ayrıştırma FTW.
Geobits

8
Birisi catemri ya da böyle bir şeyi öldürmek için bunu yeniden yorumlarsa çok eğlenirim .
keshlam

5
-1 Kedileri severim. Neden kediler? Neden haşarat öldürmüyorlar?
VX

22
Bir kedi yenirse, Python bir çözümdür.
Nicolas Barbulesco

Yanıtlar:


113

C

Bu sorunun çoğu cevabı cat, bir UNIX sistemindeki süreci öldürdüğü sorusunu yanlış yorumladı . İşte soruya göre Felis Cattus türünün biyolojik bir yaşam biçiminin ölümüne neden olabilecek bir program.

Bu örnek Windows'ta çalışır, ancak iexplore -kyüklü bir web tarayıcısını başlatma komutunu değiştirerek çoğu UNIX işletim sistemine kolayca taşınabilir .

#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;
}

Bu program, kullanıcıya kedi diyetleri hakkında tavsiyelerde bulunur.

Bu ınternet Explorer'ı ve kullanıcıyı yönlendirir evcil hayvan Stack Exchange kedileri beslemek için nasıl yararlı sorulardan listeleme sürü. Bununla birlikte, düşük (1/256) bir kullanıcıyı , kediler için çok toksik olan çikolata içeren yemeklerin nasıl hazırlanacağına dair ipuçlarının listelenmesi için kullanıcıyı pişirme yığınına göndermesi olasılığı düşüktür . Daha da kötüsü için, Internet Explorer'ı kiosk modunda (tam ekran) başlatacak, bu da adres çubuğunu gizleyen ve teknoloji meraklısı olmayan bir kullanıcı için kaçması zor olan kiosk modunda başlayacak.

Bu akıllı oyun, kullanıcının uygun bir diyet olduğuna inanan kedi çikolatasını beslemesine yardımcı olacak ve böylece istemeden öldürmelerini sağlayacak.


3
Kalem kılıçtan keskindir! :)
Pieter Witvoet

12
Bu, şu ana kadar bir kediyi öldürme konusunda gerçekçi bir şansı olan tek çözüm gibi görünüyor. Hiç kimsenin bunu uygulamaya koymadığını umuyorum, ancak içtenlikle umursamıyorum.
Charles,

43
Internet Explorer kedinizi tek başına öldürebilir.
Michael Hampton,

4
Olasılık analiziyle (örnekte olduğu gibi) kediyi öldüren senaryoyu adım adım ekleyebilir misiniz? Olduğu gibi, bu geçerli bir cevap değil.
ugoren

3
Internet Explorer kullanmak, ME'de tanımsız davranışa neden olur. - üzgünüm, bunu söylemek zorunda kaldı.
14'e

88

darbe

Buna göre , INT_MIN % -1ya tanımsız olabilir veya olmayabilir (neyi ???) c / c ++ uygulanan herhangi bir dil için soruna neden olabilir bu yüzden, vb.

#!/bin/bash

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

catEbeveyn erken öldürülecek bashsüreç veya gerçekleşmeyebilir olabilir, çöküyor.

VM'mde bu çıktıyı alıyorum:

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

(Bu sorunun puanını gerçekten anlamıyorum, ama yine de devam ediyor)

Hesapla $((2**63%-1)). Çarpışma her zaman bash 4.2.25'te gerçekleşir, ancak bazı 3.x sürümlerinde durduğu görülür. Daha fazla belirsizlik. Size kesin olasılığını söyleyebilirim, ancak Heisenburg belirsizlik ilkesi nedeniyle o zaman bir kara deliğe düşecektim. Ya da başka birşey. Bu yüzden, olasılıklarının yaklaşık% 42 olduğunu güvenle söyleyebiliriz.


4
@ klingt.net: "Here Strings" olarak adlandırılıyor - çok daha googlable ... kısayolecho $((-2**63/-1)) | cat
VX

14
Gerçek kullanmak için +1 cat.
Alvin Wong,

1
@ mardavi INT_MAX = 2^63 - 1. 1'e eklersek INT_MAX, 64bit sayı alanı sarılır ve elde ederiz INT_MIN. Başka bir deyişle imzalı 64bit tamsayı aritmetiği 2^63 == -2^63,. Modüler aritmetik bu durumda aynı olduğu için kullanabilirdim -2**63, ancak özsüzlüğü tercih ettim -.
Dijital Travma


1
Olasılık analiziyle (örnekte olduğu gibi) kediyi öldüren senaryoyu adım adım ekleyebilir misiniz? Olduğu gibi, bu geçerli bir cevap değil.
ugoren

40

C (sıra noktası)

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);
}

İcra (ya da değil):

$ 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

Senaryo ve olasılık

Bu programı çalıştıran kişilerin yüzde beşinin C kodunu derlemek için clang kullandığını varsayarak (gcc kullanarak yüzde 90 ve diğer C derleyicileri kullanarak yüzde 5):

"Kedi iyi." Alma olasılığı. = .050
 "Acil Uyarı: Kedinizde kuduz vardır" alma olasılığı. = .950

 "Kedinizin kuduz olduğu" ifadesine yer vererek tepki verme olasılığı = .040
 Bildirimi görmezden gelme olasılığı = 900
 Kediyi tedavi için veterinere götürme olasılığı = 0,060

 Kedilerin yaşama olasılığı: .05 + .95 * (.90 + .06) = .962
 Kedi ölümünün toplam olasılığı: .95 * .04 = .038
 Kontrol: Kedinin yaşama veya ölme olasılığı: = 1.000

Açıklama:

k = i + (++ i), dizi noktaları arasında "i" ye erişir ve bunları değiştirir. Olasılık program tarafından belirlenemez; kullanıcı tarafından yapılan derleyici seçimine bağlıdır. "Tanımsız" mutlaka "rastgele" anlamına gelmez.

Bkz. Https://stackoverflow.com/questions/4176328/undefined-behavior-and-sequence-points


4
Farklı derleyicilerle davranışını göstermek için +1.
ntoskrnl

1
optimizasyon seviyesi de davranışını değiştirebilir
cırcır ucube

1
@ cırcır ucube: Evet, ama bu belirli bir sorunla bunu kanıtlayamadım. -O0, -O1, -O2 ve -O3'ü, gcc-4.2.3 ila gcc-4.8.2 ve SunOS üzerindeki cc-5.0 sürümlerinde denedim, ancak hepsi kediyi öldürdü.
Glenn Randers-Pehrson

2
Olasılık analiziyle (örnekte olduğu gibi) kediyi öldüren senaryoyu adım adım ekleyebilir misiniz? Olduğu gibi, bu geçerli bir cevap değil.
ugoren

1
Tedavi için veterinere götürülen tüm kedilerin yaşayacağını varsaydım. Muhtemelen bunlardan bazıları bulaşıcı bir kedi hastalığı yakalamaktan ya da veterinerlik yanlış uygulamalarından ölecektir. Bu, son olasılıkları biraz değiştirebilir, demek ki .96 / .04
Glenn Randers-Pehrson

37

C

backstory

Karım aileden bir kedi miras aldı. Maalesef hayvanlara çok alerjim var. Kedi asalının çok ötesindeydi ve biz alınmadan bile ötenazi yapılmalıydı, ancak duygusal değeri nedeniyle ondan kurtulmak için kendisini getiremedi. Acımı sona erdirmek için bir plan yaptım .

Uzun bir tatile gidecektik, ancak kediyi veterinerin ofisine koymak istemedi. Hastalığa yakalanma ya da kötü muamele görmekten endişe duyuyordu. Otomatik bir kedi besleyici oluşturdum, böylece evde bırakabilirdik. Mikrodenetleyicinin ürün mainbilgisini C'ye yazdım. İçindeki dosya aşağıdaki koda benziyordu.

Bununla birlikte, karım da bir programcı ve kediye olan duygularımı biliyordu, bu yüzden onu evde gözetimsiz bırakmayı kabul etmeden önce bir kod incelemesinde ısrar etti. Aşağıdakiler de dahil olmak üzere çeşitli endişeleri vardı:

  • main Standartlara uygun bir imzası yoktur (barındırılan bir uygulama için)
  • main bir değer döndürmez
  • tempTmmallocyerine çağrıldığından bu yana başlatılmamış kullanılırcalloc
  • geri dönüş değeri mallocatılmamalıdır
  • mikrodenetleyici süresi yanlış veya devrilebilir (Y2K veya Unix time 2038 problemlerine benzer şekilde)
  • elapsedTimeDeğişken yeterli bir aralığı olmayabilir

Çok ikna edici oldu, ancak sonunda tezlerin çeşitli nedenlerden dolayı sorun olmadığına karar verdi (uçağımıza geç kalmamıza bile zarar vermedi). Canlı test için zaman olmadığından, kodu onayladı ve tatile gittik. Bir kaç hafta sonra döndüğünde, benim (bir sonucu olarak şimdi daha bir sürü var gerçi) kedinin sefalet bitmişti.

† Tamamen hayali senaryo, endişe yok.


kod

#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;
        }
    }
}

Tanımlanmamış davranış:

UB'nin kendisini bulmasını zahmet etmek istemeyenler için:

Bu kodda kesinlikle yerel-spesifik, tanımlanmamış ve uygulama-tanımlanmış bir davranış vardır, ancak hepsinin doğru çalışması gerekir. Sorun şu kod satırlarındadır: işaretçiyi

struct tm * tempTm //... //... memcpy(&tempTm, localtime(&nowTime), sizeof(struct tm));
memcpy, tempTMişaret ettiği nesne yerine yığının üzerine koyarak yazar. Bu, diğer şeylerin yanı sıra, yazar, elapsedTimeve loopIterationsSinceFeed. İşte değerleri yazdırdığım bir örnek çalışma:

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


Kediyi öldürme olasılığı:

  • Kısıtlı yürütme ortamı ve yapı zinciri göz önüne alındığında, tanımsız davranış her zaman gerçekleşir.
  • Benzer şekilde, tanımsız davranış her zaman kedi besleyicinin amaçlandığı gibi çalışmasını önler (veya daha doğrusu amaçlandığı gibi "çalışmasına" izin verir).
  • Besleyici çalışmıyorsa, kedinin ölmesi muhtemeldir. Bu, kendisi için savaşabilecek bir kedi değil ve komşunun ona bakmasını istemedim.

Kedinin 0,995 olasılıkla öldüğünü tahmin ediyorum .


&Memcpy'deki ilk (ilk) , değil mi?
Score_Under

@Score_Under Evet, cevabı biraz düzenlememe izin verin. Tanımlanamayan davranışlardan yararlanmanın diğer yolları ile oynuyordum, ancak çoğu daha açıktı.
jerry

1
Bir kediyi öldürmek için + 1 değil cat.
Kevin

31

darbe

Klasik versiyon

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

Menzildeki tüm kedileri öldürme avantajına sahiptir.

İşlemin derhal durdurulduğuna dikkat edin, bu nedenle tek bir pkill çağrısı ile sonlandırmanın tek yolu SIGKILL (9) 'u göndermek.

Bu nedenle:

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


Kuantum versiyonu

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.

Deney sırasında kediyi öldürme olasılığı:% 50


+1 Ama sandığımdan daha muhtemel. SIGINT (2), SIGQUIT (3), SIGABRT (6), SIGPIPE (13) ve SIGTERM (15), en azından burada onu öldürür.
lbb0

@ l0b0: Değil, en azından hemen değil. cat &terminalden okumaya çalışır, ancak yapamaz. Daha sonra SIGCONT (18) gönderirseniz, bahsettiğiniz sinyallerden herhangi biri (ve birkaç tane daha) çalışacaktır. Ayrıca, ben kabul kapatıyorum ve sonlandırma kedi ile aynı olacağını öldürme onu ancak kesintiye o tatminkar görünmüyor ...: P
Dennis

3
Tanımsız davranış edilmiş bir dilin özelliği kullandığını belirtilen şekilde tanımlanmamış . Diğer bir deyişle, dil tasarımcıları, uygulamayı kolaylaştırmak veya yapının hiçbir zaman geçerli bir programda kullanılmaması gerektiğini belirtmek için tanımlanmamış bazı sözdizimsel yapının davranışını bilerek terk etmişlerdir . Tanımsız davranışın genellikle rasgele sayı üretmeyle ilgisi yoktur ve burada tanımlanmamış bir davranış kullanılmamaktadır.
OregonTrail

@OregonTrail: Kurallar , tanımsız davranışı olmayan bir dil seçerseniz, benzer bir şey kullanın. Bash tanımsız bir davranış sergilemediğinden rasgele sayılar kullandım.
Dennis

3
Kullanılabilecek bash ortamında tanımlanmamış davranış var. Örneğin, @DigitalTrauma Bash'in printf yazısının cevabı, tanımlanmamış davranışa sahip olan sistemin printf'ini de kullanıyor.
OregonTrail

17

C

Bunun sadece linux üzerinde çalıştığını unutmayın.

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. Bir dosyaya rastgele veri yaz ve çağır (100%)
  2. Rasgele veri skynet'in kaynak kodudur (1x10 ^ -999999999999999999999999999999999999999999999999999999999999, aprox.)
  3. Kedi sonuçta ortaya çıkan kıyamette ölür (% 99,999)

Toplam olasılık: 1x10 ^ -999999999999999999999999999999999999999999999999999999999999999, aprox.


hmmmm, skynet nedir?
Sarge Borsch,

20
Tanımsız davranış nerede?
ugoren


1
@ugoren Rasgele içerikli bir dosyayı çalıştırmak gerçekten tanımlanmadığını düşünüyorum.
11684

2
@ 11684, Eğer içerik skynet koduysa, skynet programcıları ne yaptıklarını bilirler, tanımsız davranış yoktur.
ugoren

15

C ++

Kediniz, Meraklı olana kadar Hem Ölü hem de Canlı. Öyleyse, Kedinizin Ölü olma ihtimalinin 0,5 ihtimal olduğunu fark edersiniz.

#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;

}

this->m_deadsonra erişebilir delete thismisin?
Bryan Chen,

@ BryanChen: Bir geri dönüş eksikti. İşaretlediğin için çok teşekkür ederim :-)
Abhijit

öC ++ 'da geçerli bir simge olarak görünmüyor. Belki onunla değiştir oe.
Ruslan

13

C

Linux üzerinde çalışır.

#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;
}

Kediyi öldürme olasılığı: 1/256 ( sleep(1)0 döndürür, yani xsıfır ise öldürülür .)

Bir bonus olarak, şu anda sisteminizde çalışan tüm kedileri öldürür.


Eğer kedilerden çok nefret ediyorsan, sana sunarım:

Kedi Kırkayak (Bash)

echo "Hello World"|cat|cat|cat

İçinde, gerçeğine dayanarak İnsan Centipede (İlk Sıra) , köpek kırkayak her üç köpek öldü ve insan kırkayak iki üç kişiden öldü, ben bir kedi öldürme olasılığı 5/6 olduğuna tahmin ediyoruz.


Kedi Kırkayak gerçekten komik
Sarge Borsch

Kedi kırkayak "gerçek" cevap olmalıdır.
Ismael Miguel,

@Ismael Miguel Muhtemelen haklısın, C kodunu kaldırdım. İlk başta şaka olması gerekiyordu, ancak daha sonra bunu gerçek bir cevap haline getirmek için tekrar silebileceğimi anladım.
ace_HongKongIndependence

Sen C kodunu tutabilirsin, ben buna karşı hiçbir şeyim yoktu. Ben sadece bash versiyonu bir cevap olarak daha uygun olsa da.
Ismael Miguel

@ İsmael Miguel Nah, bu C kodu zaten oldukça aptaldı
ace_HongKongIndependence

9

JavaScript

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

Yürütme:

  • Chrome: içindeki sonuçlar"Cat is fine"
  • Firefox: içindeki sonuçlar"Cat is dead"

Açıklama:

15.5.4.9 String.prototype.localeCompare (ki)

İki dizi, uygulama tanımlı bir şekilde karşılaştırıldı.

Glenn Randers-Pehrson'dan alıntı yaparak, olasılık program tarafından belirlenemez; kullanıcı tarafından yapılan tarayıcı seçimine bağlıdır.


FF 27'de çoğaltılamaz. Hangi sürümde test ediyorsunuz?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

-1: tanımsız davranış ve uygulama tarafından tanımlanan davranış tamamen farklıdır.
whitequark

2
@whitequark Hayır değiller. Tanımlanmamış bir sonucu olan tanımlı bir fonksiyondur. Ergo tanımsız davranış.
George Reith

1
@whitequark Burada hiçbir C göremiyorum. JavaScript söz konusu olduğunda JavaScript'in tanımlanmamış bir davranışı var mı , uygulamanın tanımlanmış davranışının başarılı olduğunu düşünüyor gibi görünüyor.
George Reith

1
@whitequark kimsenin kafası karıştı değil. Bir kelime bir kelimedir, bana ne anlama geldiğini söylemek için bir komiteye ihtiyacım yok.
George Reith

9
int foo() {}

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

Bir değer döndürmesi beklenen bir fonksiyonun değerini okumak tanımsız davranışla sonuçlanır. Şimdi, açık bir şekilde [alıntı gerekli] “Tanımsız davranışa her ulaştığınızda, Tanrı'nın bir kediciyi öldürdüğü” açıktır . Bunu kullanarak şu sonucu çıkardık:

  • Tanımlanmamış davranışa ulaşma olasılığı - 100%
  • Olasılık tanrının öldürdüğü pisidir - 1/200 000 000 nedenini gör
  • Yani olasılık% 0,0000005

Dünyadaki tüm kedileri yok etmek için döngü ile kolayca genişletilebilir.


5
Olasılığın 100 kat fazla (200M kedi, 2M değil).
ugoren

Yüzdelerde bulundum. :)
Petr

1
Yüzdelerde ve hala 100 kat fazla.
ugoren

Haklısın, görünüşe göre artık numaraları okuyamıyorum.
Petr

Bu yanlış. UB, yalnızca arayan kişi dönüş değerini kullanmaya çalıştığında çağrılır. Aksi takdirde, geçersiz iade türüyle bir işlevin sonundan çıkmak tamamen yasal ve iyi tanımlanmıştır.
R. ..

5

Java (Çöp Toplama)

Her ne kadar kod System.gc'yi çağırabilse de (), Çöp Toplayıcı'nın kullanılmayan tüm nesneleri toplayacağından emin değildir. Bu nedenle, aşağıdaki kod için, kedinin öldürülüp öldürülmeyeceği tahmin edilemez.

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);
    }
}

Olasılık hesaplanamaz.

GC'nin iş parçacığından sonra ve System.exit'ten (0) önce bir bağlam anahtarı varsa kedinin “canlandırılması” ihtimalinin olduğunu unutmayın; ancak kavramı daha basit tutmak için örtmemeyi tercih ettim.


1
Bu iyi değil. Yazılan bu kod neredeyse her zaman her ikisini de yazdırır. Satırdan System.out.close()sonra eklemek daha iyi olur System.out.println("Cat is still alive.");.
durron597

Anladığım kadarıyla, "neredeyse her zaman", sorunun öngörülemez yönüyle eşleşiyor.
user3001267

5

Gerçekten (a) öldürmeyi düşünen var catmı?

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

catÖlme Olasılığı

Olasılık için ... Sanırım bazı vakaları ayırmamız gerekiyor:

  1. Windows kullanıcısı : Muhtemelen onu çalıştıramayacak. Ölüm catolasılığı çok düşük, güvenli bir şekilde sıfır olduğu varsayılabilir. Cygwin kurulduysa, unix kullanıcısı sayılır.
  2. Unix kullanıcısı, root ayrıcalıkları olmadan çalışıyor : Öldürmek catbaşarısız olacak.
  3. Kök ayrıcalıklarıyla çalışan Unix kullanıcısı : Her çağrı sadece cat1/6 şansı ile öldürürken , muhtemelen beklenmedik bir şey oluncaya kadar tekrarlayacaktır. Genellik kaybı olmadan catkesinlikle öleceğini sanıyorum .

Genel olasılık, kullanıcıların nasıl karıştığına ve belirlenmesinin zor olmasına bağlıdır. Ancak şunu söyleyebiliriz: Windows yavru kediler için güvenli bir yer.

Kurallara itaat etme testi

Cevabınızın üretiminde hiçbir hayvan zarar görmez.

Bu hayvanları öldürmedi, cevabı Amerikan İnsani Derneği tarafından onaylandı .

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

Bunun cathayvan olmadığını açıkça kanıtlar ( fileherhangi bir gizli dosya türü devralma bilmediği sürece ).


5

C

Kedinizin adı çok uzunsa, ölür. getsdiğer sorunların yanı sıra kedi ölümlerine neden olur.

#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;
}

4

Haskell

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

Burada, gözlemlenebilir yan etkileriunsafePerformIO olan bir eylem için başvuruyoruz . Bu her zaman tanımsız davranış, en azından etkilerin sırası böyle. Bu yüzden, program ilk önce değerlendirme girişiminde çökmeye başlayacaktır undefined(ki, ironik olarak tanımsız bir davranış değildir : asla programın başka bir şeyle devam etmesine izin verecek bir değer vermemelidir), ya da aslında ciddi uluslararası yan etkiler. Bu durumda, hayatta kalma şansı sadece% 0.001'dir .

Böylece kediyi öldürme olasılığı:% 49.9995.


3

Thue

Soru, etkisi benzer olduğu sürece tanımsız davranışa sahip olmayan bir dilin kullanımına izin verdiği için , şu an üzerinde uygulanabilecek 1'den fazla kural varken hangi kuralın uygulanacağını belirlerken belirsizliği nedeniyle Thue'yu seçerim. durum.

Program, içinde benim kedim olan bir mikrodalga fırın için kontrol ünitesine beslenir. Mikrodalga fırının kapısı kapalı ve fermuarlı bir bağ ile güçlendirilmiş. Programın çıktısı, mikrodalga fırının kedinin mikrodalga işlemine başlayıp başlamayacağına karar verecektir.

  • Çıktı 0 ise, mikrodalganın canlı memelilere uzun süre maruz kalmasının etkisi üzerine deneye başlayacağız (şu anda yeterince araştırılmamıştır).
  • Çıktı 1 ise, kedinin 9 hayatından birini kaybettiği ve bıraktığı gerçeğinden memnun kalacağız.

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

Kediyi öldürme olasılığı tercümanın uygulanmasına bağlıdır, ancak diyelim ki% 50. O zaman kedinin ölme olasılığı 0,5'tir .


Belirsiz olmayan, tanımlanmamış anlamına gelmez
Score_Under

@Score_Under: Amacınız nedir?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Soru, derlenecek ve çalışacak bir dilin davranışını güçlendirmeyi içeren ancak gerçekte ne yapması gerektiğine ilişkin bir belirtimi bulunmayan tanımsız davranışlar ister. Örneğin bazı şeylere dayanmak Math.random()tanımsız davranış değildir, sadece öngörülemeyen davranışlardır.
Score_Under

1
@Score_Under: Soruda3. If you choose a language that doesn't have undefined behavior, use something similar.
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

1

Java

Spesifikasyona göre java.util.Datetanımsız davranışlar olacaktır. Öyleyse şansını dene:

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 );
    }
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.