가장 많은 컴파일러 경고 및 오류를 생성하는 가장 짧은 프로그램 작성


42

도전 과제 :

컴파일 할 때 가장 많은 양의 컴파일러 경고 및 오류를 생성하는 매우 짧은 프로그램을 작성하십시오. 모든 프로그래밍 언어로 작성 될 수 있습니다.

채점 :

점수는 다음 방정식으로 결정됩니다 errors_and_warnings_length/code_length. 최고 점수가 이깁니다.

예:

C # 프로그램의 class길이는 5 자이며 3 개의 경고를 생성하는데,이 점수는 (1/5) * 3 = 0.6입니다.

편집하다:

약간의 혼동으로 인해 프로그램 길이는 1 자 이상이어야합니다. 그렇지 않으면 무한대의 점수를 얻습니다.


17
개념이 마음에 들지만 메트릭이 약간 걱정됩니다. 어떤 컴파일러? 어떤 설정 (특히 경고와 관련하여)? 나는 gcc -Wall -pedantic평범한 ol와 매우 다르다는 것을 의미 합니다. 다른 c 컴파일러와 gcc는 다를 수 있습니다 tcc.
— 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 개의 오류 ( "너무 깊게 중첩")로 간주합니다.
— Kevin

1
@Kevin : 분명하게 말하면 중첩 한계에 도달 할 수있는 각 가능한 경로마다 한 번씩 2²⁰⁰ 번 오류가 발생해야합니다. 각각의 오차는 사실 도 역 추적 200 개 라인을 포함하고 단지 출력을 더욱 상세하게.
— Ilmari Karonen

1
흠. 어제 밤에 시도했을 때 맹세 할 수 있습니다 .gcc는 1 오류 후에 맹세했지만 지금은 인쇄가 더 많이 실행되고있는 것 같습니다. 이의 제기 철회. 또한 c 표준에서 200은 무엇입니까?
— 케빈

1
@Kevin Per gcc.gnu.org/onlinedocs/gcc-4.8.2/cpp/Implementation-limits.html : "우리는 #include런 어웨이 재귀를 피하기 위해 200 레벨 [중첩 ]을 임의로 제한 합니다. 표준에는 최소 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은 "무한대"가 아닌 정의되지 않습니다.
— Frank

3
+1 1/0이 정의되어 있지 않더라도 1보다 큰 숫자로 나눈 것보다 명백히 큽니다. 0은 케이크를 가져갑니다.
— jnm2

6
@ jnm2 확실하지 않습니다. 1/0은 정의되지 않았으며 오른쪽은 + 무한대에 접근하지만 1/0을 전혀 정의하지는 않습니다.
— kaoD

5
도메인이 긍정적이기 때문에 내가 말한 내용이 의미가 있다고 생각합니다. 이론은 재미 있지만 여기서 상식이 필요하다고 생각합니다. 가장 적은 양의 코드에 대한 가장 많은 컴파일러 오류는 기억하십시오. 한계는 분명하다.
— jnm2

15
적어도 IEEE 754에 따르면 1.0 / 0.0 = + INF :) 따라서 부동 소수점으로 계산하면됩니다.
— 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}

이것은 물론 임의로 확장 될 수 있습니다. 예를 들어 #define5 대신 10 s를 사용하고 10 대신 20 "전화"를 사용하면 약 (20 ** 10) / (179 * 4) = 14301675977.65의 점수를 얻습니다 (그리고 실행하는 데 시간이 꽤 오래 걸림) ;)


7
사용 #define X(A) A,A,A,A,A,A,A하고 X(X(X(X(X(X(A))))))당신은 훨씬 더 빠르게 코드를 복제 할 수 있습니다.
— 우고 렌

12

GCC 두 번, 86

22 문자, 1898 오류 + 시스템 경고.
짧은 이름을 가진 더 긴 파일을 선택하면이 방법이 훨씬 향상 될 수 있습니다.

#include</usr/bin/gcc>

3
/usr/bin/gdb상당히 커지지 만 (5.5M 대 760K) /vmlinuz5.6M이 가장 좋습니다.
— wchargin

12

HQ9 ++, 1 ((n + 29) / n 제한)

다음은 Warning: this is not a quine코드에서 각 Q에 대한 경고 를 표시 합니다.

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

작은 것이 좋다? 흠 ...


FWIW, 이것은 농담입니다. 그것이 분명하지 않은 경우.
— boothby

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 개의 경고를 세었다
— Kevin

당신 말이 맞아요 "error :"와 "warning :"문자열을 세고있었습니다.
— luser droog

5
우리가 다른 오류 / 경고 만 계산하면 승리한다고 생각합니다.
— ugoren

명령 행에서 -Werror를 사용하면 경고가 오류로 승격됩니다. 또한 사용 된 C 컴파일러는보고 된 오류 수에 영향을 미칩니다 (또는 -Werror가 사용 가능한 경우 등). 호출 할 명령 행 길이는 "프로그램"길이의 일부로 계산 될 수 있습니다. 각 플랫폼의 컴파일러 버전은 별도의 범주입니다. :-)
— Dr. 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 바이트) g ++-5 (우분투 5.2.1-23 우분투 1 ~ 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

언 골프 드 :

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를 보유하는 재귀 적 struct 템플리트 R을 정의하여 작동합니다. 이로 인해 유형 이름이 기하 급수적으로 증가하여 오류 메시지에 완전히 인쇄됩니다. 불행하게도, g ++는 (1 << 31) 바이트보다 긴 오류 메시지를 인쇄하려고 할 때 질식하는 것 같습니다. 2,139,390,572 바이트는 넘어 가지 않고 한계에 도달 할 수있는 가장 가까운 바이트였습니다. 누군가가 재귀 제한과 매개 변수 유형 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 바이트 / 211 바이트 = 10,139,291.8


이것이 제가 항상 STLfilt를 사용하는 이유입니다 ... PPCG에 오신 것을 환영합니다! 이것은 훌륭한 첫 제출입니다!
— Mego

1
불행히도 내가 도전을 오해 한 것 같습니다; 바이트 수가 아닌 오류 메시지 수에 따라 제출 점수가 매겨집니다. 분명히 내 1 오류 항목은 경쟁이 치열하지 않습니다. 아마도 내 대답은 여기
— Nut를 계산

-1

SmileBASIC, 1/1 = 1

A

오류를 생성합니다 Syntax Error in 0:1


SB는 한 번에 하나의 오류 만 생성하므로 실제로는 이것이 유일한 답변입니다.
— snail_
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.