정의되지 않은 행동으로 고양이를 죽였다


82

정의되지 않은 행동으로 고양이를 죽였다

잘 정의되지 않은 동작은 당신의 고양이를 죽일 수 있다고 알려져있다 [표창장은 필요로했다]를 .
하지만 할 수 있습니까?

당신의 작업

  1. 정의되지 않은 동작을 호출하는 프로그램을 작성하십시오.
  2. 위에서 언급 한 UB의 결과로, 소유하고있는 동안 Felis catus 의 수명이 종료 되는 위의 프로그램이 실행되는 시나리오를 설명 하십시오.
  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
@Oberon 너무 오랫동안 프로그래밍 한 후 UB를 만드는 단일 방법을 찾지 못하면 스스로 죽일 것 입니다. 그러면 고양이는 더 이상 내 소유가되지 않을 것입니다. UB를 호출하면 "... 결과적으로 소유권이있는 동안 수명이 종료 됩니다 ..." 모호한 구문 분석 FTW.
Geobits

8
누군가가 이것을 해석하여 cat명령이나 그와 비슷한 것을 죽이면 더 즐겁게 될 것입니다.
keshlam

5
-1 나는 고양이를 좋아한다. 왜 고양이? 왜 해충 해충을 죽이지 않습니까?
VX

22
고양이를 먹어야한다면 파이썬이 해결책이다.
Nicolas Barbulesco

답변:


113

이 질문에 대한 대부분의 답변 cat은 UNIX 시스템 에서 프로세스를 종료 한다는 점에서이 질문을 잘못 해석했습니다 . 여기 질문에 의해 특정 된 Felis Cattus 종의 생물학적 생명체가 소멸 될 수있는 프로그램이 있습니다.

이 예제는 Windows에서 실행되지만 iexplore -k설치된 웹 브라우저를 시작하는 명령으로 대체하여 대부분의 UNIX 운영 체제로 쉽게 이식 될 수 있습니다 .

#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를 시작하고 고양이에게 먹이를주는 방법에 대한 많은 유용한 질문 이있는 애완 동물 stackexchange를 사용자에게 안내합니다 . 그러나 고양이에게 매우 독성 있는 초콜릿이 포함 된 요리를 준비하는 방법에 대한 팁을 나열하는 대신 사용자에게 요리 스택 교환 을 보낼 가능성이 낮습니다 (1/256) . 설상가상으로, 키오스크 모드 (전체 화면)에서 인터넷 익스플로러를 시작하여 주소 표시 줄을 숨기고 기술에 익숙하지 않은 사용자에게는 탈출하기가 어렵습니다.

이 영리한 속임수는 고양이 초콜릿을 먹이기 위해 적절한 식사라고 생각하여 사용자가 실수로 죽일 수있게합니다.


3
펜은 칼보다 강하다! :)
Pieter Witvoet

12
이것은 실제로 고양이를 실제로 죽일 가능성이있는 유일한 솔루션처럼 보입니다. 아무도 실제로 실제로 그것을 실천하지 않기를 진심으로 희망하지만, 나는 공감해야한다.
Charles Staats

43
Internet Explorer는 고양이를 모두 죽일 수 있습니다.
Michael Hampton

4
확률 분석을 사용하여 (예에서와 같이) 고양이를 죽이는 시나리오를 단계별로 추가 할 수 있습니까? 그대로, 이것은 올바른 대답이 아닙니다.
ugoren

3
Internet Explorer를 사용하면 ME에서 정의되지 않은 동작이 발생합니다. — 죄송합니다.
초에 tomsmeding

88

세게 때리다

이것에 따르면 , INT_MIN % -1정의되지 않았거나 정의되지 않을 수도 있고 (what ???) , c / c ++로 구현 된 모든 언어에 문제를 일으킬 수 있습니다.

#!/bin/bash

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

cat부모의 경우 조기 사망됩니다 bash프로세스 또는 발생하지 않을 수있는 충돌합니다.

내 VM 에서이 출력을 얻습니다.

$ ./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 버전에서는 중단되는 것처럼 보입니다. 더 불확실성. 정확한 확률을 알려줄 수는 있지만 Heisenburg의 불확실성 원칙으로 인해 블랙홀로 떨어질 것입니다. 또는 뭔가. 따라서 확률이 대략 42 %라고 안전하게 말할 수 있다고 생각합니다.


4
@ klingt.net : "여기서 문자열"이라고합니다 – 훨씬 더 끈적 거립니다 ... 바로 가기echo $((-2**63/-1)) | cat
VX

14
real을 사용하면 +1입니다 cat.
Alvin Wong

1
@mardavi INT_MAX = 2^63 - 1. 에 1을 더하면 INT_MAX64 비트 숫자 공간이 줄 바꿈됩니다 INT_MIN. 다시 말해서 부호있는 64 비트 정수 산술에서 2^63 == -2^63. 이 경우 모듈 식 산술이 동일 -2**63하기 때문에을 사용할 수 있었지만을 사용 하지 않고 간결함을 선호했습니다 -.
디지털 외상


1
확률 분석을 사용하여 (예에서와 같이) 고양이를 죽이는 시나리오를 단계별로 추가 할 수 있습니까? 그대로, 이것은 올바른 대답이 아닙니다.
ugoren

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

시나리오와 확률

이 프로그램을 실행하는 사람들의 5 %가 C 코드 컴파일에 clang을 사용한다고 가정하면 (gcc를 사용하면 90 %, 다른 C 컴파일러를 사용하면 5 %) :

"고양이는 괜찮습니다." = .050
 "긴급 통지 : 고양이에게 광견병이 생겼습니다." = .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
@ratchet freak : 예,하지만이 특정 문제로 그것을 입증 할 수 없었습니다. SunOS에서는 gcc-4.2.3에서 gcc-4.8.2, cc-5.0에 이르는 많은 gcc 버전에서 -O0, -O1, -O2 및 -O3을 시도했지만 모두 고양이를 죽였습니다.
Glenn Randers-Pehrson

2
확률 분석을 사용하여 (예에서와 같이) 고양이를 죽이는 시나리오를 단계별로 추가 할 수 있습니까? 그대로, 이것은 올바른 대답이 아닙니다.
ugoren

1
치료를 위해 수의사에게 데려 간 고양이는 모두 살 것이라고 가정했습니다. 아마도 그중 일부는 전염성 고양이 질병에 걸리거나 수의학 과실로 사망 할 것입니다. .96 / .04와 같이 최종 확률이 약간 변경 될 수 있습니다.
Glenn Randers-Pehrson

37

뒷이야기

아내는 가족으로부터 고양이를 물려 받았습니다. 불행히도, 나는 동물에 매우 알레르기가 있습니다. 고양이는 그 전성기를 지났고 우리가 그것을 얻기 전에 안락사 되었음에도 불구하고 그녀는 감상적인 가치 때문에 고양이를 없애지 못했습니다. 나는 종료 할 계획 부화 그 고통을.

우리는 연장 휴가를 가고 있었지만 수의사의 사무실에서 고양이를 기르고 싶지 않았습니다. 그녀는 병이 위축되거나 학대받는 것에 대해 걱정했다. 집에두고 다닐 수 있도록 자동 고양이 피더를 만들었습니다. 마이크로 컨트롤러의 펌웨어를 C로 작성했습니다. 포함 된 파일 main은 아래 코드와 비슷합니다.

그러나 아내는 프로그래머이기도하고 고양이에 대한 나의 감정을 알고 있었으므로 집에서 무인 상태로두기로 동의하기 전에 코드 검토를 주장했다. 그녀는 다음과 같은 여러 가지 우려를 가지고있었습니다.

  • main 표준 호환 서명이 없습니다 (호스트 구현의 경우)
  • main 값을 반환하지 않습니다
  • tempTmmalloc대신에 호출 된 이후 초기화되지 않은 상태로 사용됩니다.calloc
  • 의 반환 값을 malloc캐스팅해서는 안됩니다
  • 마이크로 컨트롤러 시간이 부정확하거나 롤오버 될 수 있습니다 (Y2K 또는 Unix 시간 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스택을 분쇄합니다. 이것은 다른 것들뿐만 아니라, 덮어 쓰기, elapsedTimeloopIterationsSinceFeed. 다음은 값을 인쇄 한 예제 실행입니다.

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


고양이를 죽일 확률 :

  • 제한된 실행 환경과 빌드 체인이 주어지면 정의되지 않은 동작이 항상 발생합니다.
  • 마찬가지로, 정의되지 않은 동작은 항상 고양이 피더가 의도 한대로 작동하지 못하게합니다 (또는 의도 한대로 "작동"할 수 있도록합니다).
  • 피더가 작동하지 않으면 고양이가 죽을 가능성이 큽니다. 이 고양이는 스스로 방어 할 수있는 고양이가 아니기 때문에 이웃에게 그 고양이를 들여다 보라고 요구하지 않았습니다.

나는 고양이가 0.995 확률로 죽을 것으로 추정한다 .


&memcpy에서 (첫번째) 맞습니까?
Score_Under

@Score_Under 예, 답변을 약간 수정하겠습니다. 나는 정의되지 않은 행동을 활용하는 다른 방법을 가지고 놀았지만 대부분 더 분명했습니다.
jerry

1
고양이를 죽이고 +1하지 않습니다 cat.
Kevin

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)는 적어도 여기에서 죽입니다.
l0b0

@ l0b0 : 적어도 즉시는 아닙니다. cat &터미널에서 읽으려고하지만 읽을 수 없습니다. 나중에 SIGCONT (18)를 보내면 언급 한 모든 신호가 작동합니다. 또한, 나는 동의 끊기종료 고양이 것은 같은 것 살인 을하지만, 방해 가 만족하지 않는 것 ... : P
데니스

3
정의되지 않은 동작은 한 언어의 기능을 사용하고 지정된정의를 . 즉, 언어 설계자들은 구현을보다 쉽게하거나 구문이 유효한 프로그램에서 사용되어서는 안된다는 것을 나타 내기 위해 일부 구문 구문동작 을 정의되지 않은 상태로 두었습니다 . 정의되지 않은 동작은 일반적으로 난수 생성과 관련이 없으며 여기서 정의되지 않은 동작이 사용되지 않습니다.
OregonTrail

@OregonTrail : 규칙에 따르면 정의되지 않은 동작이없는 언어를 선택하는 경우 비슷한 것을 사용하십시오. Bash에는 정의되지 않은 동작이 없으므로 임의의 숫자를 사용했습니다.
Dennis

3
bash 환경에는 사용할 수있는 정의되지 않은 동작이 많이 있습니다. 예를 들어, @DigitalTrauma Bash의 printf의 답변은 정의되지 않은 동작이 많은 시스템의 printf도 사용합니다.
OregonTrail

17

이것은 리눅스에서만 작동합니다.

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 ^ -999999999999999999999999999999999999999999999999999999999999999, aprox).
  3. 고양이는 최후 심판의 날로 죽는다 (99.999 %)

총 확률 : 1x10 ^ -999999999999999999999999999999999999999999999999999999999999999, aprox.


흠, 스카이 넷이란?
Sarge Borsch

20
정의되지 않은 동작은 어디에 있습니까?
ugoren


1
@ugoren 임의의 내용으로 파일을 실행하는 것은 실제로 정의되지 않았다고 생각합니다.
11684

2
@ 11684, 내용이 skynet의 코드 인 경우 skynet의 프로그래머는 수행중인 작업을 알고 있으며 정의되지 않은 동작이 없습니다.
ugoren

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있습니까?
Bryan Chen

@BryanChen : 반품이 없습니다. 지적 해 주셔서 감사합니다 :-)
Abhijit

öC ++에서 유효한 기호가 아닌 것 같습니다. 로 교체하십시오 oe.
Ruslan

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을 반환하므로 0이면 죽습니다 x.)

보너스로 현재 시스템에서 실행중인 모든 고양이를 죽입니다.


당신이 고양이를 너무 싫어한다면, 나는 당신에게 선물합니다.

고양이 지네 (Bash)

echo "Hello World"|cat|cat|cat

에, 사실을 바탕으로 인간 지네 (첫 번째 순서) , 개 지네의 세 개는 죽고, 인간 지네의 3 명 중 2 명이 사망, 나는 1 고양이를 죽이는 확률이 5/6 인 것으로 추정된다.


고양이 지네 정말 재미있다
Sarge Borsch

고양이 지네는 "실제"답변이어야합니다.
Ismael Miguel

@Ismael Miguel 당신은 아마 C 코드를 제거했습니다. 처음에는 농담이되어야했지만 나중에 실제 답변으로 바꾸어 쓸 수 있다는 것을 깨달았습니다.
ace_HongKongIndependence

C 코드를 유지할 수 있습니다. 나는 bash 버전이 대답으로 더 적합하다고 생각했다.
Ismael Miguel

@Ismael Miguel Nah, C 코드는 어리석은 일이었습니다
ace_HongKongIndependence 23시 48 분

9

자바 스크립트

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

실행:

  • 크롬 : 결과"Cat is fine"
  • Firefox : 결과"Cat is dead"

설명:

15.5.4.9 String.prototype.locale 비교

두 문자열은 구현 정의 방식으로 비교됩니다.

Glenn Randers-Pehrson을 인용하면 프로그램에서 확률을 결정할 수는 없습니다. 사용자가 선택한 브라우저의 선택에 따라 다릅니다.


FF 27에서는 재현 할 수 없습니다. 어떤 버전을 테스트하고 있습니까?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

-1 : 정의되지 않은 동작과 구현 정의 된 동작이 완전히 다릅니다.
whitequark

2
@whitequark 아니에요. 결과가 정의되지 않은 정의 된 함수입니다. Ergo 정의되지 않은 동작.
George Reith

1
@ whitequark 여기에 C가 보이지 않습니다. JavaScript에 관한 한 , JavaScript에 정의되지 않은 동작이 있습니까? 구현 정의 된 동작이 통과 가능하다고 생각하는 것 같습니다.
George Reith

1
@whitequark 아무도 혼란스럽지 않습니다. 단어는 단어입니다. 나는 그것이 의미하는 바를 말해 줄위원회가 필요하지 않습니다.
George Reith

9
int foo() {}

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

값을 리턴하는 함수 값을 읽으면 정의되지 않은 동작이 발생합니다. 지금, 그것은 명백한이다 [표창장은 필요로했다] 것을 "당신은 정의되지 않은 동작에 도달 할 때마다 하나님이 고양이를 죽인다는." 이것을 사용하여 우리는 결론 :

  • 정의되지 않은 행동에 도달 할 확률-100 %
  • 가능성 신이 죽인 것은 당신의 키티입니다-1/200 000 000 이유를보십시오
  • 따라서 확률은 0.0000005 %입니다

세계의 모든 고양이를 근절하기 위해 루프로 쉽게 확장 할 수 있습니다.


5
당신의 확률은 100 배 너무 높습니다 (2M이 아닌 2 억 고양이).
ugoren

나는 퍼센트로있다. :)
Petr

1
백분율로 표시되지만 여전히 100 배가 높습니다.
ugoren

네 말이 맞아, 나는 더 이상 숫자를 읽을 수 없다.
Petr

이것은 올바르지 않습니다. UB는 호출자가 리턴 값을 사용하려고 시도하는 경우에만 호출됩니다. 그렇지 않으면, 무효가 아닌 리턴 유형을 가진 함수의 끝에서 벗어나는 것이 완전히 합법적이고 잘 정의되어 있습니다.
R ..

5

자바 (가비지 수집)

코드가 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);
    }
}

확률을 계산할 수 없습니다.

sysout 이후와 System.exit (0) 이전에 GC 스레드에 컨텍스트 전환이 있으면 고양이가 "부흥"할 가능성이 있지만 개념을 더 단순하게 유지하기 위해 커버를 사용하지 않는 것이 좋습니다.


1
이건 좋지 않아 작성된이 코드는 거의 항상 두 가지를 모두 인쇄합니다. 줄 System.out.close()뒤에 추가하는 것이 System.out.println("Cat is still alive.");좋습니다.
durron597

내가 이해하는 한, "거의 항상"은 질문의 예측 불가능한 측면과 일치합니다.
user3001267 2016 년

5

정말 살인을 생각한 사람이 cat있습니까?

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

의 Probabilitiy cat죽어

가능성을 위해 ... 몇 가지 경우를 구별해야한다고 생각합니다.

  1. Windows 사용자 : 아마 그것을 실행할 수 없습니다. 죽을 확률 cat은 매우 낮으며 안전하게 0으로 가정 할 수 있습니다. Cygwin이 설치되어 있으면 유닉스 사용자로 간주됩니다.
  2. 루트 권한없이 실행중인 Unix 사용자 : 종료 cat가 실패합니다.
  3. 루트 권한으로 실행되는 Unix 사용자 : 각 호출은 cat1/6의 기회 로만 s를 종료하지만 예기치 않은 일이 발생할 때까지 반복 할 것입니다. 일반성을 잃지 않으면 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

하스켈

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

여기, 우리 는 부작용이 관찰 가능한 행동에 적용 unsafePerformIO됩니다 . 그것은 항상 정의되지 않은 행동이며, 최소한 효과의 순서도 마찬가지입니다. 따라서 프로그램은 먼저 평가하려고 시도 할 때 충돌을 일으키거나 (아이러니 컬하게도 정의 되지 않은 행동 이 아닙니다 . 부작용. 이 경우 생존 확률은 0.001 %에 불과 합니다.undefined

따라서 고양이를 죽일 확률 : 49.9995 %.


3

질문이 효과가 비슷하지 않은 한 정의되지 않은 동작을하지 않는 언어를 허용하기 때문에 현재 적용 할 수있는 규칙이 두 개 이상일 때 실행할 규칙을 선택하는 데 결정적이지 않기 때문에 Thue를 선택합니다. 상태.

이 프로그램은 전자 레인지 용 컨트롤러에 공급되며 그 안에는 고양이가 있습니다. 전자 레인지의 문은 지퍼 타이로 닫히고 강화됩니다. 프로그램의 출력은 전자 레인지가 고양이를 전자 레인지로 시작할지 여부를 결정합니다.

  • 출력이 0이면 살아있는 포유 동물에 대한 마이크로파의 장시간 노출 효과에 대한 실험을 시작할 것입니다 (현재 연구가 불충분합니다).
  • 출력이 1이면 고양이가 9 명의 생명 중 하나를 잃어 버렸다는 사실에 만족할 것입니다.

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

고양이를 죽일 확률은 통역사의 구현에 달려 있지만 50 %라고 가정 해 봅시다. 고양이가 죽을 확률은 0.5 입니다.


결정되지 않은 것은 정의되지 않은 것을 의미하지 않습니다
Score_Under

@Score_Under : 요점이 뭐예요?
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳

이 질문은 정의되지 않은 행동을 요구하는데, 여기에는 컴파일하고 실행할 언어의 행동을 활용하는 것이 포함되지만 실제로 어떻게해야하는지에 대한 명세는 없습니다. Math.random()예를 들어 물건을 정지시키는 것은 정의되지 않은 행동이 아니라 예측할 수없는 행동입니다.
Score_Under

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 );
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.