เขียนโปรแกรมที่สั้นที่สุดที่สร้างคำเตือนและข้อผิดพลาดคอมไพเลอร์มากที่สุด


42

ความท้าทาย:

เขียนโปรแกรมสั้น ๆ ที่เมื่อรวบรวมแล้วจะสร้างคำเตือนและข้อผิดพลาดจำนวนมากที่สุด มันสามารถเขียนในภาษาการเขียนโปรแกรมใด ๆ

เกณฑ์การให้คะแนน:

คะแนนถูกกำหนดโดยสมการนี้: errors_and_warnings_length/code_length. คะแนนสูงสุดชนะ

ตัวอย่าง:

โปรแกรม C # classยาว 5 ตัวอักษรและสร้างคำเตือน 3 คำซึ่งเป็นคะแนน (1/5) * 3 = 0.6

แก้ไข:

เนื่องจากความสับสนบางอย่างโปรแกรมจะต้องมีความยาวอย่างน้อย 1 ถ่าน มิฉะนั้นจะได้รับคะแนนอนันต์


17
ในขณะที่ฉันชอบแนวคิดนี้ฉันพบว่าการวัดค่อนข้างน่าเป็นห่วง คอมไพเลอร์อะไร? การตั้งค่าใด (โดยเฉพาะเกี่ยวกับคำเตือน) ฉันหมายความว่าgcc -Wall -pedanticแตกต่างจาก ol ol ธรรมดามากแตกgccต่างจากtccสมมุติว่าแตกต่างจากคอมไพเลอร์ c อื่น ๆ
dmckee

2
เพิ่งได้รับคอมไพเลอร์เป็นภาษารัสเซียหรือเยอรมันคุณจะได้รับข้อผิดพลาด LONG (ไม่มีการเล่นสำนวน)
ζ--

2
ฉันชอบที่จะเห็นคำตอบในภาษาอื่นที่ไม่ใช่ C / C ++
Ken Bloom

4
ฉันจะชอบมันถ้าความท้าทายคือการสร้างข้อผิดพลาดที่แตกต่างกันให้มากที่สุดเท่าที่จะเป็นไปได้
Hannesh

3
เสียงกระแอม มิฉะนั้นคะแนนของตนจะไม่ได้กำหนด
wizzwizz4

คำตอบ:


94

GCC คะแนน 2 200 /36 ≈ 4.5 × 10 58

#include __FILE__
#include __FILE__

ฉันยังไม่ได้ทำการรวบรวมรหัสนี้ แต่จากการทดสอบและคณิตศาสตร์อย่างง่ายมันควรสร้างข้อผิดพลาดทั้งหมด 2 200 #include nested too deeplyข้อ

แน่นอนว่าโปรแกรมนั้นสามารถขยายได้เล็กน้อย เพิ่มบรรทัดที่สามนำคะแนนขึ้นไป3 200 /54 ≈ 4.9 × 10 93 สี่สายให้4 200 /72 ≈ 3.6 × 10 118และอื่น ๆ


6
คำตอบที่ฉลาดมาก +1
เจ้าชายจอห์นเวสลีย์

5
ฉลาดมากฉันเห็นด้วย แต่ฉันนับว่าเป็นข้อผิดพลาด 1 ข้อ ("ซ้อนกันลึกเกินไป") ไม่ใช่ข้อผิดพลาดแยกต่างหากสำหรับแต่ละบรรทัดของ backtrace
เควิน

1
@ เควิน: เพื่อให้ชัดเจนมันควรสร้างข้อผิดพลาดนั้น2²⁰⁰ครั้งหนึ่งครั้งสำหรับแต่ละเส้นทางที่เป็นไปได้โดยที่ถึงขีด จำกัด การซ้อน ความจริงที่ว่าข้อผิดพลาดแต่ละข้อนั้นมีแบ็คเทรซย้อนหลัง 200 บรรทัดทำให้การแสดงผลละเอียดยิ่งขึ้น
Ilmari Karonen

1
อืมมม ฉันสาบานได้ว่าเมื่อฉันพยายามมันเมื่อคืนนี้ gcc ประกันตัวหลังจากข้อผิดพลาด 1 ครั้ง แต่ดูเหมือนว่าจะเริ่มพิมพ์ได้มากกว่านี้ ถอนการคัดค้าน อนึ่ง 200 จากมาตรฐาน c คืออะไร?
เควิน

1
@Kevin Per gcc.gnu.org/onlinedocs/gcc-4.8.2/cpp/Implementation-limits.html : "เรากำหนดขีด จำกัด โดยพลการจำนวน 200 ระดับ [ของที่ซ้อนกัน#include] เพื่อหลีกเลี่ยงการเรียกซ้ำที่หลบหนีมาตรฐานต้องมีอย่างน้อย 15 ระดับ."
zwol

48

C, 0 ตัวอักษร - คะแนน = (1/0) * 1 = อินฟินิตี้



สร้างข้อผิดพลาด 1 รายการ:

/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

หมายเหตุ: http://ideone.com/xdoJyA


49
1/0 ไม่ได้ถูกกำหนดไม่ใช่ "infinity"
แฟรงค์

3
+1 แม้ว่า 1/0 จะไม่ได้กำหนด แต่ก็มีขนาดใหญ่กว่าหนึ่งหารด้วยจำนวนที่มากกว่าใด ๆ 0 รับเค้ก
jnm2

6
@ jnm2 ไม่แน่ใจเกี่ยวกับเรื่องนั้น 1/0 ไม่ได้ถูกกำหนดและแม้ว่าด้านขวาจะเข้าใกล้ + อนันต์ แต่ก็ไม่ได้กำหนด 1/0 เลย
kaoD

5
เนื่องจากโดเมนเป็นบวกฉันจึงคิดว่าสิ่งที่ฉันพูดมีเหตุผล ทฤษฎีสนุก แต่ฉันคิดว่าเราต้องการความรู้สึกร่วมกันที่นี่ ข้อผิดพลาดของคอมไพเลอร์ส่วนใหญ่สำหรับจำนวนน้อยที่สุดของรหัสจำ ขีด จำกัด นั้นชัดเจน
jnm2

15
1.0 / 0.0 = + INF อย่างน้อยตามมาตรฐาน IEEE 754 :) ดังนั้นคุณต้องทำการคำนวณในทศนิยม
Keith Randall

19

GCC คะแนน 5586.6 (และอื่น ๆ ถ้าจำเป็น)

179 ตัวอักษรคำเตือน / ข้อผิดพลาด 1000003 รายการ (ใช้-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}

นี้สามารถขยายได้ตามอำเภอใจแน่นอน ตัวอย่างเช่นการใช้ 10 #defineวินาทีแทน 5 และความยาว 20 "การโทร" แทน 10 จะนำไปสู่คะแนนประมาณ (20 ** 10) / (179 * 4) = 14301675977.65 (และใช้เวลาค่อนข้างนานในการรัน ;)


7
การใช้#define X(A) A,A,A,A,A,A,AและX(X(X(X(X(X(A))))))คุณสามารถทำสำเนารหัสได้เร็วขึ้นมาก
ugoren

12

GCC สองครั้ง 86

22 ตัวอักษรข้อผิดพลาด 1898 + คำเตือนในระบบของฉัน
ฉันแน่ใจว่าวิธีนี้สามารถปรับปรุงได้มากโดยเลือกไฟล์ที่ยาวขึ้นด้วยชื่อที่สั้นกว่า

#include</usr/bin/gcc>

3
/usr/bin/gdbมีขนาดใหญ่กว่าอย่างมาก (5.5M เทียบกับ 760K) แต่/vmlinuzที่ 5.6M อาจเป็นทางออกที่ดีที่สุดของคุณ
wchargin

12

HQ9 ++, 1 (จำกัด (n + 29) / n)

ต่อไปนี้ส่งเสียงเตือนWarning: this is not a quineสำหรับแต่ละ Q ในรหัส

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

ขนาดเล็กดีใช่มั้ย อืม ...


FWIW นี่เป็นเรื่องตลก หากไม่ชัดเจน
บูธตาม

10

C, .727

11 ตัวอักษร 5 ข้อผิดพลาดคำเตือน 3 รายการ (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


ฉันนับข้อผิดพลาด 5 ข้อบวกคำเตือน 3 ข้อ
เควิน

ฉันคิดว่าคุณพูดถูก ฉันกำลังนับสตริง "ข้อผิดพลาด:" และ "คำเตือน:"
luser droog

5
ฉันคิดว่าคุณชนะถ้าเรานับข้อผิดพลาด / คำเตือนที่แตกต่างกันเท่านั้น
ugoren

หากใช้ -Werror บนบรรทัดคำสั่งคำเตือนจะได้รับการเลื่อนตำแหน่งเป็นข้อผิดพลาด และนอกจากนี้คอมไพเลอร์ C ที่ใช้จะมีผลต่อจำนวนข้อผิดพลาดที่รายงาน(หรือถ้ามี -Werror พร้อมใช้งาน ฯลฯ ) หนึ่งอาจโต้แย้งความยาวบรรทัดคำสั่งสำหรับการเรียกใช้อาจนับเป็นส่วนหนึ่งของความยาว "โปรแกรม" ... รุ่นคอมไพเลอร์ในแต่ละแพลตฟอร์มเป็นหมวดหมู่แยก :-)
ดร. Rebmu

8

NASM, คะแนน 63/40 * 2 ^ 32 ≈ 2.905 * 10 ^ 19

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

จะส่งออกc.asm:3: error: label or instruction expected at start of line2 ^ 64 ครั้ง อีกครั้งนี้สามารถขยายไปยังเอาต์พุตที่ใหญ่กว่าได้อย่างง่ายดาย


2

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

ฉันต้องการดูว่าฉันสามารถทำใน C ++ ได้ดีเพียงใดโดยไม่ใช้ตัวประมวลผลล่วงหน้าเลย โปรแกรมนี้สร้างเอาต์พุต 2,139,390,572 ไบต์ซึ่งส่วนใหญ่เป็นข้อความแสดงข้อผิดพลาดเดียว

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

Ungolfed:

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

โปรแกรมนี้ทำงานโดยการกำหนดแม่แบบโครงสร้างแบบวนซ้ำ R ซึ่งเก็บ typedef D ที่มีสองสำเนาของ R ผลลัพธ์นี้ในชื่อประเภทที่เติบโตชี้แจงซึ่งถูกพิมพ์ออกมาเต็มในข้อความข้อผิดพลาด น่าเสียดายที่ g ++ ดูเหมือนจะทำให้หายใจไม่ออกขณะพยายามพิมพ์ข้อความแสดงข้อผิดพลาดที่ยาวกว่า (1 << 31) 2,139,390,572 bytes นั้นใกล้เคียงที่สุดที่ฉันสามารถทำได้โดยไม่ต้องผ่านไป ฉันอยากรู้ว่าใครสามารถปรับการ จำกัด การเรียกซ้ำและประเภทพารามิเตอร์27, float, 24, int*const*เพื่อให้ใกล้เคียงกับขีด จำกัด มากขึ้น (หรือค้นหาคอมไพเลอร์ที่สามารถพิมพ์ข้อความแสดงข้อผิดพลาดได้นานขึ้น)

ข้อความที่ตัดตอนมาจากข้อความแสดงข้อผิดพลาด:

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 bytes / 211 bytes = 10,139,291.8


นี่คือเหตุผลที่ฉันใช้STLเสมอ... ยินดีต้อนรับสู่ PPCG! นี่คือการส่งครั้งแรกที่ยอดเยี่ยม!
Mego

1
น่าเสียดายที่ฉันเข้าใจผิดความท้าทาย; ดูเหมือนว่าการส่งจะได้คะแนนจากจำนวนข้อความแสดงข้อผิดพลาดไม่ใช่จำนวนไบต์ เห็นได้ชัดว่ารายการข้อผิดพลาด 1 รายการของฉันไม่สามารถแข่งขันได้มาก บางทีคำตอบของฉันควรจะถูกย้ายไปที่นี่
คำนวณนอต

-1

SmileBASIC, 1/1 = 1

A

สร้างข้อผิดพลาด Syntax Error in 0:1


SB สร้างข้อผิดพลาดครั้งเดียวเท่านั้นดังนั้นนี่เป็นคำตอบเดียวที่คุณสามารถทำได้
หอยทาก _
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.