1个字符的拼写错误,从C ++编译生成大多数错误消息


51

似乎简单地更改C ++文件(尤其是使用模板)会产生错误页面。这场比赛的目的是要了解最大的“价格便宜”,即输出错误最少,对源代码的更改最少(添加1个字符)。

因为其他语言更加理智,所以这将限于C ++和gcc版本4.x。

规则

  1. 原始源文件必须使用gcc 4.9.2编译为目标代码,且没有错误。

  2. 将一个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),也可以通过全局搜索运行IDEONE输出并替换(s/prog.cpp/a.cc/例如)并假装您能够直接设置文件名。

更新3

正如人们指出的那样,Ideone的限制有点太严格,不仅需要创建目标文件,还需要链接。由于本次比赛纯粹是出于娱乐的目的,因此请诚实地说,并指定您用来获得分数的方式。可以使用ideone,也可以使用gcc 4.9.2的最原始版本(所有默认设置)。竞赛旨在使人们意识到C ++错误消息的严重性。


评论不作进一步讨论;此对话已转移至聊天。另外,对于有关什么应该或不应该视为重复项的讨论,请将讨论转到meta
马丁·恩德

使用ideone进行验证的三个问题:强制将源文件名设置为“ prog.cpp”,将编译器错误输出截断为64kB,然后链接,从而增加了其他错误。因此,它不是一个好的验证工具。
杰森C

我一直在工具链测试Ubuntu仓库中使用GCC 4.9.2。
nneonneo 2015年

什么是默认选项?据我所知,您可以在编译时配置gcc的默认选项。
FUZxxl

2
回忆:从1975年左右开始,我们的物理老师每年进行一次“来自Fortran的10张(手工)打孔卡的最大错误”竞赛
TripeHound 2015年

Answers:


45

gcc 4.5.2,得分:8577.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最终有资格获得有效的扩展名,则得分为1,206,869 /(28 * 3)= 14,367.49。
-如果添加了丹尼斯建议的第二个#include,则文件名为“ a.cpp”,得分为80,797,292,934 /(46 * 5)= 351,292,578.97


2
问题是添加一个字符,而不是替换它。
丹尼斯

3
@丹尼斯哦,老兄。我懂了。观看第二个编辑。您的评论是因祸得福。
杰森C

1
@JasonC我不能投票足够多次。
isaacg 2015年

9
我认为,如果再增加一秒,您可以要求无限的分数#include"a.cpp"
丹尼斯

3
@丹尼斯·哇,太好了!我将按原样保留答案,因为我不认为自己增加第二个答案#include。至于它是无限的...如果明天早晨我醒来时它仍在运行,对我来说就足够了。哈哈(尽管它目前正在以5.1MB /秒的速度传输wc,所以,如果wc使用32位计数器,根据我的计算,大约13分钟内可能会发生一些奇怪的变化。)
Jason C

31

GCC 4.9.2,得分:222898664 663393783

这很大程度上是基于@JasonC的答案,但他说他不想因为这项改进而功劳。

下面的代码的错误输出是126,044,818,789字节长。该分数在理论上应该高得多(并且随着include语句数量的增加,趋于无穷大),但实际上,通过添加更多include语句,分数会降低。

原始文件(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的#include嵌套限制为200级,因此您的递归#includes有效地变成了200位二进制计数器。
Ilmari Karonen

3
只需添加更多包含行即可获得无限分。输出大小的增长速度快于代码。
jimmy23013 2015年

同样,它也可以基于先前问题的答案之一
彼得·泰勒

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字节起始文件的最高分吗?
Thomas Weller 2015年

不,我没有蛮力。我只尝试了3个或4个不同的字符。这只是让人们对比赛感兴趣的种子答案:)
Mark Lakata 2015年

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)
        ^

[SNIP]

/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个光荣字节的错误,得分为1101568/33/3 = 11,126.95。


7
您应该编写一个程序来分析所有std标头,并确定哪个#define给您最多的分数。
杰森C

1
您可以将替换typedef为来进一步恶化它t;。现在,您不仅中断了对的所有使用,typedef而且还收到大量的“ t不命名类型”错误。或%;产生“%令牌之前的预期的不合格ID”。
MSalters 2015年

1
#define typename *并且#define int class std似乎会产生更多错误。
jimmy23013 2015年

11

62.93点

只是一些C ++ meta black magic,使用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,因此将其更改B<1>B<-1>31位范围会产生有趣的效果。

  • 96字节的代码(不算最后的\n一些文本编辑器会自动添加,vim没有)。
  • 4个字母的文件名, a.cc
  • 错误消息为24165字节,并且被截断了。完整的错误消息具有惊人的1235889字节的内容。这将需要-ftemplate-backtrace-limit=0开关。对我来说,这也意味着3185分!

std::unique_ptr 只是设法发出最长错误消息的模板类,它是通过反复试验以及对STL,猫和猫的知识而发现的。


2
但是...当代码中只有3个@JasonC时,如何摆脱6个空格!
Stefano Sanfilippo

7

得分7.865

严格来说,0字节的答案是不正确的,因为ideone.com将拒绝编译文件而不会出现错误。该示例也是如此int foo();-无法在ideone.com上编译(由于缺少声誉,我无法发表评论...)

因此,无需任何编译即可最小的程序#includes是:

int main(){}

如果将其更改为以下代码,它将失败,并显示409个字节的错误代码(在从ideone.com输出中将prog.cpp重命名为a.cc之后):

int main(){[}

409 /(13 * 4)= 7.865

请相应地更新问题,因为给出的示例不遵守给定的规则...


1
整个ideone事情是各种各样的愚蠢的事情。
杰森C

我同意,在问题发布并给出第一个答案,我坚持使用ideone规则。猫现在有点没钱了。
Mark Lakata

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个代表,则可以在任何地方发表评论。
NoOneIsHere17年

我认为这与Stefan M.的答案太接近了;我会将其发布为该解决方案的建议改进。话虽如此,重复的答案是允许的。请不要将原件放在这里,并提及任何灵感(尽管也有可能独立提出)
HyperNeutrino

1

得分12.xx(删除字符会出错)

请原谅规则2的违反(恕我直言,按照规则的精神添加或删除一个字符),但这是我偶然发生的(因此,没有使用任何“故意的”辱骂性技巧),同时编写了Real Code(TM) -工作代码和导致错误的代码都很简单明了,所以我认为它很整洁,可以包含在这里。原始码

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

产生错误的代码(最后一个'<'已删除,因此看起来像是小于比较,但不行...)

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

在ideone.com g ++ 4.3.2中,它仅是8241字节的编译器错误消息。


1
即使看起来像是挑战的精神(因为标题说“一个字符的拼写错误”),这也不符合规则2的规定,规则2只能添加一个字符,不能删除或更改。
Jo King
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.