Apa? Tidak ada kesalahan [Tutup]

197

Tugas Anda sederhana. Tulis program yang seharusnya menghasilkan kesalahan pada pandangan pertama baik ketika dikompilasi atau dijalankan, tetapi entah tidak atau menghasilkan beberapa kesalahan yang tidak terkait lainnya. Ini adalah kontes popularitas, jadi jadilah kreatif.

Jwosty
sumber
11
hmmmm .... yang ini adalah asah otak. +1
Tim Seguine
1
Seandainya saya bisa menemukannya ... ada contoh PL / I lama yang menyertakan pernyataan di sepanjang baris "jika jika = kemudian maka maka = lain lain = jika kemudian lain ..." (PL / Saya diizinkan menggunakan kata kuncinya sebagai nama variabel, dan memiliki ekspresi kondisional yang mirip dengan C
?:
8
Saya menyarankan seluruh bahasa brainfuck, karena kode BF sepertinya tidak akan dikompilasi.
Agi Hammerthief
@NigelNquande hanya jika Anda tidak terbiasa dengan itu ...;)
Jwosty

Jawaban:

281

C ++

Pastikan Anda mengkompilasi kode berikut dalam mode pemenuhan standar (misalnya, untuk g ++ gunakan flag -ansi):

int main()
{
  // why doesn't the following line give a type mismatch error??/
  return "success!";
}

Bagaimana itu bekerja:

The ?? / adalah urutan trigraph yang diterjemahkan menjadi garis miring terbalik yang lolos dari baris baru berikut, sehingga baris berikutnya masih merupakan bagian dari komentar dan karenanya tidak akan menghasilkan kesalahan sintaksis. Perhatikan bahwa dalam C ++, menghilangkan return in maindidefinisikan dengan baik dan setara dengan return 0, yang menunjukkan proses yang berhasil.

celtschk
sumber
7
Saya merasa seperti jawaban pertama yang langsung memenangkan ini.
temporary_user_name
1
Ini juga berlaku di C99.
R ..
1
ada peringatan dengan -Wall
BЈовић
2
@ BЈовић Wall selalu memberi peringatan tentang semuanya
Kiwy
4
@ Kwiwy Melempar peringatan hanya untuk kode sampah seperti di atas. -Wall tidak memberikan peringatan untuk semuanya.
BЈовић
86

Rubi

Selalu penggemar yang satu ini.

x = x

Tidak ada NameError. x sekarang nil.

Ini hanya "fitur" dari Ruby :-)

Inilah yang lebih biasa yang pernah saya dapatkan sebelumnya:

x = 42

if x < 0
  raise Exception, "no negatives please"
elseif x == 42
  raise Exception, "ah! the meaning of life"
else  
  p 'nothing to see here...'
end 

Mencetak "tidak ada yang bisa dilihat di sini."

Ini elsif , bukan elseif . (dan itu pasti tidak elif - celakalah programmer python bandel (saya)!) Jadi untuk interpreter elseif tampak seperti metode panggilan biasa, dan karena kita tidak memasuki x <0 blok, kita langsung ke yang lain dan jangan mengajukan pengecualian. Bug ini sangat jelas dalam lingkungan penyorotan sintaksis apa pun, untungnya (?) Golf kode bukan lingkungan seperti itu.

roippi
sumber
5
Saya ketahuan. Saya telah melakukan Python dan Lua sebelumnya, dan sekarang mulai di Ruby. Lua menggunakan yang itu.
Bersepeda
7
Arti semesta tidak ada artinya?
user80551
77

C?

Kode yang cukup normal di sini ...

void main() = main--;

Ini Haskell, bukan C. Ini mendefinisikan fungsi bernama "void" yang mengambil dua argumen. Yang pertama bernama "main" dan jika yang kedua (tanpa nama) adalah tuple kosong, ia mengembalikan variabel "utama". "-" memulai komentar di Haskell, jadi ";" dikomentari.

intx13
sumber
21
Jadi dengan kata lain, itu curang?
Tuan Lister
75
Menyontek adalah hal biasa dalam kompetisi kode-tantangan. Kami menyebutnya kreativitas. : P
Joe Z.
31
Saya akan menyebut ini curang, bukan kreativitas. Anda harus mendefinisikan lingkungan tempat Anda menjalankan sebelum Anda bahkan dapat mempertimbangkan apakah beberapa kode akan kesalahan atau tidak. Kalau tidak, saya hanya bisa memberi Anda garis kebisingan yang Malbolge dan bertanya apakah itu mengkompilasi.
Tim S.
5
Seharusnya hanya membuat Anda berhenti sejenak dan berkata, "Hei, bisakah Anda melakukannya ?" :)
intx13
10
@ Joz. Ini mungkin terlihat seperti perl dalam beberapa kasus.
user80551
72

JavaScript

var а = 100;
if (typeof a !== 'undefined') throw 'This should always throw, right?';
console.log('How am I still alive?');

Begini cara kerjanya:

Yang pertama asebenarnya adalah а(yaitu, Cryllic Unicode "a").

Gagang pintu
sumber
8
Trik ini dapat diterapkan ke bahasa apa pun yang menerima token Unicode (mis. Java, C #).
n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳
83
@ n̴̖̋h̷͉̃a̷̭̿h̸̡̅ẗ̵̨́d̷̰̀ĥ̷̳, dicontohkan oleh nama pengguna Anda
TheDoctor
9
solusi terlalu jelas
thepirat000
6
terlalu jelas bagi siapa pun yang pernah melihatnya sebelumnya. Saya yakin banyak pemula dan yang disebut "pakar web" mungkin tersandung.
Thebluefish
42
Jelas? Jadi, Anda selalu melihat nama variabel Anda melalui nomor Unicode mereka alih-alih seperti apa bentuknya? Anda mungkin memperhatikannya jika Anda mencari "a" (atau "a"?) Dan gagal menemukan apa yang Anda harapkan, tetapi ketika hanya membaca, Anda tidak dapat melihatnya (setidaknya dalam font yang ditampilkan di sini).
Tim S.
70

JavaScript

Ketika saya memberikan kode berikut, saya berkali-kali diberi tahu, "Pasti salah ketik! Bagaimana bisa berfungsi?" .

console.log( 42..toString(2) );

Deskripsi di bawah ini disalin tepat dari salah satu kasus terakhir .

Seperti yang mungkin Anda ketahui, dalam JavaScript segala sesuatu kecuali literal adalah objek. Angka juga benda. Jadi secara teoritis (dan praktis) Anda bisa mendapatkan properti atau memanggil metode non-literal melalui notasi titik, seperti yang Anda lakukan 'string'.lengthatau [1,2,3].pop(). Dalam hal angka Anda dapat melakukan hal yang sama tetapi Anda harus ingat bahwa setelah satu titik parser akan mencari bagian fraksional dari angka yang mengharapkan nilai float (seperti dalam 123.45). Jika Anda menggunakan integer Anda harus "kirim" parser bahwa sebagian pecahan kosong, menetapkan dot ekstra sebelum menangani properti: 123..method().

Penglihatan
sumber
18
Sebagai seorang pria lua, saya mengharapkan422
mniip
3
Belum pernah melihat penggunaan ini sebelumnya, sangat rapi.
Nit
5
Merasa tidak enak karena terbiasa dengan ..notasi, tetapi sama sekali tidak mengerti tentang .toString(a freaking argument here?)notasi: P Oh well, cari tahu sekarang :)
David Mulder
Apa hasil ini? Dan mengapa ? Saya penasaran.
Nicolas Barbulesco
3
Untuk malas, argumen menentukan basis (jadi ini akan mencetak 42 dalam biner), dan sama sekali tidak penting untuk kode ini. ..adalah bagian yang membingungkan.
Kat
63

pesta

#!/bin/bash

[ 1 < 2 ] && exit

for i in `seq 1 $[2 ** 64]`
    do "$0" | "$0"
done

while [[ false ]]
    do :
done

if maybe
    do [: [: [: [: [; [; [; [; ;] ;] ;] ;] :] :] :] :]
fi

Hasil

  • Anda mungkin mengharapkan skrip untuk tidak menghasilkan kesalahan sama sekali, karena keluar setelah perintah pertama. Tidak.

  • Anda mungkin mengharapkan pesan kesalahan khas yang disebabkan oleh bom fork yang sedang berlangsung karena forloop. Tidak ada bom fork.

  • Anda mungkin berharap bash mengeluh tentang maybeperintah yang hilang atau sejumlah kesalahan sintaksis di dalam ifblok. Tidak akan.

  • Satu-satunya pesan kesalahan script mungkin menghasilkan ujung di 2: No such file or directory.

Penjelasan

  • [tidak istimewa untuk bash, jadi < 2lakukan, seperti biasa, pengalihan. Kecuali ada file dengan nama 2di direktori saat ini, ini akan menyebabkan kesalahan.

  • Karena kesalahan di atas, perintah sebelumnya &&akan memiliki status keluar yang tidak nol dan exittidak akan dieksekusi.

  • The forLoop tidak tak terbatas. Faktanya, tidak ada loop sama sekali. Karena bash tidak dapat menghitung kekuatan ke-64 dari 2, hasil ekspresi aritmatika adalah 0.

  • [[ false ]]menguji apakah falsestring null. Tidak, jadi whileloop ini tidak terbatas.

  • Karena hal di atas, ifpernyataan itu tidak pernah dieksekusi, jadi tidak ada kesalahan yang terdeteksi.

Dennis
sumber
55

Perl

use strict;
use warnings;
Syntax error!
exit 0;

Sumber dan penjelasan: https://stackoverflow.com/questions/11695110

massa
sumber
137
Program Perl umumnya terlihat seperti kesalahan.
ugoren
1
@ugoren Hanya ketika ditulis dan dibaca oleh mereka yang memiliki sedikit pengetahuan tentang Perl.
TLP
8
Anda pasti suka bahwa komentar @ ugoren memiliki dua kali lipat upvotes sebagai jawabannya :)
yo
2
Mengingatkan saya pada trik shell Windows, "Jika Anda senang dan Anda tahu itu, Sintaks Kesalahan!"
Jwosty
47

Jawa

class Gotcha {
    public static void main(String... args) {
        try  {
            main();
        } finally {
            main();
        }
    }
}

Tidak ada tumpukan yang meluap di sini; berjalan terus.

Pada pandangan pertama, ini seharusnya menghasilkan StackOverflowError, tetapi tidak! Ini sebenarnya hanya berjalan selamanya (untuk semua tujuan praktis setidaknya; secara teknis itu akan berakhir setelah beberapa kali lipat lebih lama dari usia alam semesta). Jika Anda ingin tahu bagaimana / mengapa ini bekerja, lihat ini . Juga, jika Anda bertanya-tanya mengapa kita dapat memanggil main()tanpa argumen ketika metode utama umumnya akan memerlukan String[]argumen: itu karena kami telah menyatakannya sebagai variabel-argumen di sini, yang sangat valid.

arshajii
sumber
3
Seperti dijelaskan oleh pertanyaan yang Anda tautkan, pertanyaan itu tidak berjalan tanpa batas waktu, tetapi untuk waktu yang sangat lama.
Kevin
1
@Kevin. Mari kita tidak menjadi terlalu berlebihan di sini; "lebih lama dari umur alam semesta" adalah, untuk semua tujuan praktis, "selamanya".
arshajii
8
Anda mengatakan "Tidak ada stack overflow di sini", ketika pada kenyataannya, sistem terus melempar stack overflow terus-menerus, dan pada akhirnya akan melempar pengecualian stack overflow. (Seperti yang Anda sebutkan, akhirnya bisa menjadi waktu yang sangat lama) Dan, itu tergantung pada kedalaman tumpukan. Pada VM yang lebih kecil, atau sistem embedded, kedalaman tumpukan bisa jauh lebih kecil.
McKay
@ McKay Pernyataan itu jelas-jelas hanya garis pembuangan, tidak dimaksudkan untuk dipahami secara harfiah. OP meminta program yang sepertinya menghasilkan kesalahan, tetapi tidak. Dalam kasus umum, jawaban di atas memenuhi persyaratan ini. Tentu, kita dapat menyusun situasi yang tidak jelas di mana tidak, tetapi itu tidak membatalkan jawaban. Saya harap Anda akan mempertimbangkan kembali downvote Anda.
arshajii
3
@McKay By the way, menganggap bahwa ukuran stack adalah kecil (misalnya 100 sebagai lawan normal ~ 10.000), dan kami dapat masih membuat 10.000.000 panggilan per detik. Kemudian total waktu berjalan keluar menjadi 4.019.693.684.133.147 tahun - masih banyak pesanan besarnya lebih besar dari usia alam semesta.
arshajii
42

CoffeeScript

What? No error? Yep, this code does not have any bugs, why would it?

?diikuti oleh spasi adalah operator yang memanggil suatu fungsi, tetapi hanya jika ada. JavaScript tidak memiliki fungsi yang dipanggil What, oleh karena itu fungsi tersebut tidak dipanggil, dan argumennya diabaikan begitu saja. Kata-kata lain dalam kode adalah panggilan fungsi yang sebenarnya tidak dipanggil, karena Whatfungsi tidak ada. Pada akhirnya, ?adalah operator keberadaan, karena tidak digunakan dalam fungsi panggilan. Akhir kalimat lainnya, seperti .atau !tidak akan berfungsi, seperti .untuk metode, dan !bukan operator (yang tidak dapat digunakan setelah pengidentifikasi). Untuk membaca bagaimana CoffeeScript mengonversikan ini menjadi JavaScript, kunjungi http://coffeescript.org/#try:What%3F%20No%20error%3F%20Yep%2C%20iniis2020%%20does%20not%20have%20any%20bugs%2C % 20mengapa% 20itu% 20 akan% 3F .

Konrad Borowski
sumber
36

VBScript

The &operator dalam VBScript adalah penggabungan string tetapi apa yang di bumi adalah &&dan &&&operator? (Ingat bahwa operator "dan" dalam VBScript adalah And, bukan &&.)

x = 10&987&&654&&&321

Fragmen program itu adalah VBScript legal. Mengapa? Dan apa nilainya x?

Lexer memecah ini menjadi x = 10 & 987 & &654& & &321. Literal integer yang dimulai dengan &, anehnya, adalah oktal. Huruf oktal yang berakhir dengan &, bahkan lebih aneh lagi, adalah bilangan bulat panjang. Jadi nilai x adalah gabungan dari nilai-nilai desimal dari empat bilangan bulat: 10987428209.

Eric Lippert
sumber
8
Itu hanya ... wow.
Primo
27

Objektif-C

Bukan masalah besar, tetapi itu mengejutkan saya ketika mencoba untuk menempatkan tautan di dalam komentar:

http://www.google.com
        return 42;

http adalah label kode di sini, label tersebut digunakan dalam instruksi goto

Piotr
sumber
8
Ini harus bekerja dalam bahasa seperti-C yang mendukung //komentar.
Ilmari Karonen
Ya, mungkin, saya hanya tidak yakin saat memposting
Piotr
14
Batasi satu URL per protokol per cakupan.
Ben Voigt
1
Anda masih dapat menggunakan https: // dalam cakupan yang sama.
Florian F
25

C #

class Foo
{
    static void Main(string[] args)
    {
        Bar();
    }

    static IEnumerable<object> Bar()
    {
        throw new Exception("I am invincible!");
        yield break;
    }
}

Karena Barmetode ini melakukan a yield, metode tersebut tidak benar-benar berjalan ketika dipanggil, ia mengembalikan enumerator yang, ketika diulangi, s menjalankan metode tersebut.

McKay
sumber
Akhirnya ... Ini FOO dan BAR :)
VVK
1
Untuk itulah foo and bar;) nama-nama hal yang sebenarnya tidak penting.
McKay
22

C

main=195;

Bekerja pada platform x86, di mana 195 adalah opcode untuk ret. Tidak melakukan apa-apa,

ugoren
sumber
Opcode untuk ret adalah 195, bukan 193, kan?
Dennis
Tidak bekerja untuk saya. Saya berharap ini akan mengeksekusi kode di alamat 195.
nwellnhof
Tbanks @ Dennis, kode itu benar, penjelasannya salah.
ugoren
3
Pada platform apa pun (termasuk x86 modern ) di mana halaman dapat dibaca tanpa juga dapat dieksekusi, ini akan macet saat masuk mainkarena maintelah ditempatkan di segmen data, yang tidak dapat dieksekusi. Menariknya, tidakconst int main=195 akan crash (pada x86) (tetapi akan menghasilkan status keluar sampah) karena secara default diletakkan di segmen yang sama dengan dan karena itu dapat dieksekusi. ( akan keluar dengan sukses! (masih di x86)).rodata.textconst char main[]="1\300\303";
zwol
2
Saya menggunakan mesin 64bit (saya tidak tahu apakah ini akan mengubah apa pun) dan main = 195 memberikan segfault, tetapi const int main = 195; bekerja.
w4etwetewtwet
21

Jawa

Mungkin terlalu jelas.

public static void main(String[] varargs) throws Exception{
    char a, b = (char)Integer.parseInt("000d",16);
    // Chars have \u000d as value, so they're equal
    if(a == b){
        throw new Exception("This should be thrown");
    }
}

Apa?

Melempar kesalahan sintaks setelah \u000d. \u000dadalah unicode untuk baris baru. Meskipun dikomentari, kompiler Java memperlakukan apa yang setelah ini sebagai kode karena tidak dikomentari lagi.

Tom Verelst
sumber
11
Anda varargsbukan varargs;)
Navin
Pertanyaannya adalah "kode yang kelihatannya gagal tetapi tidak", bukan "kode yang kelihatannya gagal, tetapi melakukannya dengan cara yang berbeda". Memiliki kesalahan sintaks dan bukan pengecualian masih merupakan kesalahan.
Nzall
19
Saya pikir Anda harus membaca pertanyaan asli lagi: "atau menghasilkan beberapa kesalahan yang tidak terkait lainnya."
Tom Verelst
Sebenarnya, tanpa \u000d, itu akan menggunakan referensi ke nilai yang tidak ditentukan a.
LegionMammal978
19

C ++

#include <iostream>

int succ(int x)
{
  return x + 1;
}

int succ(double x)
{
  return int(x + 1.0);
}

int succ(int *p)
{
  return *p + 1;
}

int main()
{
  std::cout << succ(NULL) << '\n';
}

Mengapa?

NULLadalah konstanta intergal, sehingga cocok dengan intoverload yang lebih baik daripada yang konstan int*. Namun, sebagian besar programmer telah NULLberasosiasi dengan pointer, jadi dereference pointer nol dapat diharapkan.

Angew
sumber
11
Untungnya, C ++ 11 memungkinkan implementasi untuk didefinisikan NULLsebagai nullptr, dan implementasi yang melakukannya (belum ada yang saya ketahui, tapi saya mengharapkannya) akan memberikan kesalahan segmentasi yang diharapkan.
hvd
16

Python

print """""quintuple-quoted strings!"""""

Sangat valid, tetapi hasilnya sulit ditebak. 3 "karakter pertama memulai string multiline dan dua berikutnya adalah bagian dari string. Pada akhirnya, tiga" pertama mengakhiri string dan dua terakhir adalah string string kosong yang akan digabungkan oleh parser ke string multiline .

Fraxtil
sumber
20
Hanya bonus: print """""""""Python strings don't have to start with the same number of quotes they end with.""""".
Konrad Borowski
15

JavaScript

if (1/0 === -1/0) {
  throw "Surely there's an error in here somewhere...";
}

Bagaimana itu bekerja:

Ada infinity positif dan negatif di JS, dan tidak ada kesalahan untuk membagi dengan nol.

temporary_user_name
sumber
2
Anda harus dapat melakukan beberapa trik dengan NaN juga ...
intx13
8
meh, ini terjadi dalam bahasa apa pun dengan pelampung.
Navin
3
@Navin: dalam bahasa apa pun dengan mengapung di mana pembagian dengan nol tidak menyebabkan kesalahan.
nwk
2
@ nwk Standar IEEE untuk floats mengatakan pembagian dengan nol harus inf. Saya tidak tahu bahasa apa pun yang mengubah ini.
Navin
1
IEEE 754 menetapkan dua model: pensinyalan NaN / Inf (yang menaikkan pengecualian pada pembagian FP nol, akar kuadrat dari -1, underflow / overflow, dll), dan non-pensinyalan (yang memperlakukan NaN/ Infseperti nilai-nilai argumen biasa dengan matematika yang terdefinisi dengan baik pada mereka). Perangkat keras FP modern dapat dikonfigurasi untuk mengoperasikan dua arah. Bahasa-agnostik; Sayang tidak tahu.
ulidtko
14

C ++

Mencampur trigraph dan lambda tanpa spasi bisa sangat membingungkan dan jelas keliru bagi orang-orang yang tidak menyadari trigraph:

int main()
{
    return??-??(??)()??<return"??/x00FF";??>()??(0??);
}

Bagaimana itu bekerja:

Beberapa urutan yang terdiri dari 3 simbol, dimulai dengan ??, disebut trigraphs dan akan diganti oleh preprocessor yang sepenuhnya sesuai. Diproses sebelumnya, baris yang dimaksud terlihat sebagai berikut: return ~ [] () {return "\ x00FF"; } () [0]; Seperti yang dapat kita lihat, ini hanyalah fungsi lambda berlebihan yang mengembalikan string yang terdiri dari karakter 0xFFth. The [0] hanya mengekstrak karakter itu dan ~ TIDAK, jadi 0 dikembalikan.

aVoX
sumber
12
Program C ++ yang valid int main(){(([](){})());}mungkin juga terlihat bagus ketika digrgraphed ...
Angew
1
Apa yang bahkan dia lakukan?
Joe Z.
1
@ Jo Z [](){}adalah fungsi lambda, sama seperti [](int a){return a+1;}satu. ([](){})()memanggil fungsi itu, kembali voidjika saya tidak salah. Keseluruhan (([](){})());kemudian bermuara pada (void);, yang merupakan pernyataan tidak melakukan apa-apa. mainlalu hanya mengembalikan nol, seperti seharusnya tanpa returnpernyataan.
tomsmeding
13

VBA / VB6

Private Sub DivByZero()

    Dim x() As String
    x = Split(vbNullString, ",")

    Debug.Print 1 / UBound(x)

End Sub

Memisahkan string yang dibatasi koma kosong akan memberikan array kosong. Harus menjadi pembagian yang jelas dengan kesalahan nol, kan?

Nggak. Anehnya, ketika string panjang nol dipecah, runtime memberi Anda sebuah array dengan batas bawah 0 dan batas atas -1. Kode di atas akan menampilkan -1.

Komintern
sumber
@minitech Sebenarnya, jika Anda mengirimkan array kosong ke UBound, itu akan memberi Anda Subscript di luar rentang kesalahan.
Comintern
... yah. Saya ambil itu kembali. VBA = /
Ry-
1
@minitech Yap. Saya mengerti ini adalah bug dalam implementasi asli Split di VB6. Dalam. NET mereka sengaja "menambahkan" (atau mungkin didokumentasikan adalah kata yang lebih baik) perilaku untuk array kosong mengembalikan UBound -1 untuk menjaga kompatibilitas mundur dengan semua kode VB6 yang mengambil keuntungan dari peretasan ini. Memisahkan string nol adalah satu - satunya cara untuk secara asli mendapatkan array ini di VBA / VB6 tanpa panggilan Windows API.
Comintern
12

Javascript

5..toString();
5 .toString();

Memberi: 5

Sedangkan:

5.toString();

Memberi SyntaxError

Bagaimana itu bekerja:

JavaScript mencoba untuk menguraikan titik pada angka sebagai literal titik apung

Sumeet Kashyap
sumber
13
Bagaimana bisa Anda memposting kasus yang persis sama dengan yang saya lakukan satu jam setelah saya?
VisioN
1
Hai Visi, maaf tapi saya tidak memeriksa jawaban Anda. Saya juga menambahkan case dengan ruang. Saya membaca ini sekali di taman javascript tidak lain.
Sumeet Kashyap
1
Sumeet, jangan minta maaf. Jawaban Anda lebih baik - dan lebih jelas - daripada jawaban oleh @VisioN.
Nicolas Barbulesco
12

HTML

Posting pertama di sini, saya tidak yakin saya mendapatkan ini atau tidak, tapi begini.

<html>
    <head></head>
    <body>
        <?php $_POST['non-existant'] = $idontexisteither ?>
    </body>
</html>

Itu sebuah .htmlfile ...

Albzi
sumber
9
Jadi triknya adalah hanya itu tidak akan mengeksekusi blok PHP karena file memiliki .htmlekstensi dan server web Anda tidak dikonfigurasi untuk mengurai .htmlfile sebagai PHP?
VisioN
5
Iya. Apakah ini curang? @VisioN
Albzi
2
Saya cukup yakin ini curang. Setidaknya tulis "HTML" dengan huruf tebal di bagian atas.
Navin
Bagus! :-) Kiatnya berhasil pada saya.
Nicolas Barbulesco
1
Saya diedit untuk memperjelas bahasa apa ini ditulis
vijrox
9

PHP (40 byte)

<?for(;;$e.=$e++)foreach($e::$e()as&$e);

Inilah jawaban yang saya berikan dalam pertanyaan ini: Program Pemeriksaan Gila

Idenya adalah membuat kode yang menghasilkan kesalahan.

Kesalahan pertama yang akan kita pikirkan adalah kesalahan sintaksis.

Tidak ada kesalahan sintaksis ...

Lainnya adalah bahwa kelas / fungsi tidak ada.

Itu tidak berjalan sejauh itu ...

Lainnya akan menjadi time-out atau memori meluap, tetapi, sekali lagi, itu tidak mencapai sejauh itu ...

Uji kode di sini: http://writecodeonline.com/php/ (hapus <?pada awal untuk menguji).

Ismael Miguel
sumber
3
Ini adalah kontes popularitas. Tidak perlu kram kode Anda untuk menyimpan byte. Format ulang saja agar lebih mudah dibaca;)
Songo
Saya akan menambahkan versi yang dapat dibaca nanti. Saya menggunakan jawaban yang persis sama dan tidak mengeditnya sama sekali.
Ismael Miguel
foreach(e()as&$e);adalah inti dari solusi ini. e()hanya untuk menjaga sintaks-pemeriksa berjalan dan &$esetelah asapa yang menyebabkan kegagalan.
TheConstructor
Sebenarnya, semuanya memainkan peran penting.
Ismael Miguel
9

VBScript

Pengguna Visual Basic 6 akan tahu itu

If Blah Then Foo Bar

legal, sebagaimana adanya

If Blah Then 
    Foo Bar
End If

Tapi bagaimana dengan itu?

If Blah Then Foo Bar End If

? Ternyata itu legal di VBScript tetapi tidak di VB6. Mengapa?

Ini adalah bug di parser; maksudnya adalah untuk menolak ini. Kode yang mendeteksi End Ifseharusnya juga memeriksa apakah itu pernyataan multi-line If, dan itu tidak. Ketika saya mencoba untuk memperbaikinya dan mengirimkan beta dengan perbaikan, sebuah organisasi berita industri yang berpengaruh menemukan bahwa mereka memiliki baris kode ini di salah satu program VBScript mereka dan mengatakan mereka akan memberikan versi baru peringkat rendah kecuali kita tidak memperbaiki bug, karena mereka tidak ingin mengubah kode sumber mereka.

Eric Lippert
sumber
Apakah ada kerugian untuk membiarkan bug tidak diperbaiki, selain memungkinkan Anda untuk menulis kode VBS yang tidak valid di VB6?
Gabe
1
@ Gabe: Tidak, tidak ada downside selain lebih sulit untuk mem-porting kode VBScript ke VB.
Eric Lippert
1
Sebuah nama ! Siapa organisasi berita ini?
Nicolas Barbulesco
9

C

Ini mengingatkan saya pada kesalahan yang saya alami ketika saya belajar C. Sayangnya varian aslinya tampaknya tidak bekerja dengan GCC saat ini, tetapi yang ini masih:

#define ARR_SIZE 1234
int main() {
    int i = ARR_SIZE;
    int arr[ARR_SIZE];
    while(i >= 0) {
        (--i)[arr] = 0;
    }
    i = *(int*)0;
}

Ini jelas segfaults karena kita merujuk pointer nol, kan?

Salah - sebenarnya, ini adalah loop tak terbatas karena kondisi loop kami dimatikan satu per satu. Karena penurunan awalan, iberjalan dari 1023 ke -1. Ini berarti tugas menimpa tidak hanya semua elemen dalam arr, tetapi juga lokasi memori langsung sebelum itu - yang kebetulan merupakan tempat di mana idisimpan. Pada saat mencapai -1, imenimpa dirinya sendiri 0dan dengan demikian kondisi loop terpenuhi lagi ...

Ini adalah varian asli I yang tidak dapat saya reproduksi lagi:

Hal yang sama bekerja dengan inaik dari 0 dan dimatikan oleh satu. GCC terbaru selalu disimpan isebelumnya arrdalam memori; ini pasti berbeda di versi yang lebih lama (mungkin tergantung pada perintah deklarasi). Itu adalah kesalahan aktual yang saya hasilkan di salah satu program mainan pertama saya yang berurusan dengan array.

Juga, yang ini jelas jika Anda tahu bagaimana pointer bekerja di C, tetapi bisa mengejutkan jika Anda tidak:

Anda mungkin berpikir bahwa tugas untuk (--i)[arr]melempar kesalahan, tetapi valid dan setara dengan arr[--i]. Ekspresi a[x]hanyalah gula sintaksis *(a + x)yang menghitung dan merujuk pointer ke elemen yang diindeks; penambahan ini tentu saja komutatif dan dengan demikian setara dengan *(x + a).

l4mpi
sumber
1
Sejauh yang saya bisa lihat, loop body tidak boleh dieksekusi (karena 1234 <= 0 bernilai false). Apakah Anda bermaksud menulis "> ="?
celtschk
1
@celtschk ya, itu salah ketik. Terima kasih telah memperhatikan!
14mpi
Apakah perataan memori ini benar-benar ditentukan, atau hanya diterapkan dengan cara ini di beberapa kompiler?
Paŭlo Ebermann
9

Jawa

public class WhatTheHeckException extends RuntimeException {
    private static double d;        // Uninitialized variable
    public static void main(String... args) {
        if (d/d==d/d) throw new WhatTheHeckException();
        // Well that should always be true right? == is reflexive!

        System.out.println("Nothing to see here...");
    }
}

Mengapa ini bekerja:

Bidang yang disatukan memiliki nilai default. Dalam hal ini d hanya 0 . 0/0 = NaN dalam pembagian ganda, dan NaN tidak pernah sama dengan dirinya sendiri, sehingga if mengembalikan false. Catatan ini tidak akan berfungsi jika Anda memiliki 0/0 == 0/0 , karena akan bilangan bulat 0/0 0/0 0/0 divisi AKAN melempar ArithmeticException .

durron597
sumber
8

C ++ 11

struct comp {
    comp operator compl () { return comp { }; }
    operator comp () { return comp { }; }
    compl comp () { return; comp { }; }
};

int main() {
    comp com;
    compl com;
}

Mengkompilasi dan menjalankan tanpa peringatan dengan g++ -pedantic-errors -std=c++11.

compladalah ejaan alternatif standar untuk ~, sama seperti notmerupakan alternatif untuk !. compldigunakan di sini untuk menimpa pertama operator~dan kemudian menentukan destruktor. Trik lain adalah operator compfungsi konversi dari tipe compke dirinya sendiri. Anehnya standar ini tidak melarang fungsi konversi seperti itu - tetapi ia mengatakan bahwa fungsi seperti itu tidak pernah digunakan.

han
sumber
8

VBScript

function[:(](["):"]):[:(]=["):"]:
end function
msgbox getref(":(")(":)")

'Output: :)

Apa fungsinya:

Fungsi, Sub dan Nama Variabel di VBScript bisa apa saja jika Anda menggunakan tanda kurung siku. Script ini membuat fungsi yang disebut :(dan satu argumen "):"tetapi karena mereka tidak mengikuti konvensi penamaan yang normal mereka dikelilingi oleh tanda kurung. Nilai kembali diatur ke nilai parameter. Kolon tambahan digunakan untuk mendapatkan semuanya dalam satu baris. Pernyataan Msgbox mendapatkan referensi ke fungsi (tetapi tidak memerlukan tanda kurung) dan menyebutnya dengan smiley :)sebagai parameter.

AutomatedChaos
sumber
1
Begitu banyak wajah cemberut :(
Joe Z.
8

C #

Sebenarnya saya menemukan diri saya keliru melakukan hal itu :)

public static object Crash(int i)
{
    if (i > 0)
        return i + 1;
    else
        return new ArgumentOutOfRangeException("i");
}

public static void Main()
{
    Crash(-1);
}

melempar , tidak kembali .

Menakuti
sumber
Haha, selamat datang di situs ini! Kudos atas keberaniannya ini sebagai posting pertama. :)
Jonathan Van Matre
7

Jawa

enum derp
{

    public static void main(String[] a)
    {
        System.out.println(new org.yaml.snakeyaml.Yaml().dump(new java.awt.Point()));
    }
}

Dan bagaimana cara kerjanya:

Pertama, Anda pikir Enum tidak valid tetapi valid; maka Anda berpikir itu akan mencetak atribut objek Point standar tetapi Gotcha! karena cara Snakeyaml membuat serial Anda mendapatkan kesalahan StackOverFLow yang lancar

Dan satu lagi:

enum derp
{

    ;public static void main(String[] a)
    {
        main(a);
    }
    static int x = 1;

    static
    {
        System.exit(x);
    }
}

Anda berpikir Stackoverflow akan terjadi karena rekursi yang jelas tetapi program menyalahgunakan fakta bahwa ketika Anda menjalankannya static{} blockakan dieksekusi terlebih dahulu dan karena itu keluar sebelum main () memuat

enum derp
{

    ;
        public static void main(
            String[] a)
    {
        int aa=1;
        int ab=0x000d;
        //setting integer ab to \u000d  /*)
        ab=0;

        /*Error!*/
        aa/=ab;
    }
    static int x = 1;
}

ini bergantung pada /*Error*/kode out -commented sebagai titik penutup untuk komentar yang dibuka sebelum ab = 0; penjelasan tentang bilangan integer ke 0x000d menyembunyikan baris baru untuk mengaktifkan komentar dari baris berikutnya

masterX244
sumber
1
Saya tidak bisa sekarang, tapi alangkah baiknya jika Anda memformat ulang ini, jika memungkinkan. Agak sulit dibaca seperti ...: P
Jwosty
membuat mereka lebih jelas; dan tag spoiler dimaksudkan karena triknya tidak jelas pada awalnya
masterX244
2
Tunggu, jadi yang pertama menghasilkan kesalahan? Itu kebalikan dari apa yang ditanyakan. Dan mengapa tidak hanya System.exit (1) di yang kedua?
Bersepeda
3
Tidak ada programmer java yang mengharapkan stack overflow di snippet kedua. Maaf, itu terlalu jelas.
Tobias
1
@VVK kebiasaan mengubah kode untuk menggunakan enum{alih-alih class{menghemat satu byte saat itu
masterX244
6

C

String dan array di c bisa sangat membingungkan

main(){
  int i=0;
  char string[64]="Hello world;H%s";
  while(strlen(&i++[string])){
    i[' '+string]=string[i]-' ';
  }
  5[string]=44;
  return printf(string,'!'+string);
}
orion
sumber
9
sulit dibaca, tetapi saya tidak tahu kesalahan macam apa yang orang harapkan dari ini
Bryan Chen
3
Saya hanya ingin mengingatkan orang tentang notasi yang valid tetapi tidak konvensional - buat apa yang Anda mau. Saya pasti akan melihat tiga kali sebelum mengatakan ini valid. Pertama-tama, ekspresi seperti 5 [string] tidak dikenal oleh pembuat kode biasa dan menentang logika pengindeksan array. Kedua, '' + string terlihat seperti menambahkan 2 string, tetapi dengan jenis kutipan yang salah. Dan ketiga, & i ++ terlihat seperti alamat bilangan bulat (tapi yang diutamakan untuk itu). Akhirnya, kami menulis di luar string literal (tetapi tidak melampaui buffer backing yang lebih besar).
orion
Sepertinya tidak terlalu buruk. Saya hanya memiliki sedikit kode dalam C ++, tapi saya bisa mengetahuinya.
Navin