Напишите самую короткую программу, которая генерирует большинство предупреждений и ошибок компилятора


42

Соревнование:

Напишите очень короткую программу, которая при компиляции создает наибольшее количество предупреждений и ошибок компилятора. Это может быть написано на любом языке программирования.

Подсчет очков:

Оценка определяется этим уравнением: errors_and_warnings_length/code_length. Самый высокий балл выигрывает.

Пример:

Программа на C # classимеет длину 5 символов и генерирует 3 предупреждения, что составляет оценку (1/5) * 3 = 0,6.

РЕДАКТИРОВАТЬ:

Из-за некоторой путаницы программы должны иметь длину не менее 1 символа. Иначе это получило бы счет бесконечности.


17
В то время как мне нравится концепция, я нахожу метрику немного тревожной. Какой компилятор? Какие настройки (особенно в отношении предупреждений)? Я имею в виду, gcc -Wall -pedanticчто сильно отличается от обычного, gccотличается от tccпредположительно другого компилятора c.
dmckee

2
Просто получите компилятор на русском или немецком языке, вы получите несколько длинных ошибок (без каламбура)
ζ--

2
Я хотел бы видеть ответы на языках, отличных от C / C ++.
Кен Блум

4
Мне бы понравилось, если бы задача заключалась в том, чтобы генерировать как можно больше разных ошибок
Ханнеш

3
Гм. В противном случае его оценка будет неопределенной .
wizzwizz4

Ответы:


94

НКУ, оценка 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 ошибкой («вложенной слишком глубоко»), а не отдельной ошибкой для каждой строки следа.
Кевин

1
@Kevin: Просто чтобы прояснить ситуацию, она должна выдавать эту ошибку 2–2 раза, по одному разу для каждого возможного пути, по которому может быть достигнут предел вложенности. Тот факт, что каждая ошибка также включает в себя 200 строк обратной трассировки, просто делает вывод еще более подробным.
Ильмари Каронен

1
Хм. Я мог поклясться, когда пытался сделать это вчера вечером, gcc выпустил залог после 1 ошибки, но теперь он печатает больше. Возражение снято. Кстати, это 200 от стандарта c?
Кевин

1
@Kevin Per gcc.gnu.org/onlinedocs/gcc-4.8.2/cpp/Implementation-limits.html : «Мы устанавливаем произвольный предел в 200 уровней [вложенных #include], чтобы избежать убегающей рекурсии. Стандарт требует как минимум 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 не определено, а не "бесконечность".
Фрэнк

3
+1 Даже если 1/0 не определено, оно явно больше единицы, деленной на большее число. 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}

Конечно, это можно продлить произвольно. Например, использование 10 #defineс вместо 5 и длительность 20 «вызовов» вместо 10 приведет к значению около (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,5 млн. против 760 тыс.), но /vmlinuzна 5,6 млн. может быть вашим лучшим выбором.
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

С, 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 droog

5
Я думаю, что вы выиграете, если мы только посчитаем разные ошибки / предупреждения.
Угорен

Если -Werror используется в командной строке, предупреждения превращаются в ошибки. А также то, какой используемый компилятор C будет влиять на число сообщаемых ошибок (или если -Werror доступен и т. Д.) Можно утверждать, что длина командной строки для вызова может считаться частью длины «программы» ... и каждый Версия компилятора на каждой платформе является отдельной категорией. :-)
Доктор Ребму

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

Ungolfed:

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, содержащий две копии 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 запись ошибки не очень конкурентоспособна. Возможно, мой ответ должен быть перенесен сюда
Расчет орехов

-1

SmileBASIC, 1/1 = 1

A

Генерирует ошибку Syntax Error in 0:1


SB только генерирует одну ошибку за раз, так что это действительно единственный ответ, который вы можете сделать.
улитка
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.