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


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
Просто отримайте компілятор російською чи німецькою мовами, ви отримаєте деякі тривалі помилки (каламбур не призначений)
ζ--

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 ⁰⁰ рази, один раз за кожен можливий шлях, по якому можна досягти межі введення. Той факт, що кожна помилка включає також 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 символів - Score = (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 взагалі.
якD

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, це жарт. Якщо це не було очевидно.
стенд

10

С, .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 попередження
Кевін

Я гадаю, ти маєш рацію. Я рахував рядки "помилка:" та "попередження:".
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

Безголовки:

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

УсмішкаBASIC, 1/1 = 1

A

Породжує помилку Syntax Error in 0:1


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