Неопределенное поведение убило моего кота [закрыто]


82

Неопределенное поведение убило мою кошку

Хорошо известно , что неопределенное поведение может убить вашу кошку [править] .
Но может ли это?

Твое задание

  1. Напишите программу, которая вызывает неопределенное поведение.
  2. Опишите сценарий, который начинается с запуска вышеуказанной программы, в результате чего кошка Felis заканчивает свою жизнь, находясь в вашей собственности, в результате вышеупомянутого UB.
  3. Оцените вероятность для каждого этапа в сценарии.
  4. Рассчитайте общую вероятность того, что один прогон программы убьет вашу кошку.

правила

  1. Это , поэтому будьте креативны, если можете.
  2. Это проблема, связанная с программированием, поэтому цепочка событий должна быть в основном внутри компьютера, а не в реальном мире (конечно, если он должен достичь реального мира, если там находится ваша кошка).
  3. Если вы выбираете язык, который не имеет неопределенного поведения, используйте что-то подобное.
  4. Никакие животные не могут пострадать в производстве вашего ответа.

счет

Подсчет голосов плюс общая вероятность сценария (который не может превышать 1).

Пример в C:

main(){printf();}

Сценарий:

  1. printfвызывается с мусором из стека - неопределенное поведение. Вероятность: 100%.
  2. Первый параметр - это строка Your cat is ugly!. Вероятность: (1/256) 17 = (1,148 * 10 -37 )%.
  3. Увидев сообщение, вы поднимаете пистолет и стреляете в своего кота. Вероятность: 3%.
  4. Кот умирает. Вероятность: 93%.

Общая вероятность: (3,202 * 10 -39 )%.


50
1) вызвать неопределенное поведение 2) по-прежнему вдохновляться тем фактом, что вы можете вызвать неопределенное поведение, и прожить долгую, счастливую жизнь 3) кот умирает от старости. Общая вероятность: 100%
Geobits

5
@ Оберон Я бы покончил с собой, если бы не смог придумать единственный способ создать UB после программирования так долго. Тогда кошка больше не будет в моем распоряжении. Призыв UB поддерживает меня в живых, так что «... в результате чего вы заканчиваете свою жизнь, находясь в вашей собственности ». Неоднозначный разбор FTW.
Geobits

8
Я был бы более удивлен, если бы кто-то переосмыслил это, чтобы убить catкоманду или что-то в этом роде.
Кешлам

5
-1 Я люблю кошек. Почему кошки? Почему бы не убить паразитов?
VX

22
Если кошку нужно есть, то Python - это решение.
Николас Барбулеско

Ответы:


113

С

Большинство ответов на этот вопрос неверно истолковали вопрос, поскольку он убивал catпроцесс в системе UNIX. Вот программа, которая может привести к исчезновению биологической формы жизни вида Felis Cattus, как указано в вопросе.

Этот пример работает в Windows, но его можно легко перенести в большинство операционных систем UNIX, заменив iexplore -kего командой для запуска установленного веб-браузера.

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

Эта программа делает вид, что предоставляет пользователю советы о кошачьем питании.

Он запустит Internet Explorer и направит пользователя на домашний стек домашних животных, где перечислены многие полезные вопросы о том, как кормить кошек. Однако существует небольшая (1/256) вероятность того, что он отправит пользователя на обмен стеками вместо того, чтобы перечислять советы по приготовлению блюд, содержащих шоколад, который очень токсичен для кошек . Что еще хуже, он запустит Internet Explorer в режиме киоска (полноэкранный режим), который скрывает адресную строку и от которого трудно уйти неопытному пользователю.

Эта хитрая уловка заставит пользователя кормить своего кота шоколадом, полагая, что это подходящая диета для него, и, таким образом, заставит его непреднамеренно убить его.


3
Ручка сильнее меча! :)
Питер Витвоеэт

12
Пока это выглядит как единственное решение, которое имеет реальный шанс на самом деле убить кошку. Я вынужден поднять голос, хотя я искренне надеюсь, что никто никогда не применяет это на практике.
Чарльз Стаатс

43
Internet Explorer может убить вашу кошку сам по себе.
Майкл Хэмптон

4
Вы можете добавить сценарий, шаг за шагом, который убивает кошку, с помощью анализа вероятности (как в примере)? Как это, это не правильный ответ.
Угорен

3
Использование Internet Explorer вызывает неопределенное поведение в ME. - прости, должен был это сказать.
Томсминг

88

удар

В соответствии с этим , INT_MIN % -1может быть или не быть неопределенным (что ???) , и поэтому может вызвать проблемы для любого языка, реализованного в c / c ++.

#!/bin/bash

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

Он catбудет убит досрочно, если bashпроизойдет сбой родительского процесса, что может произойти или не произойти.

На моей виртуальной машине я получаю этот вывод:

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

(Я не очень понимаю оценку для этого вопроса, но здесь все равно идет)

Подсчитайте $((2**63%-1)). Сбой всегда происходит на bash 4.2.25, но, кажется, просто зависает на некоторых версиях 3.x. Больше неуверенности. Я мог бы сказать вам точную вероятность, но из-за принципа неопределенности Гейзенбурга я бы упал в черную дыру. Или что-то. Поэтому я думаю, что мы можем с уверенностью сказать, что их вероятность составляет около 42%.


4
@ klingt.net: Это называется «Здесь строки» - это гораздо более googlable ... это ярлык дляecho $((-2**63/-1)) | cat
VX

14
+1 за использование реального cat.
Элвин Вонг

1
@mardavi INT_MAX = 2^63 - 1. Если мы добавим 1 к INT_MAX, 64-разрядное числовое пространство обернется, и мы получим INT_MIN. Другими словами, в 64-битной целочисленной арифметике со знаком 2^63 == -2^63. Я мог бы использовать -2**63, но предпочел краткость без -, поскольку модульная арифметика в этом случае одинакова.
Цифровая травма


1
Вы можете добавить сценарий, шаг за шагом, который убивает кошку, с помощью анализа вероятности (как в примере)? Как это, это не правильный ответ.
Угорен

40

C (точка последовательности)

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

Исполнение (или нет):

$ 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

Сценарий и вероятность

Предполагая, что пять процентов людей, работающих с этой программой, используют clang для компиляции кода C (против 90 процентов, использующих gcc, и 5 процентов, использующих другие компиляторы C):

Вероятность получения "Кошка в порядке". = .050
 Вероятность получения "Срочного уведомления: у вашей кошки бешенство". = 0,950

 Вероятность реакции на "Ваш кот имеет бешенство", подавляя его = .040
 Вероятность игнорирования уведомления = .900
 Вероятность отвода кошки к ветеринару для лечения = .060

 Общая вероятность жизни кошки: .05 + .95 * (.90 + .06) = .962
 Общая вероятность смерти кошки: .95 * .04 = .038
 Проверка: Общая вероятность того, что кошка живет или умирает: = 1.000

Объяснение:

k = i + (++ i) осуществляет доступ и изменяет «i» между точками последовательности. Вероятность не определяется программой; это зависит от выбора компилятора, который делает пользователь. «Не определено» не обязательно означает «случайный».

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


4
+1 за демонстрацию поведения с разными компиляторами.
ntoskrnl

1
Уровень оптимизации также может изменить поведение
чокнутый урод

1
@ rachet freak: Да, но я не смог продемонстрировать это с этой конкретной проблемой. Я пробовал -O0, -O1, -O2 и -O3 на нескольких версиях gcc от gcc-4.2.3 до gcc-4.8.2 и cc-5.0 на SunOS, но все они убили кошку.
Гленн Рандерс-Пёрсон

2
Вы можете добавить сценарий, шаг за шагом, который убивает кошку, с помощью анализа вероятности (как в примере)? Как это, это не правильный ответ.
Угорен

1
Я предполагал, что все кошки, которых отвезли к ветеринару, будут жить. Вероятно, некоторые из них умрут от заразной кошачьей болезни или от ветеринарной халатности. Это может немного изменить окончательные вероятности, скажем, .96 / .04
Гленн Рандерс-Персон

37

С

Предыстория

Моя жена унаследовала кошку от семьи. К сожалению, у меня очень аллергия на животных. Кошка прошла далеко от своего расцвета и должна была быть умерщвлена ​​еще до того, как мы ее получили, но она не могла заставить себя избавиться от нее из-за ее сентиментальной ценности. Я разработал план, чтобы положить конец моим страданиям.

Мы собирались в длительный отпуск, но она не хотела садиться на кошку в офисе ветеринара. Она была обеспокоена тем, что она заболела или подверглась жестокому обращению. Я создал автоматическую кормушку для кошек, чтобы мы могли оставить ее дома. Я написал прошивку микроконтроллера на C. Файл, содержащийся, mainвыглядел примерно так, как показано ниже.

Однако моя жена также программист и знала, что я чувствую к кошке, поэтому она настояла на проверке кода, прежде чем оставить ее дома без присмотра. У нее было несколько проблем, в том числе:

  • main не имеет подписи, соответствующей стандартам (для размещенной реализации)
  • main не возвращает значение
  • tempTmиспользуется неинициализированным, так как mallocбыл вызван вместоcalloc
  • возвращаемое значение mallocне должно быть приведено
  • время микроконтроллера может быть неточным или переворачиваться (похоже на проблемы с Y2K или Unix time 2038)
  • elapsedTimeпеременная не может иметь достаточный диапазон

Потребовалось много убеждений, но она, наконец, согласилась, что эти проблемы не были проблемами по разным причинам (не повредило, что мы уже опоздали на наш рейс). Поскольку времени для тестирования в прямом эфире не было, она утвердила код, и мы уехали в отпуск. Когда мы вернулись через несколько недель, мои кошачьи страдания закончились (хотя в результате у меня теперь намного больше).

† Полностью вымышленный сценарий, не беспокойтесь.


Код

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

Неопределенное поведение:

Для тех, кто не хочет искать UB самостоятельно:

В этом коде определенно определено локальное, неопределенное и определяемое реализацией поведение, но все должно работать правильно. Проблема заключается в следующих строках кода:

struct tm * tempTm //... //... memcpy(&tempTm, localtime(&nowTime), sizeof(struct tm));
memcpyперезаписывает tempTMуказатель вместо объекта, на который он указывает, разбивая стек. Это переписывает, помимо прочего, elapsedTimeи loopIterationsSinceFeed. Вот пример запуска, где я распечатал значения:

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


Вероятность убийства кота:

  • Учитывая ограниченную среду выполнения и цепочку сборки, всегда возникает неопределенное поведение.
  • Точно так же неопределенное поведение всегда мешает кормушке работать должным образом (или, скорее, позволяет ему «работать», как предполагалось).
  • Если кормушка не работает, очень вероятно, что кошка умрет. Это не тот кот, который может постоять за себя, и я не смог попросить соседа посмотреть на него.

Я считаю, что кошка умирает с вероятностью 0,995 .


Это (первый) &в memcpy, верно?
Score_Under

@Score_Under Да, позвольте мне немного отредактировать ответ. Я играл с другими способами использовать неопределенное поведение, но большинство было даже более очевидным.
Джерри

1
+1 за убийство кота, нет cat.
Кевин

31

удар

Классическая версия

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

Имеет преимущество убивать всех кошек в своем диапазоне.

Обратите внимание, что процесс немедленно останавливается , поэтому единственный способ завершить его одним вызовом pkill - это отправить SIGKILL (9).

Следовательно:

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


Квантовая версия

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.

Вероятность убийства кота во время эксперимента: 50%


+1 Но это скорее, чем я думаю. SIGINT (2), SIGQUIT (3), SIGABRT (6), SIGPIPE (13) и SIGTERM (15), по крайней мере, убивают его здесь.
мая 2013 года

@ l0b0: Это не так, по крайней мере, не сразу. cat &пытается читать с терминала, но не может. Любой из упомянутых вами сигналов (и еще несколько) будет работать, если вы отправите SIGCONT (18) впоследствии. Кроме того , я согласен , что отбой и прекращения кота будет таким же , как убийство , но прерывание не кажется удовлетворительным ...: P
Деннис

3
Неопределенное поведение использует особенность языка, который был определен как неопределенный . То есть разработчики языка целенаправленно оставили поведение некоторой синтаксической конструкции неопределенным, чтобы упростить реализацию или указать, что конструкция никогда не должна использоваться в какой-либо допустимой программе. Неопределенное поведение обычно не имеет ничего общего с генерацией случайных чисел, и здесь не используется неопределенное поведение.
OregonTrail

@OregonTrail: правила гласят, что если вы выбираете язык с неопределенным поведением, используйте что-то подобное. У Bash нет неопределенного поведения, поэтому я использовал случайные числа.
Деннис

3
Есть много неопределенного поведения в среде bash, которое можно использовать. Например, в ответе printf @DigitalTrauma Bash также используется системный printf, который имеет много неопределенного поведения.
OregonTrail

17

С

Обратите внимание, что это работает только на 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. Записать случайные данные в файл и вызвать его (100%)
  2. Случайные данные являются исходным кодом для skynet (1x10 ^ -9999999999999999999999999999999999999999999999999999999999999999, приблизительно.)
  3. Кошка умирает в наступающем конце света (99,999%)

Общая вероятность: 1x10 ^ -999999999999999999999999999999999999999999999999999999999999999, приблизительно.


хм, что такое скайнет?
Сардж Борщ

20
Где неопределенное поведение?
Угорен


1
@ugoren Я думаю, что запуск файла со случайным содержимым на самом деле не определен.
11684

2
@ 11684, если содержимое представляет собой код для skynet, программисты skynet знают, что они делают, нет неопределенного поведения.
Угорен

15

C ++

Ваша кошка мертва и жива, пока вы не любопытны. Тогда вы понимаете, что есть вероятность 0,5, что ваш кот мертв.

#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_deadпосле delete this?
Брайан Чен

@BryanChen: возвращение отсутствовало. Спасибо, что указали на это :-)
Abhijit

öне кажется допустимым символом в C ++. Может быть, заменить его на oe.
Руслан

13

С

Работает на 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;
}

Вероятность убийства кота: 1/256 ( sleep(1)Возвращает 0, поэтому он будет убит, если xравен нулю.)

В качестве бонуса он убивает всех кошек, которые в данный момент работают в вашей системе.


Если вы так ненавидите кошек, я представляю вам:

Кошачья многоножка (Баш)

echo "Hello World"|cat|cat|cat

Основываясь на том факте, что в «Многоножке человека» (первая последовательность) все три собаки многоножки собаки погибли и двое из трех человек многоножки человека погибли, я предполагаю, что вероятность убийства одной кошки составляет 5/6.


Кошка Сороконожка действительно смешная
Сардж Борщ

Кошачья многоножка должна быть «реальным» ответом.
Исмаэль Мигель

@ Ismael Miguel Вы, наверное, правы, я удалил код Си. Сначала это была шутка, но позже я понял, что могу перефразировать ее, чтобы сделать ее реальным ответом.
ace_HongKongIndependence

Вы можете сохранить свой код C, я имею и не имею ничего против. Я просто подумал, что версия Bash была более подходящей в качестве ответа.
Исмаэль Мигель

@Ismael Miguel Nah, этот код на C был довольно глупым
ace_HongKongIndependence

9

JavaScript

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

Исполнение:

  • Chrome: результаты в"Cat is fine"
  • Firefox: результаты в"Cat is dead"

Объяснение:

15.5.4.9 String.prototype.localeCompare (that)

Эти две строк сравниваются в определенной реализации моды

Цитируя Гленна Рандерса-Персонса, вероятность не определяется программой; это зависит от выбора браузера, который делает пользователь.


Невозможно воспроизвести на FF 27. Какую версию вы тестируете?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

-1: неопределенное поведение и поведение, определяемое реализацией, совершенно разные.
whitequark

2
@ whitequark Нет, это не так. Это определенная функция с неопределенным результатом. Ergo неопределенное поведение.
Джордж Райт

1
@ whitequark Я не вижу здесь C. Что касается JavaScript, то есть ли в JavaScript неопределенное поведение, кажется, что поведение, определенное реализацией, можно преодолеть.
Джордж Райт,

1
@ Белый Квартал, никто больше не смущен. Слово есть слово, мне не нужен комитет, чтобы сказать мне, что это значит.
Джордж Райт

9
int foo() {}

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

Чтение значения функции, которая должна возвращать значение, приводит к неопределенному поведению. Теперь, очевидно, [править] , что «Каждый раз , когда вы достигаете неопределенное поведение, Бог убивает котенка.» Используя это, мы заключаем:

  • Вероятность того, что вы достигнете неопределенного поведения - 100%
  • Вероятность, что это ваш кот, которого убил бог - 1/200 000 000, чтобы понять, почему
  • Таким образом, вероятность составляет 0,0000005%

Может быть легко продлен петлей, чтобы уничтожить всех кошек в мире.


5
Ваша вероятность в 100 раз выше (200 миллионов кошек, а не 2 миллиона).
Угорен

Я в процентах. :)
Петр

1
Это в процентах, и все же это в 100 раз больше.
Угорен

Вы правы, я не могу больше читать цифры, по-видимому.
Петр

Это неверно UB вызывается только в том случае, если вызывающая сторона пытается использовать возвращаемое значение. В противном случае это вполне законно и четко определено, чтобы выйти из конца функции с не возвращаемым типом возврата.
R ..

5

Java (Сборка мусора)

Хотя код может вызывать System.gc (), он не гарантирует, что сборщик мусора соберет все неиспользуемые объекты. Таким образом, для следующего кода непредсказуемо будет убит или нет кот.

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

Вероятность не может быть рассчитана.

Обратите внимание, что все еще есть шанс, что кошка будет «возрождена», если в потоке GC после sysout и до System.exit (0) будет переключение контекста, но я предпочел не включать его, чтобы упростить концепцию.


1
Это не хорошо. Этот код, как написано, почти всегда печатает оба. Лучше было бы добавить System.out.close()после System.out.println("Cat is still alive.");строки.
durron597

Насколько я понимаю, «почти всегда» соответствует аспекту непредсказуемости вопроса.
user3001267

5

Кто-нибудь думал о том, чтобы действительно убить (а) cat?

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

Вероятность catсмерти

Для вероятности ... Я думаю, нам нужно выделить несколько случаев:

  1. Пользователь Windows : вероятно, не сможет выполнить его. Вероятность смерти catочень мала, ее можно смело считать равной нулю. Если у него установлен Cygwin, он будет считаться пользователем Unix.
  2. Пользователь Unix, работающий без привилегий root : убить catне удастся.
  3. Пользователь Unix, работающий с привилегиями root : хотя каждый вызов убивает cats только с вероятностью 1/6, он, вероятно, будет повторять это, пока не произойдет что-то неожиданное. Я полагаю, catчто без потери общности обязательно умру.

Общая вероятность зависит от того, как пользователи смешаны и трудно определить. Но мы можем с уверенностью сказать: Windows - безопасное место для котят.

Тестирование на послушание правилам

Никакие животные не могут пострадать в производстве вашего ответа.

Это не убило животных, ответ одобрен Американской гуманной ассоциацией .

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

однозначно доказывает, что catэто не животное (так как долго fileне знает никакого вида наследования скрытых типов файлов).


5

С

Если имя вашей кошки слишком длинное, оно умирает. getsвызывает гибель кошек, наряду с другими проблемами.

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

Здесь мы применяем unsafePerformIOк действию, которое имеет наблюдаемые побочные эффекты . Это всегда неопределенное поведение, по крайней мере, таков порядок эффектов. Таким образом, либо программа сначала потерпит неудачу при попытке оценить undefined(что, по иронии судьбы, не является неопределенным поведением: она никогда не должна давать значение, которое позволит программе работать с чем-то другим), либо она фактически повлечет за собой серьезную международную побочные эффекты. В этом случае шанс на выживание составляет всего 0,001% .

Вероятность убийства кота при этом: 49,9995%.


3

Thue

Поскольку вопрос допускает язык, который не имеет неопределенного поведения при условии, что эффект аналогичен, я выбираю Thue для его недетерминированности при выборе правила для выполнения, когда существует более одного правила, которое может быть применено к текущему. государство.

Программа будет подаваться в контроллер для микроволновой печи, внутри которой находится моя кошка. Дверца микроволновой печи закрыта и укреплена стяжкой на молнии. Выходные данные программы будут определять, начнет ли микроволновая печь разогревать кота или нет.

  • Если выходной сигнал равен 0, мы начнем эксперимент по влиянию длительного воздействия микроволнового излучения на живых млекопитающих (которое в настоящее время недостаточно изучено).
  • Если результат равен 1, мы будем просто удовлетворены тем фактом, что кошка только что потеряла одну из своих 9 жизней и выпустила ее.

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

Вероятность убийства кота зависит от реализации интерпретатора, но допустим, это 50%. Тогда вероятность того, что кот умрет, равна 0,5 .



@Score_Under: Какова ваша точка зрения?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

Вопрос требует неопределенного поведения, которое включает использование поведения языка, который будет компилироваться и запускаться, но не имеет спецификации относительно того, что он должен делать на самом деле. Например, навязывание вещей Math.random()- это не неопределенное поведение, а просто непредсказуемое поведение.
Score_ под

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

1

Ява

Согласно спецификации java.util.Date будет иметь неопределенное поведение. Так что испытайте свою удачу:

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 );
    }
}
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.