Wydaje się, że proste zmiany w pliku C ++, szczególnie w szablonach, mogą generować strony błędów. Ten konkurs ma na celu przekonanie się, jaki jest największy „huk złotówki”, czyli bardziej szczegółowy komunikat o błędzie przy najmniejszej zmianie w kodzie źródłowym (dodanie 1 znaku).
Ponieważ inne języki są bardziej rozsądne, będzie to ograniczone do C ++ i gcc w wersji 4.x.
Zasady
Oryginalny plik źródłowy musi zostać skompilowany z gcc 4.9.2, aby kod obiektu mógł zostać bezbłędnie.
Jeden znak ASCII jest dodawany do kodu źródłowego, aby utworzyć literówkę, zwiększając rozmiar pliku o 1 bajt.
Kompilator jest uruchamiany z domyślnymi opcjami. Niezbędne opcje jak
-c
i-std=c++11
są dozwolone, opcje jak-Wall
nie są.Metryka to
number of bytes of generated error messages ----------------------------------------------------------------------- (bytes of source code with typo) (length of filename passed to compiler)
Odpowiedzi zostaną zweryfikowane za pomocą http://ideone.com/ C ++ 4.9.2.
Przykład:
Nazwa pliku to a.cpp
5 bajtów.
int foo();
Kompilacja robocza
gcc -c a.cpp
Uszkodzony kod źródłowy:
in t foo();
Niepowodzenie kompilacji
$ 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
Wynik: 64/12/5 = 1,0666
Lepsza próba: wstaw {
pomiędzy parens zfoo()
$ gcc -c a.cpp |& wc -c
497
Nowy wynik: 497/12/5 = 8,283
Powodzenia!
AKTUALIZACJA
Zachęcam ludzi do ignorowania rekurencyjnej implementacji. To technicznie wygrywa, ale nie jest zgodne z duchem konkursu.
AKTUALIZACJA 2
Jak zauważyło wiele osób, konkurs byłby prawdopodobnie bardziej interesujący, gdyby wstępny procesor C nie był dozwolony. Chciałbym więc zachęcić ludzi do publikowania rozwiązań, które w ogóle nie używają poleceń procesora wstępnego. Oznacza to, że nie można w ogóle używać plików nagłówkowych, ponieważ #include
jest to zabronione!
O ile używasz IDEONE do sprawdzania poprawności, możesz albo użyć wyjścia IDEONE bezpośrednio (i nazwy źródła jako prog.cpp
), albo możesz uruchomić wyjście IDEONE poprzez wyszukiwanie globalne i zastąpić ( s/prog.cpp/a.cc/
na przykład) i udawać, że byłeś w stanie ustaw nazwę pliku bezpośrednio.
AKTUALIZACJA 3
Jak zauważyli ludzie, Ideone jest trochę zbyt restrykcyjny, wymagający łączenia nie tylko tworzenia plików obiektowych. Ponieważ konkurs ten ma na celu wyłącznie zabawę, bądź szczery i określ, czego użyłeś, aby uzyskać swój wynik. Użyj ideone lub użyj najbardziej waniliowej wersji (wszystkie domyślne) gcc 4.9.2, jak tylko możesz. Konkurs ma na celu uświadomienie okropności komunikatów o błędach C ++.
źródło
Odpowiedzi:
gcc 4.5.2, wynik: 8579.15 (lub 14367.49 dla nazwy pliku „aC”, może zaktualizować później)
Plik oryginalny, 29 bajtów, kompiluje w czystości (a.cpp):
Zmodyfikowany plik, 30 bajtów:
Błędy:
Wynik:
1286873 / (30 * 5) = 8579.15
Głowa i ogon wyjścia błędu:
Uwaga:
- Jeśli
.C
kończy się zaliczające się prawidłowym rozszerzeniem następnie wynik 1.206.869 / (28 * 3) = 14,367.49 .- Jeśli zostanie dodany sugerowany przez Dennisa drugi #include, nazwa pliku „a.cpp”, wynik to 80 797,292,934 / (46 * 5) = 351 292 5278.97
źródło
#include"a.cpp"
.#include
na własną rękę. Jeśli chodzi o to, że jest nieskończony ... jeśli nadal działa, kiedy budzę się jutro rano, jest dla mnie wystarczająco nieskończony. Będę cię informować, ha (chociaż obecnie przesyła z prędkością 5,1 MB / s dowc
, więc jeśliwc
używa 32-bitowego licznika, według moich obliczeń coś dziwnego może się wydarzyć za około 13 minut.)gcc 4.9.2, wynik:
222898664663,393,783Jest to w dużej mierze oparte na odpowiedzi @ JasonC , ale powiedział, że nie chce przypisywać sobie tej poprawy.
Dane wyjściowe błędu w poniższym kodzie mają długość 126 044,818,789 bajtów. Punktacja powinna być znacznie wyższa w teorii (i dążyć do nieskończoności wraz ze wzrostem liczby instrukcji dołączania), ale zmniejsza się w praktyce poprzez dodanie większej liczby instrukcji dołączania.
Oryginalny plik (37 bajtów)
Zmodyfikowany plik (38 bajtów)
źródło
#include
limit zagnieżdżania wynoszący 200 poziomów, więc Twoje rekurencyjne#include
skutecznie stają się 200-bitowym licznikiem binarnym.gcc, 4.9.2, wynik: 22,2
Plik oryginalny: 0 bajtów (a.cpp)
Kompiluje czyste:
Zmodyfikowany plik:
Błędy:
Wynik
111/1/5 = 22,2
źródło
11
126,959105,44 2359,37 1644,94266,88punktówWięcej nadużyć preprocesorów! Tym razem płaczemy ze standardowej biblioteki.
Bez literówki:
Z literówką:
Błędy:
[FANTASTYCZNA OKAZJA]
Na mojej maszynie Ubuntu
g++-4.9 -std=c++11 -c a.C
generuje 1 1015 68 chwalebnych bajtów błędów, co daje wynik 1101568/33/3 = 11 126,95.źródło
#define
daje najwięcej punktów.typedef
przezt;
. Teraz nie tylko przerywasz każde użycie,typedef
ale dostajesz również mnóstwo błędów „t nie nazywa typu”. Lub%;
wygenerować „oczekiwany identyfikator niekwalifikowany przed% tokenem”.#define typename *
i#define int class std
wydawało się, że generuje znacznie więcej błędów.62,93 punktów
Tylko trochę czarnej magii C ++, skompilowanej z
g++-4.8 -c -std=c++11 a.cc
:Nie golfowany:
G ++ ma limit rekurencji wynoszący 900, więc zmiana
B<1>
naB<-1>
zakres 31-bitowy ma ... interesujący efekt.\n
niektóre edytory tekstu automatycznie dodają,vim
nie robią).a.cc
-ftemplate-backtrace-limit=0
przełącznika. Oznaczałoby to również dla mnie 3185 punktów!std::unique_ptr
to tylko klasa szablonów, która zdoła wydać najdłuższy komunikat o błędzie, znaleziony metodą prób i błędów oraz znajomością STL oraz kotów i innych rzeczy.źródło
Wynik 7,865
Ściśle mówiąc, 0-bajtowa odpowiedź NIE jest poprawna, ponieważ ideone.com odmówi skompilowania pliku bez błędu. To samo dotyczy przykładu
int foo();
- nie skompiluje się na ideone.com (nie mogę komentować z powodu braku reputacji ...)Najmniejszy możliwy program do kompilacji bez żadnego
#includes
jest następujący:Jeśli zmienisz to na następujący kod, błąd 409 bajtów kodu błędu (po zmianie nazwy prog.cpp na a.cc z danych wyjściowych ideone.com):
409 / (13 * 4) = 7,865
Zaktualizuj odpowiednio pytanie, ponieważ podane przykłady nie są zgodne z podanymi zasadami ...
źródło
C, nazwany jako
.cc
Kod błędu:
źródło
main(){}
, ale nie jestem pewien). Czy to nie jest tylko poprawa powyższej odpowiedzi? Chociaż z pewnością możesz zachować tę odpowiedź, jeśli była inspirowana odpowiedzią @ StefanM, powinieneś o tym wspomnieć. Wreszcie, mając 50 powtórzeń, możesz komentować w dowolnym miejscu.Ocena 12.xx (błąd przez USUWANIE znaku)
Proszę wybaczyć złamanie Reguły 2 (dodanie przez IMHO LUB usunięcie jednej postaci byłoby zgodne z duchem tej reguły), ale stało mi się to przypadkowo (dlatego nie używa żadnych „celowo” obraźliwych sztuczek) podczas pisania Real Code (TM) - zarówno działający, jak i powodujący błędy kod są (lub wyglądają) proste i zrozumiałe, więc pomyślałem, że to wystarczająco fajne, aby dołączyć tutaj. Oryginalny kod
Kod generujący błąd (ostatnie „<” zostało usunięte, więc wygląda na mniej niż porównanie, ale noooooooooooo ...)
To „tylko” 8241 bajtów komunikatów o błędach kompilatora w ideone.com g ++ 4.3.2.
źródło