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


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.