コンパイラの警告とエラーを最も多く生成する最短のプログラムを作成する


42

挑戦:

コンパイル時に、コンパイラの警告とエラーを最も多く生成する非常に短いプログラムを作成します。任意のプログラミング言語で作成できます。

得点:

スコアは次の方程式によって決定されますerrors_and_warnings_length/code_length。最高スコアが勝ちます。

例:

C#プログラムのclass長さは5文字で、3つの警告を生成します。これは、スコア(1/5)* 3 = 0.6です。

編集:

多少の混乱のため、プログラムは少なくとも1文字の長さが必要です。それ以外の場合は、無限のスコアを取得します。


17
コンセプトは気に入っていますが、メトリックが少し気になります。どのコンパイラ?どのような設定(特に警告に関して)?私が意味するgcc -Wall -pedantic、プレーンol`とは非常に異なっているgccと異なっているtccいくつかの他のCコンパイラからおそらく異なっています。
dmckee

2
ロシア語またはドイツ語のコンパイラを入手するだけで、いくつかのLONGエラーが表示されます(しゃれはありません)
–ζ

2
C / C ++以外の言語で答えを見つけたいです。
ケンブルーム

4
できる限り多くの異なるエラーを生成することが課題である場合、私はそれが好きだったでしょう
ハンネシュ

3
エヘム。そうでない場合、そのスコアは未定義になります。
wizzwizz4

回答:


94

GCC、2得点200 /36≈4.5×10 58

#include __FILE__
#include __FILE__

このコードのコンパイルは実際には完了していませんが、テストと単純な数学に基づいて、合計で2 200の #include nested too deeplyエラーが発生するはずです。

もちろん、このプログラムは簡単に拡張できます。3行目を追加すると、スコアは最大3 200 /54≈4.9×10 93になります。4行で4 200 /72≈3.6×10 118などとなります。


6
非常に賢い答え。+1
プリンスジョンウェスリー

5
非常に賢いことに同意しますが、バックトレースの各行の個別のエラーではなく、1つのエラー(「ネストが深すぎる」​​)としてカウントします。
ケビン

1
@Kevin:明確にするために、ネスト制限に到達する可能性のあるパスごとに1回、そのエラーを2²⁰⁰回生成する必要があります。各エラーに 200行のバックトレースが含まれているという事実により、出力がさらに冗長になります。
イルマリカロネン

1
うーん。昨夜、gccが1つのエラーの後に保釈されたときに試してみましたが、今では印刷を実行しているようです。異議は撤回されました。ちなみに、C標準から200ですか?
ケビン

1
@Kevin Per gcc.gnu.org/onlinedocs/gcc-4.8.2/cpp/Implementation-limits.html:「#include暴走再帰を避けるために、[ネストの] 200レベルの任意の制限を課しています。標準では少なくとも15レベル。」
zwol 14年

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は未定義であり、「無限大」ではありません。
フランク

3
+1 1/0が定義されていない場合でも、1を大きな数で割った値よりも明らかに大きい。0はケーキを受け取ります。
jnm2

6
@ jnm2それについてはわかりません。1/0は未定義で、右側は+∞に近づきますが、1/0はまったく定義されません。
kaoD

5
ドメインはポジティブなので、私が言ったことは理にかなっていると思います。理論はおもしろいですが、ここでは常識が必要だと思います。最小限のコードで最も多くのコンパイラエラーが発生することを覚えておいてください。制限は明らかです。
jnm2

15
1.0 / 0.0 = + INF、少なくともIEEE 754に準拠:)したがって、計算は浮動小数点で行う必要があります。
キースランドール

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}

もちろん、これは任意に拡張できます。たとえば#define、5の代わりに10 秒、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 2回、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、0.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つの警告をカウントします
ケビン

あなたは正しいと思います。「error:」および「warning:」の文字列をカウントしていました。
luserはドローグ

5
異なるエラー/警告を数えるだけで、あなたは勝つと思います。
ウゴレン

コマンドラインで-Werrorを使用すると、警告がエラーになります。そしてまた、Cコンパイラが報告されたエラーの数に影響します使用している(または-Werror等、利用可能な場合) の一つは、「プログラム」の長さの一部としてカウントされる可能性があります起動するためのコマンドラインの長さを主張するかもしれない...と、それぞれを各プラットフォームのコンパイラバージョンは、個別のカテゴリです。:-)
レブム博士18

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(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

ゴルフをしていない:

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の2つのコピーを含むtypedef Dを保持する再帰的な構造体テンプレート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へようこそ!これは素晴らしい最初の提出です!
メゴ

1
残念ながら、私は挑戦を誤解したようです。送信は、バイト数ではなくエラーメッセージの数によってスコア付けされているようです。明らかに、1つのエラーエントリはそれほど競争力がありません。おそらく私の答えはここ
ナットの計算

-1

SmileBASIC、1/1 = 1

A

エラーを生成します Syntax Error in 0:1


SBは一度に1つのエラーしか生成しないため、これが本当に唯一の答えです。
snail_
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.