Tulis program terpendek yang menghasilkan peringatan dan kesalahan paling kompiler

42

Tantangan:

Tulislah sebuah program yang sangat singkat yang, ketika dikompilasi, menciptakan peringatan dan kesalahan kompiler paling banyak. Itu dapat ditulis dalam bahasa pemrograman apa pun.

Mencetak:

Skor ditentukan oleh persamaan ini: errors_and_warnings_length/code_length. Kemenangan skor tertinggi.

Contoh:

Program C # classmemiliki panjang 5 karakter dan menghasilkan 3 peringatan, yang merupakan skor (1/5) * 3 = 0,6.

EDIT:

Karena beberapa kebingungan, program harus setidaknya 1 karakter. Kalau tidak, itu akan mendapatkan skor tak terbatas.

MD XF
sumber
17
Sementara saya suka konsepnya, saya menemukan metriknya sedikit mengkhawatirkan. Kompiler apa? Pengaturan apa (terutama yang berkaitan dengan peringatan)? Maksud saya gcc -Wall -pedanticsangat berbeda dari ol biasa gccberbeda dari tccmungkin berbeda dari beberapa c compiler lainnya.
dmckee
2
Hanya dapatkan kompiler dalam bahasa Rusia, atau Jerman, Anda mendapatkan beberapa kesalahan PANJANG (tidak ada
permainan
2
Saya ingin melihat jawaban dalam bahasa selain C / C ++.
Ken Bloom
4
Saya akan menyukainya jika tantangannya menghasilkan sebanyak mungkin kesalahan yang berbeda
Hannesh
3
Ahem. Kalau tidak, skornya tidak akan ditentukan .
wizzwizz4

Jawaban:

94

GCC, skor 2 200 /36 ≈ 4,5 × 10 58

#include __FILE__
#include __FILE__

Saya belum benar-benar selesai mengkompilasi kode ini, tetapi berdasarkan pengujian dan matematika sederhana, harus menghasilkan total 200 #include nested too deeply kesalahan.

Tentu saja, program ini mudah dikembangkan. Menambahkan baris ketiga membawa skor hingga 3 200 /54 ≈ 4,9 × 10 93 . Empat baris memberikan 4 200 /72 ≈ 3,6 × 10 118 , dan seterusnya.

Ilmari Karonen
sumber
6
Jawaban yang sangat pintar. +1
Pangeran John Wesley
5
Saya sangat pandai setuju, tetapi saya menganggapnya sebagai 1 kesalahan ("bersarang terlalu dalam"), bukan kesalahan terpisah untuk setiap baris dari jejak balik.
Kevin
1
@ Kevin: Hanya untuk menjadi jelas, itu harus menghasilkan kesalahan itu 2² 2 kali, sekali untuk setiap jalur yang memungkinkan dengan mana batas bersarang dapat dicapai. Fakta bahwa setiap kesalahan juga mencakup 200 baris backtrace hanya membuat output lebih verbose.
Ilmari Karonen
1
Hmm. Saya bisa bersumpah ketika saya mencobanya tadi malam gcc ditebus setelah 1 kesalahan, tetapi tampaknya sedang menjalankan pencetakan lebih sekarang. Keberatan ditarik. Kebetulan, apakah 200 dari standar c?
Kevin
1
@Kevin Per gcc.gnu.org/onlinedocs/gcc-4.8.2/cpp/Implementation-limits.html : "Kami memberlakukan batas sewenang-wenang dari 200 level [dari sarang #include], untuk menghindari rekursi yang kabur. Standar ini membutuhkan setidaknya 15 level. "
zwol
48

C, 0 karakter - Skor = (1/0) * 1 = Infinity



menghasilkan 1 kesalahan:

/usr/lib/gcc/i686-pc-linux-gnu/4.7.0/../../../crt1.o: In function `_start':
(.text+0x18): undefined reference to `main'
collect2: error: ld returned 1 exit status

Catatan: http://ideone.com/xdoJyA

l0n3sh4rk
sumber
49
1/0 tidak didefinisikan, bukan "tak terbatas".
Frank
3
+1 Bahkan jika 1/0 tidak ditentukan, itu jelas lebih besar dari satu dibagi dengan angka yang lebih besar. 0 mengambil kue.
jnm2
6
@ jnm2 tidak yakin tentang itu. 1/0 tidak terdefinisi dan, meskipun sisi kanan mendekati + infinity, itu tidak membuat 1/0 didefinisikan sama sekali.
kaoD
5
Karena domainnya positif, saya pikir apa yang saya katakan masuk akal. Teori itu menyenangkan tetapi saya pikir kita perlu akal sehat di sini. Ingat, kesalahan penyusun paling banyak untuk kode paling sedikit. Batasnya jelas.
jnm2
15
1.0 / 0.0 = + INF, setidaknya sesuai dengan IEEE 754 :) Jadi Anda hanya perlu melakukan perhitungan di floating point.
Keith Randall
19

GCC, skor 5586,6 (dan lebih banyak jika diperlukan)

179 karakter, 1000003 peringatan / kesalahan (menggunakan -Wall)

#define E a,a,a,a,a,a,a,a,a,a
#define D E,E,E,E,E,E,E,E,E,E
#define C D,D,D,D,D,D,D,D,D,D
#define B C,C,C,C,C,C,C,C,C,C
#define A B,B,B,B,B,B,B,B,B,B
_(){A,A,A,A,A,A,A,A,A,A}

Ini dapat diperpanjang secara sewenang-wenang, tentu saja. Misalnya, menggunakan 10 #definedetik bukannya 5 dan panjang 20 "panggilan" alih-alih 10 akan menghasilkan skor sekitar (20 ** 10) / (179 * 4) = 14301675977.65 (dan akan memakan waktu cukup lama untuk dijalankan ;)

schnaader
sumber
7
Menggunakan #define X(A) A,A,A,A,A,A,Adan X(X(X(X(X(X(A))))))Anda dapat menduplikasi kode lebih cepat.
ugoren
12

GCC dua kali, 86

22 karakter, 1898 kesalahan + peringatan di sistem saya.
Saya yakin pendekatan ini bisa lebih ditingkatkan, dengan memilih file yang lebih panjang dengan nama yang lebih pendek.

#include</usr/bin/gcc>
ugoren
sumber
3
/usr/bin/gdbsecara signifikan lebih besar (5,5M vs 760K), tetapi /vmlinuzpada 5,6M mungkin merupakan taruhan terbaik Anda.
wchargin
12

HQ9 ++, 1 (batas (n + 29) / n)

Berikut ini memancarkan peringatan Warning: this is not a quineuntuk setiap Q dalam kode.

QQQQQ...Q
Warning: this is not a quine

Kecil itu bagus, kan? Hmm ...

stan
sumber
FWIW, ini lelucon. Jika itu tidak jelas.
Stanby
10

C, .727

11 karakter, 5 kesalahan, 3 peringatan, (1/11) * 8 = .727273

m(;){@,x}2

cc -g -Wall    er.c   -o er
er.c:1: error: expected declaration specifiers or '...' before ';' token
er.c:1: warning: return type defaults to 'int'
er.c: In function 'm':
er.c:1: error: stray '@' in program
er.c:1: error: expected expression before ',' token
er.c:1: error: 'x' undeclared (first use in this function)
er.c:1: error: (Each undeclared identifier is reported only once
er.c:1: error: for each function it appears in.)
er.c:1: warning: left-hand operand of comma expression has no effect
er.c:1: warning: control reaches end of non-void function
er.c: At top level:
er.c:1: error: expected identifier or '(' before numeric constant

luser droog
sumber
Saya menghitung 5 kesalahan, ditambah 3 peringatan
Kevin
Saya kira kamu benar. Saya menghitung string "error:" dan "warning:".
luser droog
5
Saya pikir Anda menang jika kami hanya menghitung kesalahan / peringatan yang berbeda.
ugoren
Jika -Werror digunakan pada baris perintah, peringatan dipromosikan ke kesalahan. Dan juga, compiler C mana yang digunakan akan mempengaruhi jumlah kesalahan yang dilaporkan (atau jika -Werror tersedia, dll.) Seseorang mungkin berpendapat panjang baris perintah untuk doa mungkin dihitung sebagai bagian dari panjang "program" ... dan masing-masing versi kompiler pada setiap platform adalah kategori yang terpisah. :-)
Dr. Rebmu
8

NASM, skor 63/40 * 2 ^ 32 ≈ 2.905 * 10 ^ 19

%rep 1<<32
%rep 1<<32
!
%endrep
%endrep

Akan menghasilkan c.asm:3: error: label or instruction expected at start of line2 ^ 64 kali. Sekali lagi ini mudah diperluas ke output yang jauh lebih besar.

salinan
sumber
2

C ++ 98 (211 bytes) g ++ - 5 (Ubuntu 5.2.1-23ubuntu1 ~ 12.04) 5.2.1 0151031

Saya ingin melihat seberapa baik yang dapat saya lakukan di C ++ tanpa menggunakan preprocessor sama sekali. Program ini menghasilkan 2.139.390.572 byte output, yang sebagian besar adalah pesan kesalahan tunggal.

template<int i,class S,class T>struct R{typedef R<i,typename R<i-1,S,S>::D,typename R<i-1,S,S>::D>D;};template<class S,class T>struct R<0,S,T>{typedef S D;};void f(){R<27,float,R<24,int*const*,int>::D>::D&E=4;}

me@Basement:~/src/junk$ ls -l a.C
-rw-rw-r-- 1 me me 211 Apr 27 21:44 a.C
me@Basement:~/src/junk$ g++-5 a.C -fmax-errors=1 2>a.C.errors.txt
me@Basement:~/src/junk$ ls -l a.C.errors.txt 
-rw-rw-r-- 1 me me 2139390572 Apr 27 22:01 a.C.errors.txt

Tidak Disatukan:

template <int i, class S, class T>
struct R {
    typedef R<i, typename R<i-1,S,S>::D, typename R<i-1,S,S>::D> D;
};
template <class S, class T>
struct R<0, S, T> {
    typedef S D;
};
void f() {
    R<27, float, R<24, int*const*, int>::D>::D &E = 4;
}

Program ini bekerja dengan mendefinisikan template struct rekursif R yang memegang typedef D yang mengandung dua salinan R. Ini menghasilkan nama tipe yang tumbuh secara eksponensial, yang dicetak secara penuh dalam pesan kesalahan. Sayangnya, g ++ sepertinya tersedak saat mencoba untuk mencetak pesan kesalahan yang lebih lama dari (1 << 31) byte. 2.139.390.572 byte adalah yang paling dekat yang bisa saya dapatkan hingga batas tanpa melampaui. Saya ingin tahu apakah ada yang bisa menyesuaikan batas rekursi dan tipe parameter 27, float, 24, int*const*untuk mendekati batas (atau menemukan kompiler yang dapat mencetak pesan kesalahan yang lebih lama).

Kutipan dari pesan kesalahan:

a.C: In function ‘void f()’:
a.C:1:208:  error:  invalid  initialization  of non-const reference of type
‘R<27, float, R<24, R<23, R<22, R<21, R<20, R<19, R<18, R<17, R<16, R<15,
R<14,  R<13, R<12, R<11, R<10, R<9, R<8, R<7, R<6, R<5, R<4, R<3, R<2, R<1,
int* const*, int* const*>, R<1, int* const*, int* const*> >, R<2, R<1, int*
const*,  int*  const*>,  R<1, int* const*, int* const*> > >, R<3, R<2, R<1,
int* const*, int* const*>, R<1, int* const*, int* const*> >, R<2, R<1, int*
const*,  int* const*>, R<1, int* const*, int* const*> > > >, R<4, R<3, R<2,
R<1, int* const*, int* const*>, R<1,
...
int*  const*,  int*  const*>  > > > > > > > > > > > > > > > > > > > > > > >
>::D& {aka R<27, R<26, R<25, R<24, R<23,  R<22,  R<21,  R<20,  R<19,  R<18,
R<17,  R<16,  R<15,  R<14, R<13, R<12, R<11, R<10, R<9, R<8, R<7, R<6, R<5,
R<4, R<3, R<2, R<1, float, float>, R<1, float, float> >, R<2,  R<1,  float,
float>,  R<1,  float, float> > >, R<3, R<2, R<1, float, float>, R<1, float,
float> >, R<2, R<1, float, float>, R<1, float, float> > > >, R<4, 
...
, R<1, float, float>, R<1, float, float> > >, R<3, R<2, R<1, float, float>,
R<1, float, float> >, R<2, R<1, float, float>, R<1, float, float> > > > > >
>  >  >  >  >  >  > > > > > > > > > > > > > > >&}’ from an rvalue of type
‘int’
    template<int    i,class   S,class   T>struct   R{typedef   R<i,typename
R<i-1,S,S>::D,typename  R<i-1,S,S>::D>D;};template<class  S,class  T>struct
R<0,S,T>{typedef                         S                         D;};void
f(){R<27,float,R<24,int*const*,int>::D>::D&E=4;}


                                                        ^
compilation terminated due to -fmax-errors=1.

2.139.390.572 byte / 211 byte = 10.139.291,8

Menghitung Nut
sumber
Inilah sebabnya saya selalu menggunakan STLfilt ... Selamat datang di PPCG! Ini adalah pengiriman pertama yang bagus!
Mego
1
Sayangnya sepertinya saya salah mengerti tantangannya; tampaknya pengiriman dinilai oleh jumlah pesan kesalahan, bukan jumlah byte. Jelas entri 1 kesalahan saya tidak terlalu kompetitif. Mungkin jawaban saya harus dipindahkan ke sini
Menghitung Nut
-1

SmileBASIC, 1/1 = 1

A

Menghasilkan kesalahan Syntax Error in 0:1

12Me21
sumber
SB hanya pernah menghasilkan satu kesalahan pada satu waktu, jadi ini adalah satu-satunya jawaban yang dapat Anda buat.
snail_