C ++コンパイルからほとんどのエラーメッセージを生成する1文字のタイプミス


51

特にテンプレートを使用したC ++ファイルの簡単な変更は、エラーのページを生成する可能性があるようです。このコンテストは、最大の「大金」が何であるか、つまり、ソースコードへの最小の変更(1文字の追加)を伴うより詳細なエラー出力であるかを確認することです。

他の言語はより健全であるため、これはC ++およびgccバージョン4.xに限定されます。

ルール

  1. 元のソースファイルは、エラーなしでオブジェクトコードにgcc 4.9.2でコンパイルする必要があります。

  2. 1つのASCII文字がソースコードに追加され、タイプミスが発生し、ファイルサイズが1バイト増加します。

  3. コンパイラはデフォルトのオプションで実行されます。-c-std=c++11などの必要なオプションは許可されます-Wallが、などのオプションは許可されません。

  4. メトリックは

        number of bytes of generated error messages
        -----------------------------------------------------------------------
        (bytes of source code with typo) (length of filename passed to compiler)
    
  5. 回答はhttp://ideone.com/ C ++ 4.9.2 で検証されます

例:

ファイル名はa.cpp、5バイトの長さです。

int foo();

作業コンパイル

 gcc -c a.cpp

破損したソースコード:

in t foo();

失敗したコンパイル

$ gcc -c a.cpp
a.cpp:1:1: error: ‘in’ does not name a type
in t foo();
  ^
$ gcc -c a.cpp |& -c wc
64
$ wc -c a.cpp
12 a.cpp

スコア:64/12/5 = 1.0666

より良い試み:{括弧の間に挿入foo()

$ gcc -c a.cpp |& wc -c
497

新しいスコア:497/12/5 = 8.283

幸運を!

更新

再帰的な実装を無視することを人々に勧めます。技術的には勝ちますが、コンテストの精神ではありません。

更新2

多くの人が指摘しているように、Cプリプロセッサが許可されていなければ、コンテストはおそらくもっと面白かったでしょう。したがって、プリプロセッサコマンドをまったく使用しないソリューションを投稿するように人々に勧めたいと思います。これ#includeは、許可されていないため、ヘッダーファイルをまったく使用しないことを意味します。

IDEONEを使用して検証する限り、IDEONE出力を直接(およびソース名としてprog.cpp)使用することも、グローバル検索と置換(s/prog.cpp/a.cc/たとえば)を介してIDEONE出力を実行することもできます。ファイル名を直接設定します。

更新3

人々が指摘したように、Ideoneは少し制限が厳しすぎて、オブジェクトファイルの作成だけでなくリンクも必要とします。このコンテストは純粋に楽しみの名の下にあるので、正直になり、スコアの取得に使用したものを指定してください。ideoneを使用するか、gcc 4.9.2の最も標準的なビルド(すべてデフォルト)を使用できます。コンテストは、C ++エラーメッセージの恐ろしさを認識させることを目的としています。


コメントは詳細なディスカッション用ではありません。この会話はチャットに移動さました。または、重複と見なすべきかどうかに関する議論については、議論をmetaに行ってください
マーティンエンダー

ideoneを使用した検証に関する3つの問題:ソースファイル名を「prog.cpp」に強制し、コンパイラエラー出力を64kBに切り捨て、リンクして余分なエラーを追加します。したがって、それは良い検証ツールにはなりません。
ジェイソンC

ツールチェーンテストUbuntuリポジトリからGCC 4.9.2を使用しています。
nneonneo

デフォルトのオプションは何ですか?私の知る限り、コンパイル時にgccのデフォルトオプションを設定できます。
FUZxxl

2
思い出を持ち帰ります:1975年頃から、物理の先生は毎年「Fortranの10(ハンド)パンチカードからのほとんどのエラー」コンテストを開催しました...
TripeHound

回答:


45

gcc 4.5.2、スコア:8579.15(またはファイル名「aC」の場合は14367.49、後で更新される場合があります)

元のファイル、29バイト、クリーンコンパイル(a.cpp):

#if 0
#include"a.cpp"
#endif

変更されたファイル、30バイト:

#iff 0
#include"a.cpp"
#endif

エラー:

$ gcc -c a.cpp 2>&1 | wc -c
1286873

スコア:

1286873 /(30 * 5)= 8579.15

エラー出力の先頭と末尾:

a.cpp:1:2: error: invalid preprocessing directive #iff
In file included from a.cpp:2:0:
a.cpp:1:2: error: invalid preprocessing directive #iff
In file included from a.cpp:2:0,
                 from a.cpp:2:
a.cpp:1:2: error: invalid preprocessing directive #iff
In file included from a.cpp:2:0,
                 from a.cpp:2,
                 from a.cpp:2:
a.cpp:1:2: error: invalid preprocessing directive #iff
In file included from a.cpp:2:0,
                 from a.cpp:2,
                 from a.cpp:2,
                 from a.cpp:2:
a.cpp:1:2: error: invalid preprocessing directive #iff
In file included from a.cpp:2:0,
                 from a.cpp:2,
                 from a.cpp:2,
                 from a.cpp:2,
                 from a.cpp:2:
a.cpp:1:2: error: invalid preprocessing directive #iff
In file included from a.cpp:2:0,
                 from a.cpp:2,
                 from a.cpp:2,
                 from a.cpp:2,
                 from a.cpp:2,
                 from a.cpp:2:

... And so on, backing out with second error after max include depth:

a.cpp:3:2: error: #endif without #if
In file included from a.cpp:2:0,
                 from a.cpp:2,
                 from a.cpp:2,
                 from a.cpp:2,
                 from a.cpp:2:
a.cpp:3:2: error: #endif without #if
In file included from a.cpp:2:0,
                 from a.cpp:2,
                 from a.cpp:2,
                 from a.cpp:2:
a.cpp:3:2: error: #endif without #if
In file included from a.cpp:2:0,
                 from a.cpp:2,
                 from a.cpp:2:
a.cpp:3:2: error: #endif without #if
In file included from a.cpp:2:0,
                 from a.cpp:2:
a.cpp:3:2: error: #endif without #if
In file included from a.cpp:2:0:
a.cpp:3:2: error: #endif without #if
a.cpp:3:2: error: #endif without #if

注:
-場合は.C終了するまで有効な拡張子として適格その後、スコア1206869 /(28 * 3)= 14,367.49です。
-デニスが提案した2番目の#includeが追加された場合、ファイル名「a.cpp」、スコアは80,797,292,934 /(46 * 5)= 351,292,578.97


2
質問は、キャラクターを追加することであり、置き換えることではありません。
デニス

3
@デニスああ男。私はこれを得た。この2番目の編集をご覧ください。あなたのコメントは、変装した祝福でした。
ジェイソンC

1
@JasonCこれを十分に支持できません。
isaacg

9
秒を追加すれば無限のスコアを要求できると思います#include"a.cpp"
デニス

3
@デニスおっと、いいね!私は#include自分で秒を追加するつもりはなかったので、答えをそのままにしておきます。無限であるということについては...明日の朝目覚めたときにまだ動いているなら、それは私にとって十分に無限です。ヘクタール(にもかかわらず、それが現在に5.1メガバイト/秒をパイプだ、あなたが投稿し続けるwcそうであれば、wc。私の計算により、32ビットのカウンタを使用している奇妙な何かが約13分で起こるかもしれません)
ジェイソンC

31

gcc 4.9.2、スコア:222,898,664 663,393,783

これは、@ JasonCの回答に大きく基づいていますが、彼はこの改善を称賛したくないと言いました。

以下のコードのエラー出力は、126,044,818,789バイト長です。スコアは理論上ははるかに高くする必要があります(また、包含ステートメントの数が増えると無限大になる傾向があります)が、実際には包含ステートメントを追加することで減少します。

元のファイル(37バイト)

/*#
#include"w.cpp"
#include"w.cpp"*/
$ gcc -c w.cpp
$

変更されたファイル(38バイト)

/
*#
#include"w.cpp"
#include"w.cpp"*/
$ gcc -c w.cpp
w.cpp:2:2: error: stray ‘#’ in program
 *#
  ^
In file included from w.cpp:3:0:
w.cpp:2:2: error: stray ‘#’ in program
 *#
  ^
In file included from w.cpp:3:0,
                 from w.cpp:3:
w.cpp:2:2: error: stray ‘#’ in program
 *#
  ^
In file included from w.cpp:3:0,
                 from w.cpp:3,
                 from w.cpp:3:
w.cpp:2:2: error: stray ‘#’ in program
 *#
  ^
In file included from w.cpp:3:0,
                 from w.cpp:3,
                 from w.cpp:3,
                 from w.cpp:3:
⋮
w.cpp:2:2: error: stray ‘#’ in program
 *#
  ^
w.cpp:3:0: error: #include nested too deeply
 #include"w.cpp"
 ^
w.cpp:4:0: warning: extra tokens at end of #include directive
 #include"w.cpp"*/
 ^
w.cpp:4:0: error: #include nested too deeply
w.cpp:2: confused by earlier errors, bailing out
The bug is not reproducible, so it is likely a hardware or OS problem.

6
これは技術的には無限の出力を生成しませんが、現在の(または予見可能な)コンピューター技術では、停止するのを見るのに十分長く生きられません。基本的に、GCCには#include200レベルのネスト制限があるため、再帰的な#includesは事実上200ビットのバイナリカウンターになります。
イルマリカロネン

3
インクルード行を追加して、無限のスコアを取得します。出力サイズはコードよりも速く成長します。
jimmy23013

それは同様に以前の質問からの答えの1つに基づいていたかもしれませ
ピーターテイラー

2
それはやっ 8の使用を開始することをいくつかの巨大な数で、今朝終え、私は誤って番号をコピーする前に、ウィンドウを閉じて、私は素晴らしいだから、。もう一度実行しています。
ジェイソンC

3
@JasonC私もそれを実行し、77,877,399,160バイトの出力を得ました。それは予想よりずっと少ないので、短いファイル名でもう一度実行します。
デニス

25

gcc、4.9.2、スコア:22.2

元のファイル:0バイト(a.cpp)

きれいにコンパイルします:

$ gcc -c a.cpp |& wc -c
0

変更されたファイル:

(

エラー:

$ gcc -c a.cpp |& wc -c
111

スコア

111/1/5 = 22.2


4
あなたはすでにこれを総当たり攻撃しましたか?つまり、これは0バイトの開始ファイルの最高スコアですか?
トーマスウェラー

いいえ、私はこれを総当たりしませんでした。3つか4つの異なるキャラクターを試しました。これは、コンテストに興味を持たせるための単なる種の答えでした:)
マークラカタ

23

11,126.95 9,105.44 2,359.37 1,645.94 266.88ポイント

より多くのプリプロセッサ乱用!今回は、標準ライブラリを泣かせています。

タイプミスなし:

#define typedf
#include<fstream>

タイプミスあり:

#define typedef
#include<fstream>

エラー:

In file included from /usr/include/c++/4.9/iosfwd:39:0,
                 from /usr/include/c++/4.9/ios:38,
                 from /usr/include/c++/4.9/istream:38,
                 from /usr/include/c++/4.9/fstream:38,
                 from a.C:2:
/usr/include/c++/4.9/bits/stringfwd.h:62:33: error: aggregate ‘std::basic_string<char> std::string’ has incomplete type and cannot be defined
   typedef basic_string<char>    string;   
                                 ^
/usr/include/c++/4.9/bits/stringfwd.h:68:33: error: aggregate ‘std::basic_string<wchar_t> std::wstring’ has incomplete type and cannot be defined
   typedef basic_string<wchar_t> wstring;   
                                 ^
/usr/include/c++/4.9/bits/stringfwd.h:78:34: error: aggregate ‘std::basic_string<char16_t> std::u16string’ has incomplete type and cannot be defined
   typedef basic_string<char16_t> u16string; 
                                  ^
/usr/include/c++/4.9/bits/stringfwd.h:81:34: error: aggregate ‘std::basic_string<char32_t> std::u32string’ has incomplete type and cannot be defined
   typedef basic_string<char32_t> u32string; 
                                  ^
In file included from /usr/include/wchar.h:36:0,
                 from /usr/include/c++/4.9/cwchar:44,
                 from /usr/include/c++/4.9/bits/postypes.h:40,
                 from /usr/include/c++/4.9/iosfwd:40,
                 from /usr/include/c++/4.9/ios:38,
                 from /usr/include/c++/4.9/istream:38,
                 from /usr/include/c++/4.9/fstream:38,
                 from a.C:2:
/usr/include/stdio.h:48:25: error: aggregate ‘_IO_FILE FILE’ has incomplete type and cannot be defined
 typedef struct _IO_FILE FILE;
                         ^
/usr/include/stdio.h:64:25: error: aggregate ‘_IO_FILE __FILE’ has incomplete type and cannot be defined
 typedef struct _IO_FILE __FILE;
                         ^
In file included from /usr/include/c++/4.9/cwchar:44:0,
                 from /usr/include/c++/4.9/bits/postypes.h:40,
                 from /usr/include/c++/4.9/iosfwd:40,
                 from /usr/include/c++/4.9/ios:38,
                 from /usr/include/c++/4.9/istream:38,
                 from /usr/include/c++/4.9/fstream:38,
                 from a.C:2:
/usr/include/wchar.h:106:9: error: ‘__mbstate_t’ does not name a type
 typedef __mbstate_t mbstate_t;
         ^
/usr/include/wchar.h:151:38: error: ‘size_t’ is not a type
     const wchar_t *__restrict __src, size_t __n)
                                      ^
/usr/include/wchar.h:159:38: error: ‘size_t’ is not a type
     const wchar_t *__restrict __src, size_t __n)
                                      ^
/usr/include/wchar.h:166:63: error: ‘size_t’ is not a type
 extern int wcsncmp (const wchar_t *__s1, const wchar_t *__s2, size_t __n)
                                                               ^
/usr/include/wchar.h:176:4: error: ‘size_t’ is not a type
    size_t __n) __THROW;
    ^
In file included from /usr/include/wchar.h:180:0,
                 from /usr/include/c++/4.9/cwchar:44,
                 from /usr/include/c++/4.9/bits/postypes.h:40,
                 from /usr/include/c++/4.9/iosfwd:40,
                 from /usr/include/c++/4.9/ios:38,
                 from /usr/include/c++/4.9/istream:38,
                 from /usr/include/c++/4.9/fstream:38,
                 from a.C:2:
/usr/include/xlocale.h:42:9: error: ‘__locale_t’ does not name a type
 typedef __locale_t locale_t;
         ^
In file included from /usr/include/c++/4.9/cwchar:44:0,
                 from /usr/include/c++/4.9/bits/postypes.h:40,
                 from /usr/include/c++/4.9/iosfwd:40,
                 from /usr/include/c++/4.9/ios:38,
                 from /usr/include/c++/4.9/istream:38,
                 from /usr/include/c++/4.9/fstream:38,
                 from a.C:2:
/usr/include/wchar.h:183:5: error: ‘__locale_t’ is not a type
     __locale_t __loc) __THROW;
     ^
/usr/include/wchar.h:186:6: error: ‘size_t’ is not a type
      size_t __n, __locale_t __loc) __THROW;
      ^
/usr/include/wchar.h:186:18: error: ‘__locale_t’ is not a type
      size_t __n, __locale_t __loc) __THROW;
                  ^
/usr/include/wchar.h:196:8: error: ‘size_t’ does not name a type
 extern size_t wcsxfrm (wchar_t *__restrict __s1,
        ^
/usr/include/wchar.h:207:9: error: ‘__locale_t’ is not a type
         __locale_t __loc) __THROW;
         ^
/usr/include/wchar.h:212:8: error: ‘size_t’ does not name a type
 extern size_t wcsxfrm_l (wchar_t *__s1, const wchar_t *__s2,
        ^
/usr/include/wchar.h:252:8: error: ‘size_t’ does not name a type
 extern size_t wcscspn (const wchar_t *__wcs, const wchar_t *__reject)
        ^
/usr/include/wchar.h:256:8: error: ‘size_t’ does not name a type
 extern size_t wcsspn (const wchar_t *__wcs, const wchar_t *__accept)
        ^
/usr/include/wchar.h:287:8: error: ‘size_t’ does not name a type
 extern size_t wcslen (const wchar_t *__s) __THROW __attribute_pure__;
        ^
/usr/include/wchar.h:306:8: error: ‘size_t’ does not name a type
 extern size_t wcsnlen (const wchar_t *__s, size_t __maxlen)
        ^

[をちょきちょきと切る]

/usr/include/c++/4.9/bits/fstream.tcc:934:35: error: ‘cur’ is not a member of ‘std::ios_base’
    __testvalid = this->seekoff(0, ios_base::cur, _M_mode)
                                   ^
/usr/include/c++/4.9/bits/fstream.tcc:934:50: error: ‘_M_mode’ was not declared in this scope
    __testvalid = this->seekoff(0, ios_base::cur, _M_mode)
                                                  ^
/usr/include/c++/4.9/bits/fstream.tcc:941:25: error: ‘_M_state_last’ was not declared in this scope
    + _M_codecvt->length(_M_state_last, _M_ext_buf,
                         ^
/usr/include/c++/4.9/bits/fstream.tcc:944:15: error: ‘streamsize’ does not name a type
         const streamsize __remainder = _M_ext_end - _M_ext_next;
               ^
/usr/include/c++/4.9/bits/fstream.tcc:945:13: error: ‘__remainder’ was not declared in this scope
         if (__remainder)
             ^
/usr/include/c++/4.9/bits/fstream.tcc:949:35: error: ‘__remainder’ was not declared in this scope
         _M_ext_end = _M_ext_buf + __remainder;
                                   ^
/usr/include/c++/4.9/bits/fstream.tcc:951:25: error: ‘_M_state_cur’ was not declared in this scope
         _M_state_last = _M_state_cur = _M_state_beg;
                         ^
/usr/include/c++/4.9/bits/fstream.tcc:951:40: error: ‘_M_state_beg’ was not declared in this scope
         _M_state_last = _M_state_cur = _M_state_beg;
                                        ^
/usr/include/c++/4.9/bits/fstream.tcc:960:2: error: ‘_M_codecvt’ was not declared in this scope
  _M_codecvt = _M_codecvt_tmp;
  ^
/usr/include/c++/4.9/bits/fstream.tcc:960:15: error: ‘_M_codecvt_tmp’ was not declared in this scope
  _M_codecvt = _M_codecvt_tmp;
               ^
/usr/include/c++/4.9/bits/fstream.tcc:962:2: error: ‘_M_codecvt’ was not declared in this scope
  _M_codecvt = 0;
  ^

私のUbuntuマシンでg++-4.9 -std=c++11 -c a.Cは、1101568/33/3 = 11,126.95のスコアで1,101,568バイトのエラーを生成します。


7
すべてのstdヘッダーを分析し、どれ#defineが最もポイントを与えるかを判断するプログラムを作成する必要があります。
ジェイソンC

1
あなたは置き換えることによって、それをさらに悪化させることができますtypedefによってt;。これでtypedef、すべての使用を中断するだけでなく、「tは型に名前を付けていません」エラーも大量に発生します。または%;、「%トークンの前に予期されるunqualified-id」を生成します。
–MSalters

1
#define typename *そして、#define int class stdはるかにエラーを生成するように見えました。
jimmy23013

11

62.93ポイント

コンパイル済みのC ++メタブラックマジックg++-4.8 -c -std=c++11 a.cc

#include<memory>
template<int n>class B:std::unique_ptr<B<n-1>>{};template<>class B<0>{};B<-1>x;

ゴルフをしていない:

#include <memory>

template<int n>
class B: std::unique_ptr<B<n-1>> {};

template<>
class B<0> {};

B<-1>x;

G ++には900の再帰制限があるため、31ビットの範囲に変更B<1>するB<-1>と、興味深い効果が得られます。

  • 96バイトのコード(\n一部のテキストエディターが自動的に追加する最後のカウントはカウントvimしません)。
  • 4文字のファイル名、 a.cc
  • 24165バイトのエラーメッセージ、および切り捨てられます。完全なエラーメッセージには、1235889バイトのコンテンツがあります。-ftemplate-backtrace-limit=0スイッチが必要です。私にとっても3185ポイントを意味します!

std::unique_ptr 試行錯誤とSTLと猫とものの知識によって発見された最長のエラーメッセージを発行するために管理するテンプレートクラスです。


2
しかし...コードに@JasonCが3つしかない場合、どうすれば6つの空白を取り除くことができますか!
ステファノサンフィリッポ

7

スコア7.865

厳密に言えば、ideone.comはエラーなしでファイルのコンパイルを拒否するため、0バイト応答は正しくありません。同じint foo();ことが例にも当てはまります-ideone.comでコンパイルされません(評判がないためコメントできません...)

したがって、コンパイルせずにコンパイルできる最小のプログラム#includesは次のとおりです。

int main(){}

これを次のコードに変更すると、409バイトのエラーコードで失敗します(ideone.com出力からprog.cppをa.ccに名前変更した後)。

int main(){[}

409 /(13 * 4)= 7.865

与えられた例は与えられたルールを尊重しないので、それに応じて質問を更新してください...


1
理想的なのは、あらゆる種類の間抜けなことです。
ジェイソンC

質問が投稿され、最初の回答が出された、私は同意し、イデオン規則に取り組みました。猫は今や袋から出てきました。
マークラカタ

1

C、という名前 .cc

main(){constexprs a(){*(int*)0=f;}a(0)}

エラーコード:

.code.tio.cpp: In function ‘int main()’:
.code.tio.cpp:1:8: error: ‘constexprs’ was not declared in this scope
 main(){constexprs int a(f){*(int*)0=f;}a(0);}
        ^~~~~~~~~~
.code.tio.cpp:1:8: note: suggested alternative: ‘__cpp_constexpr’
 main(){constexprs int a(f){*(int*)0=f;}a(0);}
        ^~~~~~~~~~
        __cpp_constexpr
.code.tio.cpp:1:40: error: ‘a’ was not declared in this scope
 main(){constexprs int a(f){*(int*)0=f;}a(0);}

また会いましたね!エラーのない元のプログラムは何ですか?(私はそれがmain(){}であると仮定しますが、確信はありません)また、これは上記の答えの単なる改善ではありませんか?確かにこの答えを保持することはできますが、@ StefanMの答えに触発された場合は、それについて言及する必要があります。最後に、50人の担当者がいるので、どこにでもコメントできます。
-NoOneIsHere

これはステファンMの答えに近すぎると思います。このソリューションの推奨される改善策としてこれを投稿します。つまり、重複した回答は許可されます。ただし、ここにオリジナルを入れて、インスピレーションに言及してください(独自にこれを思いついた可能性もあります)
-HyperNeutrino

1

スコア12.xx(キャラクターの削除によるエラー)

ルール2(IMHOの1文字の追加または削除はルールの精神に反する)を破ることを許してください-動作中のコードとエラーの原因となるコードはどちらもシンプルでわかりやすいので、ここに含めるのに十分だと思いました。元のコード

#include <iostream>
using namespace std;
int main ()
{
cout<<"test"<<endl;
}

エラーを生成するコード(最後の '<'は削除されたため、比較よりも小さいように見えますが、noooooooooooo ...)

#include <iostream>
using namespace std;
int main ()
{
cout<<"test"<endl;
}

これは、ideone.com g ++ 4.3.2の「唯一」の8241バイトのコンパイラエラーメッセージです。


1
それは挑戦の精神であると思われる場合であっても(タイトルは「1つの文字タイプミス」と言うので)、これはあなたが唯一できることを言うルール2従わない追加、文字を削除または変更しません。
ジョーキング
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.