Задача: написать кусок кода, который завершает свою работу [закрыто]


39

Я ищу (не так ли?) Кусок кода, который немедленно завершается - совершенно нетрадиционным способом.

Это не значит: System.exit((int) 'A');(Java).

Это может означать:

#!/usr/bin/env python3
# NOTE: This kills ALL RUNNING Python processes. Be careful!
def exit():
    import os
    os.system("killall python3")
    # Windows addon
    os.system("taskkill /im python.exe /f")
exit()

Ответ с наибольшим количеством голосов победил! Все языки, все архитектуры.

Редактировать: выход, выбрасывая исключения больше не будут приняты!


3
Но это не является нетрадиционным для завершения выполнения ... Ну, это альтернатива exit(), но все же это реализованная функция ...
s3lph

13
Это не код троллинг - мы знаем, что мы хотим странные ответы от этого.
Лиам Доусон

6
Работает ли выключение системы?
Hosch250

8
Однажды я случайно вызвал сетевую карту для DMA через операционную систему. Когда это произошло, вы сразу же вернулись в BIOS, перезагрузившись.
Бен Джексон

3
Я чувствую, что Шеннон заставил нас победить здесь;)
яркая звезда

Ответы:


44

Баш, 6 символов

exec [

execзаменяет текущий процесс чем-то другим. [это самая короткая команда, которую я смог найти безвредной (это псевдоним для test)


Другое исключение?
Йоханнес Кун

Нет, просто execпо [команде :)
Деннис Каарсемакер

1
почему это работает? что делает [делает?
s3lph

@the_Seppi заменяет текущий процесс на [(он же тест)
Timtech

~ $ echo $PATH/?-> /bin/X /bin/[ /bin/w. Рыбная раковина дала мне две другие команды. wинтересно на мой взгляд.
Конрад Боровски

46

удар

echo "Turn off your computer or i'll wipe your harddrive..."
echo 3;sleep 1
echo 2;sleep 1
echo 1;sleep 1
dd if=/dev/random of=/dev/hda

Завершает программу так быстро, как пользователь может реагировать ;-)


10
Upvoting, потому что это заставило меня смеяться.
Майкл Стерн

5
Лучше не запускать его на Linux.
Кенорб

1
дд: / dev / hda: не найден
Джошуа

39

Redcode

(Справочная информация: Redcode - это язык псевдо-ассемблера, используемый в игре для программирования Core War, представленной AK Dewdney в 1984 году. В ней обычно интенсивно используется самоизменяющийся код. Я написал симпатичное небольшое руководство по программированию Redcode несколько лет назад. )

MOV 1, 0

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

Скучно, говоришь? В конце концов, вышеприведенная программа в любом случае умерла бы, даже если бы она не перезаписывала свой код. Хорошо, вот тот, который стирает все ядро перед тем, как окончательно вытереть себя и умереть:

loop: MOV  ptr+1, >ptr 
      JMN  loop, loop
      SPL  1
      SPL  1
      MOV  ptr+1, >ptr
ptr:  DAT  0, 1

Первые две инструкции фактически выполняют большую часть работы: это просто простой цикл копирования / перехода, который копирует пустую ячейку инструкции (которая инициализируется DAT 0, 0) после завершения программы в каждую последующую ячейку (используя режим косвенной адресации после приращения). >до тех пор, пока указатель, наконец, не переместится в начало памяти и не перезапишет MOVсам цикл. Как только это происходит, JMN(JuMp, если не ноль) обнаруживает это и проваливается.

Проблема состоит в том, что это все еще оставляет JMNсебя незаписанным. Чтобы избавиться от этого, нам нужен еще один, MOVчтобы стереть JMN... но это означает, что нам нужен еще один, MOVчтобы стереть это MOV , и так далее. Чтобы заставить всю программу исчезнуть без следа, мы должны как-то организовать одну MOVинструкцию, чтобы стереть как себя, так и хотя бы одну другую инструкцию.

Вот где SPLприходит - это один из самых странных кодов операций в Redcode. По сути, это инструкция "Разветвить оба пути". Видите ли, вместо простого регистра «счетчик программ», как у любого обычного ЦП, виртуальная машина Redcode имеет «очередь процессов»: циклический список указателей на выполняемые инструкции. Обычно в каждом цикле указатель команды смещается с начала очереди, инструкция выполняется, и следующая команда (если не было перехода или недопустимой инструкции) помещается в конец очереди. Но SPLвызывает как следующую инструкцию, так и заданную целевую инструкцию (которая, в случае SPL 1, также является следующей инструкцией), помещаются в очередь.

Результатом всего этого является то, что после выполнения двух SPL 1инструкций в очереди теперь находятся четыре процесса, все о последнем выполнении MOV. Этого достаточно, чтобы стереть как сами JMN, так SPLи самих MOVсебя, и это также оставляет ptrячейку инструкции как DAT 0, 0неотличимую от пустого ядра, окружающего ее.

(В качестве альтернативы, мы могли бы заменить ptrинструкцию на MOV 1, 1, которая была бы преобразована MOV 1, 0в более ранние инструкции, и, таким образом, стерлась бы сама, как это делала первая программа выше).

Ps. Если вы хотите протестировать эти программы, загрузите симулятор Redcode (он же MARS). Я бы порекомендовал либо CoreWin, либо почтенный pMARS , хотя есть и несколько других хороших симуляторов.


Разве это не просто бросить нарушение доступа?
Дэнни Варод

12
Нарушение доступа? Что это за странная вещь? (Серьезно, Redcode работает в довольно абстрактной виртуальной машине. Вся адресация относительна, адресное пространство является непрерывным (и циклическим), и каждый адрес допустим.)
Илмари Каронен

MOV 1, 0 копирует 1 в адрес 0 или наоборот? Я знаю, что на всех языках ассемблера адрес 0 недопустим (NULL-адрес).
Дэнни Варод

4
Синтаксис есть MOV source, dest. Но, как я уже сказал, вся адресация в Redcode является относительной, поэтому адрес 0фактически означает «адрес этой инструкции», в то время как адрес1 фактически означает «адрес этой инструкции + 1». (И абсолютный адрес 0 в любом случае не является чем-то особенным в Redcode; на самом деле, одно интересное следствие конструкции «все относительной адресации» заключается в том, что для программы Redcode фактически невозможно найти свой собственный абсолютный адрес в ядре! )
Ильмари Каронен

2
Человек, я так благодарен тебе. Я никогда не слышал о Core War.
Seequ

32

С

#include <conio.h>  /* Computer-Operated Nuclear Installation Options */
int main () {
    clrscr();       /* Commence Launch (Remote Systems Console Request) */
    kbhit();        /* Keep Busy until hit */
}

Обратите внимание, что это не переносимый код. Он работает с ZOG C на ART DS9000 . Я считаю, что использование нетрадиционных вооружений делает этот код пригодным для этой задачи. Если вы обеспокоены тем, что задержка, необходимая для того, чтобы этот фрагмент кода доставил свою полезную нагрузку, не квалифицируется как немедленная , свяжитесь с нами для получения консультации по упреждающим ударам.

effect of launch

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


2
Лучший ответ, руки вниз!
Вектор

3
+1. (0) 1; сначала я подумала, что @Gilles троллит здесь ... но потом я проверила веб-страницу ART Inc. ... и тогда я поняла, насколько сильно меня троллируют!
vaxquis


28

C #

Убивает себя, убивая каждый процесс, кроме самого себя.

foreach (Process p in Process.GetProcesses()) {
    string myexe = Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);
    if (p.ProcessName == myexe) continue;
    p.Kill();
}

Чтобы немного оживить его, мы могли бы использовать PInvoke TerminateProcessвместоProcess.Kill


4
+1 за очень нетрадиционный метод убийства любой другой вещи, таким образом вызывая падение вашей собственной программы с системой (или, по крайней мере, я предполагаю, что это идея?). У меня нет C # Runtime на этой машине, но я должен спросить ... На практике это в конечном итоге приводит к отключению системы или только все запущенные процессы? (Я думал, что программы на C # сами вызывали интерпретатор, поэтому не полагались на существование определенного процесса JIT / CIL ...). Опять же, отличная работа, думая «нестандартно» (хар хар) об этом :)
Прорыв

4
-1 (если бы у меня был представитель): в метаданных троллинга кода говорится, что деструктивные ответы недопустимы из-за риска того, что люди попробуют их на своих машинах. См. Вторую пулю в списке ограничений: codegolf.stackexchange.com/tags/code-trolling/info
Кевин - Восстановить Монику

Системные процессы не могут быть убиты без прав администратора, не так ли?
Сардж Борщ

3
Код-вызов @Kevin и троллинг кода - это разные теги с разными правилами.
Osvein

3
@ user1981338: изначально вопрос содержал тег контроля кода, но с тех пор он был отредактирован. Теперь, когда метка исчезла, +1.
Кевин - Восстановить Монику

21

BASH - 12 символов

:(){ :|:&};:

Классическая вилочная бомба. Блокирует компьютер и заставляет пользователя (или администратора) перезагрузиться.


5
Скучно - но все же мой личный фаворит. Я использую это для выключения живых систем
s3lph

3
Он начинается сам столько раз, сколько может, это не значит, что он уходит.
Маринус

1
Но он будет запускать как можно больше процессов, пока компьютер не выйдет из строя, и, следовательно,
выйдет

14
+1 для добавления смайликов, таких как :()и:|
ProgramFOX

1
@Kartik: без первого пробела вы получите синтаксическую ошибку. Вы можете устранить второй.
Деннис

20

Python (на старых ноутбуках)

На старых ноутбуках с одноядерными процессорами и плохим охлаждением:

while True:
    print("CPU Temperature rising")

Когда ноутбук взрывается (или просто выключается) через несколько часов, программа не будет работать.

(Для достижения наилучших результатов оберните ноутбук в одеяло или что-то)



18

Apple 2 Basic

1 PRINT "HELLO"
2 POKE 2053,128
3 POKE 2054,58
4 GOTO 1

Он перезаписывает одну из своих инструкций знаком END.


Как это работает?
Йоханнес

5
@Johannes: в Applesoft BASIC программа хранится в виде токенов в памяти. Поскольку нет ОС или защиты памяти, она всегда хранится в одном и том же месте, и ничто не мешает вам записывать в эту память. Таким образом, первый POKEзаписывает ENDтокен поверх PRINTтокена, а затем второй POKEзаписывает терминатор команды поверх первого ". Когда GOTOвыполняется, он заканчивается, ENDвместо того, чтобы PRINTи программа заканчивается.
Маринус

14

В сборе что-то вроде этого, вероятно, будет работать:

jmp 0

Я помню, что компилирует это на самом деле работал DOS. Тогда он перезагрузил компьютер.


попробуйте ret; На самом деле я собираюсь опубликовать это как ответ: P
Julien Lebot

retf будет работать, я уже положил это в ответ :) Это убивает его из-за того, как сегментация памяти работает (или не работает, я бы сказал) в современных операционных системах
chbaker0

»Jmp 0« работает с DOS, потому что первые два байта сегмента кода были CD 20 или «INT 20», который является кодом для программы выхода. »Нажать 0; ret «должен иметь тот же эффект.
Даниэль

13

PHP

function quit(){unlink(__FILE__);posix_kill(getmypid(),15);}

Эффекты:
удаляет ваш дрянной файл скрипта и затем убивает вашу программу.
Бросьте одного из этих плохих парней в кодовую базу, чтобы сбить с толку людей.


Это недопустимый синтаксис PHP. Вы пытаетесь определить функцию, quitно список параметров - это код для запуска. Я получаю ошибку разбора при попытке запустить его.
Эмиль Викстрем

@ EmilVikström - Исправлено сейчас.
donutdan4114

12

С, 9 символов

Компилируется с gccдругими компиляторами, которые не обращают внимания на мелкие детали, например, mainне являются функцией.
Работает на x86платформах - программа сразу выходит.

main=195;

195 - это код операции retинструкции.


4
Segfaults для меня. mainнаходится в, .dataпотому что это int, а не в .text, и .dataзагружается в неисполняемую страницу.
Мниип

10

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

int
main(int argc, char **argv)
{
        revoke(*argv);
}

Это работает на любой системе после 4.3BSD и других, которые реализуют revokeтаким же образом. В Linux даже нет прототипа для него, MacOS делал в прошлом, но возвращает только ошибки в последних версиях.

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

Вариант этого, который должен работать на большинстве unix-подобных систем:

#include <sys/mman.h>
#include <inttypes.h>
#include <unistd.h>

int
main(int argc, char **argv)
{
        intptr_t ps = getpagesize();
        munmap((void *)(((intptr_t)main)&~(ps - 1)), ps);
}

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

И конечно, вариация на одну и ту же тему:

#include <sys/mman.h>
#include <inttypes.h>
#include <unistd.h>

int
main(int argc, char **argv)
{
        intptr_t ps = getpagesize();
        munmap((void *)(((intptr_t)&ps)&~(ps - 1)), ps);
}

Просто отмените отображение стека, чтобы нам некуда было возвращаться. То же самое, что и при отображении main- нам может понадобиться удалить две страницы, за исключением того, что мы должны помнить, что стек, вероятно, уменьшается (если вы не используете PA-RISC или какую-то другую странную архитектуру, подобную этой).

Еще один способ вытащить коврик из-под ног:

#include <sys/resource.h>

int
main(int argc, char **argv)
{
        setrlimit(RLIMIT_CPU, &((struct rlimit){ 0 }));
        while(1);
}

Это зависит от операционной системы в зависимости от того, как система обрабатывает лимит процессора в 0 секунд и как часто выполняется учет времени процессора. MacOS немедленно убивает процесс, Linux требует цикла while, другая система, которую я пробовал, ничего не делала даже с ограничением в одну секунду и циклом while, я не отлаживал дальше.


9

ш

sudo kill -SEGV 1

Мгновенная кернальная паника в Linux. Уничтожает все процессы, включая себя

Cmd

pskill csrss.exe

Мгновенный синий экран на Windows. Завершает Client/Server Runtime SubSystem. Пскилл должен быть установлен.


Будет ли killall initработать?
s3lph

1
@the_Seppi 1. Только пользователь корневого уровня может отправлять сигналы в init 2. Init будет вызывать панику ядра, только если он получит сигнал 11 (ошибка сегментации)
MultiplyByZer0

Хорошо, спасибо ... Знаете ли вы, что произойдет, если вы используетеsudo killall init
s3lph

1
@the_Seppi Да, я пробовал раньше. Init игнорирует его, потому что init может решить, получит ли он сигнал или нет, поэтому он полностью игнорирует SIGKILL. unix.stackexchange.com/questions/7441/…
MultiplyByZer0

8

В C (Совместимо с Windows / Linux / (возможно, также с Unix / Freed BSD)):

main;

Пример использования:

Под Windows скомпилируйте с:

echo main; > main.c && cl /Fe:main.exe main.c

И Linux:

echo "main;" > main.c && gcc -w -o main main.c

Предполагая, что компилятор установлен и в переменной PATH currenth.

РЕДАКТИРОВАТЬ: Технически это вызывает исключение (вызванное процессором) в Linux, но в Windows такого сообщения нет. Так что эта запись, вероятно, недействительна; Однако я думаю, что это круто: P

РЕДАКТИРОВАТЬ: В ассемблере x86 (используя NAsm / YAsm)

global s
s:
    ret

Компилировать с:

(Windows)

nasm -f win32 -o test.obj test.asm
LINK /OUT:test.exe /SUBSYSTEM:CONSOLE /ENTRY:s test.obj

(Linux)

nasm -f elf32 -o test.obj test.asm
ld -o test -e s test.obj

К сожалению, этот способ также создает дамп ядра в Linux, поэтому я считаю, что он функционально эквивалентен методу C; кроме более эффективного.


1
Вот Это Да! Я только что скомпилировал это, -Wall -Wextra -std=c99 -pedanticи никаких предупреждений нет вообще.
ldrumm

Я на самом деле хотел поставить это, но отказался, потому что это будет дубликат моего решения другой проблемы ( codegolf.stackexchange.com/a/8778/3103 ).
Конрад Боровски

7

Говоря глупо с Хаскеллом:

import System.Exit

absolutely doThis = if True then doThis else undefined

unconventional doThat = do
  putStrLn "I could just do that"
  putStrLn "But I'm gonna print factorial of 100 first"
  putStrLn "There you go:"
  print $ fac 100
  doThat
  where fac n = foldl (*) 1 [1..n]

main = absolutely unconventional exitFailure

6

питон


Используя в multiprocessingмодуль , мы можем породить другой поток , чья работа состоит в том, чтобы общаться с оригинальным процессом через очередь, говоря, когда бросить:

import multiprocessing
import time
queue = multiprocessing.Queue()

def second_thread():
    while True:
        queue.put('quit')
        time.sleep(0.1)

second_ps = multiprocessing.Process(target = second_thread)
second_ps.start()

while True:
    msg = queue.get()
    if msg == 'quit':
        break
    time.sleep(0.1)

second_ps.join()

6

ANSI C

Без оптимизации кода следующая программа завершает работу так быстро - ее невозможно запустить, даже если она компилируется в допустимую программу

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

char tooLong[0x7CFFFFFF];

void main()
{
    printf("never executed.");
}

это может зависеть от системы - прокомментируйте, если можете ее запустить.


«Выход с помощью исключения больше не будет принят!» и это включает ошибки
нехватки

2
@JanDvorak Существуют различия между ошибками и исключениями .
syb0rg

Однако я считаю, что это правило охватывает и то и другое. Может ли уточняющий вопрос уточнить? И нет, я не думаю, что специфический для Java вопрос является хорошей справкой, особенно когда вы защищаете решение на языке Си.
Джон Дворжак

9
Программа не выдает ошибку и не вызывает ошибку в программе. Система не может справиться с этим.
Йоханнес

6

Хорошо. Если простой вызов System.exitв Java не разрешен, как насчет вызова через отражение от другого потока?

import java.lang.reflect.*;

public class Quit {
    public static void main(String[] args) throws Exception {
        final Method exit = System.class.getMethod("exit", new Class<?>[]{ int.class });
        new Thread(new Runnable() {
            @Override public void run() {
                try {
                    System.out.println("calling... " + exit);
                    exit.invoke(null, new Object[] { 0 });
                } catch (Exception e) { e.printStackTrace(); }
            }
        }).start();
        for (int i = 1; ; ++i) {
            System.out.println("counting... " + i);
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) { break; }
        }
    }
}

Ищет метод выхода, порождает новый поток и ведет обратный отсчет до тех пор, пока этот поток не убьет процесс, вызвав выход через отражение.


Отсчитывает? Похоже, это рассчитывает на меня.
Джастин

1
Er, yes, good point. I should have said counts up, or just said that it counts until it exits.
David Conrad

6

x86 machine language, 1 character

You can usually make a workable executable out of one RET instruction

\xC3 

4
How is that unconventional?!
aditsu

6

C (Linux)

Suicide version

Sends a SIGKILL to itself.

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

int main() 
{
    kill(getpid(),SIGKILL);

    printf("Not killed");
}

"Tu quoque mi fili" version

Forks, then the son kills the father.

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

int main() 
{
    if (!fork())
        kill(getppid(), SIGKILL);

    printf("Not killed");
}

5

Perl

...

That is all.


Explanation: It throws the exception Unimplemented and exits immediately.


Added explanation.
PhiNotPi

3
I don't know, exceptions are boring.

6
Invalif due to challenge adaption: no exceptions
s3lph

I just haven't gotten around to writing another answer yet.
PhiNotPi

5

Batch & Debug

An oldie but goodie, works on DOS machines for an instant system reboot. Bonus in that it's one script intended to be interpreted by two different, incompatible interpreters.

reset.bat

goto start

rcs
ffff
rip
0000
g
:start
debug < reset.bat

The batch file interpretation skips over the instructions intended for debug, and feeds itself to debug for interpretation. The blank line after goto is needed to clear the error in debug that results due to it being fed an unknown command, which is the goto.


1
I used to do the same thing as dec ax; push ax; push bx; retf
moopet

3

Java

The below code is not tested and will only work on some platforms.

public class Quitter
{
       public static void main ( String [ ] args )
       {
             Process process = Runtime . getRuntime ( ) . exec ( "reboot" ) ;
       }
}

45
What is with that horrendous whitespace
Doorknob

7
On UNIX it would have to be sudo reboot, on Windows shutdown /r /t 0
s3lph

2
On UNIX you just have to execute that program with sudo, not the command that you want to execute.
Johannes Kuhn

1
@the_Seppi,@JohannesKuhn like I said it only works on some platforms and I was assuming you were going to invoke it like sudo java Quitter.
emory

3
-1 NOT ENOUGH WHITESPACE!!!
vaxquis

3

Powershell

get-process | stop-process -force

Save this as 'lastresort.ps1' and it should do the trick.

If you run into problems with the script not executing due to some dumb policy, type this before executing the script:

Set-ExecutionPolicy Unrestricted

Works just fine from the command line without saving as a script also.
Iszi

3

TI-Basic 84

:;;::;banana\\sEnd\;:;1:If X=X-1 :eat banana juice and lol;;;::::;:thought you could EAT THINGS XD /// CRAZIEST ANSWER YET!!!

3

Python (a one line alternative to the OP)

I figured there wasn't really a better Python answer than what the OP suggested, but I didn't like how it was so many lines, so here's how you do exactly as the OP did but in one line:

exec(''.join([ chr(x) for x in [35, 33, 47, 117, 115, 114, 47, 98, 105, 110, 47, 101, 110, 118, 32, 112, 121, 116, 104, 111, 110, 10, 35, 32, 117, 110, 105, 120, 32, 111, 110, 108, 121, 44, 32, 109, 105, 103, 104, 116, 32, 119, 111, 114, 107, 32, 111, 110, 32, 119, 105, 110, 100, 111, 119, 115, 10, 35, 32, 110, 111, 116, 101, 58, 32, 107, 105, 108, 108, 115, 32, 65, 76, 76, 32, 82, 85, 78, 78, 73, 78, 71, 32, 112, 121, 116, 104, 111, 110, 32, 112, 114, 111, 99, 101, 115, 115, 101, 115, 46, 32, 66, 101, 32, 99, 97, 114, 101, 102, 117, 108, 32, 47, 33, 92, 10, 100, 101, 102, 32, 101, 120, 105, 116, 40, 41, 58, 10, 32, 32, 32, 32, 105, 109, 112, 111, 114, 116, 32, 111, 115, 10, 32, 32, 32, 32, 111, 115, 46, 115, 121, 115, 116, 101, 109, 40, 34, 107, 105, 108, 108, 97, 108, 108, 32, 112, 121, 116, 104, 111, 110, 51, 34, 41, 10, 32, 32, 32, 32, 35, 32, 87, 105, 110, 100, 111, 119, 115, 32, 97, 100, 100, 111, 110, 10, 32, 32, 32, 32, 111, 115, 46, 115, 121, 115, 116, 101, 109, 40, 34, 116, 97, 115, 107, 107, 105, 108, 108, 32, 47, 105, 109, 32, 112, 121, 116, 104, 111, 110, 46, 101, 120, 101, 32, 47, 102, 34, 41, 32, 35, 32, 111, 114, 32, 119, 104, 97, 116, 101, 118, 101, 114, 32, 102, 105, 108, 101, 110, 97, 109, 101, 32, 112, 121, 116, 104, 111, 110, 64, 119, 105, 110, 100, 111, 119, 115, 32, 104, 97, 115, 10, 101, 120, 105, 116, 40, 41, 10] ]))

You can make this a function and it will do the job for you.


3

My own idea, not participating

TIGCC (for Texas Instrumens TI-89, TI-89 Titanium, TI-92+, TI-V200)

void main(void) {
    unlink("quit");
    asm("trap #2");
}

TI-Basic for the same calculators

quit()
:© lines starting with © are comments
:Prgm
:©DelVar quit
:Exec "4E424E750000"
:EndPrgm

What the program does: First it deletes itself out of the RAM. (Don't put it to the ROM or it won't work...) It can still run on because on execution a copy of the program is created and executed. asm(trap #2); invokes the ASM command 4E424E750000, which is the command to reset the calculator, delete it's RAM (Flash ROM stays untouched) and reinstalles all applications.

EDIT: Just tested the Basic version. It can't delete itself...


3

MS-DOS .com format

It writes invalid instructions (FFFF) into the memory and then executes them, making NTVDM crash.

Hexadecimal

B8 FF FF A3 06 01

Debug.exe assembly language

MOV AX, FFFF
MOV [0106],AX
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.