Il semble que de simples modifications apportées à un fichier C ++, en particulier avec des modèles, peuvent générer des pages d'erreur. Ce concours a pour but de voir quel est le plus gros "bang of the buck", c’est-à-dire la sortie d’erreur la plus prolixe entraînant la moindre modification du code source (ajout de 1 caractère).
Etant donné que les autres langages sont plus sains, cela sera limité à C ++ et à la version 4.x de gcc.
Règles
Le fichier source original doit être compilé avec gcc 4.9.2 pour code objet sans erreur.
Un caractère ASCII est ajouté au code source pour créer une faute de frappe, ce qui augmente la taille du fichier d'un octet.
Le compilateur est exécuté avec les options par défaut. Les options nécessaires telles que
-c
et-std=c++11
sont autorisées, les options telles que-Wall
ne le sont pas.La métrique est
number of bytes of generated error messages ----------------------------------------------------------------------- (bytes of source code with typo) (length of filename passed to compiler)
Les réponses seront validées avec http://ideone.com/ C ++ 4.9.2.
Exemple:
Le nom de fichier est a.cpp
, ce qui fait 5 octets de long.
int foo();
Compilation de travail
gcc -c a.cpp
Code source corrompu:
in t foo();
Échec de la compilation
$ 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
Score: 64/12/5 = 1.0666
Meilleure tentative: insérer {
entre parens defoo()
$ gcc -c a.cpp |& wc -c
497
Nouveau score: 497/12/5 = 8.283
Bonne chance!
MISE À JOUR
J'encourage les gens à ignorer la mise en œuvre récursive. Techniquement, cela gagne mais n’est pas dans l’esprit du concours.
MISE À JOUR 2
Comme beaucoup de personnes l’ont noté, le concours aurait probablement été plus intéressant si le pré-processeur C n’était pas autorisé. Je voudrais donc encourager les gens à publier des solutions qui n'utilisent pas du tout les commandes de pré-processeur. Cela n'implique aucune utilisation des fichiers d'en-tête, car ce #include
n'est pas autorisé!
Pour ce qui est d’utiliser IDEONE pour valider, vous êtes autorisé à utiliser directement la sortie IDEONE (et le nom de source en tant que prog.cpp
), ou vous pouvez exécuter la sortie IDEONE via une recherche et un remplacement globaux ( s/prog.cpp/a.cc/
par exemple) et prétendre que vous avez pu: définir le nom du fichier directement.
MISE À JOUR 3
Comme les gens l'ont souligné, Ideone est un peu trop restrictif et requiert des liens, pas seulement la création de fichiers objets. Comme ce concours est purement amusant, soyez honnête et précisez ce que vous avez utilisé pour obtenir votre score. Vous pouvez soit utiliser ideone, soit utiliser la version la plus généreuse (toutes les valeurs par défaut) de gcc 4.9.2, comme vous le pouvez. Le concours a pour but de faire prendre conscience de l’atrocité des messages d’erreur C ++.
la source
Réponses:
gcc 4.5.2, score: 8579.15 (ou 14367.49 pour le nom de fichier "aC", pourra éventuellement être mise à jour ultérieurement)
Le fichier original, 29 octets, compile proprement (a.cpp):
Fichier modifié, 30 octets:
Les erreurs:
But:
1286873 / (30 * 5) = 8579,15
Tête et queue de la sortie d'erreur:
Remarque:
- Si vous
.C
vous qualifiez comme extension valide, le score est de 1 206 869 / (28 * 3) = 14 367,49.- Si le second #include suggéré par Dennis est ajouté, nom de fichier "a.cpp", le score est de 80 797 292 934 / (46 * 5) = 351 292 578,97
la source
#include"a.cpp"
.#include
moi-même. Pour ce qui est de l'infini ... si ça fonctionne toujours quand je me lève demain matin, c'est assez infini pour moi. Je vous tiendrai au courant, ha (même si, actuellement, il passe à 5,1 Mo / swc
. Siwc
un compteur 32 bits est utilisé, il se peut que quelque chose de bizarre se produise en 13 minutes environ.)gcc 4,9,2, score:
222898664663393783Ceci est largement basé sur la réponse de @ JasonC , mais il a déclaré qu'il ne voulait pas se vanter de cette amélioration.
La sortie d'erreur du code ci-dessous a une longueur de 126 044 818 789 octets. Le score devrait être beaucoup plus élevé en théorie (et tendre vers l'infini à mesure que le nombre d'énoncés d'inclusion augmente), mais il diminue dans la pratique en ajoutant d'autres énoncés d'inclusion.
Fichier d'origine (37 octets)
Fichier modifié (38 octets)
la source
#include
limite d'imbrication de 200 niveaux, de sorte que votre récursif#include
devient efficacement un compteur binaire de 200 bits.gcc, 4.9.2, note: 22.2
Fichier d'origine: 0 octet (a.cpp)
Compile propre:
Fichier modifié:
Les erreurs:
But
111/1/5 = 22,2
la source
11
126,959,105,442,359,371645,94266,88pointsPlus d'abus de préprocesseur! Cette fois, nous faisons pleurer la bibliothèque standard.
Sans faute de frappe:
Avec une faute de frappe:
Les erreurs:
[COUPER]
Sur ma machine Ubuntu,
g++-4.9 -std=c++11 -c a.C
génère 1 101 568 octets d’erreurs glorieuses, pour un score de 1101568/33/3 = 11 126,95.la source
#define
vous donne le plus de points.typedef
part;
. Maintenant, non seulement vous cassez chaque utilisation detypedef
mais vous obtenez une tonne d'erreurs "t ne nomme pas de type". Ou%;
pour produire "id-non attendu attendu avant le jeton%".#define typename *
et#define int class std
semblait générer beaucoup plus d'erreurs.62.93 points
Juste de la magie noire méta C ++, compilée avec
g++-4.8 -c -std=c++11 a.cc
:Ungolfed:
G ++ a une limite de récursivité de 900. Le passage
B<1>
àB<-1>
une plage de 31 bits a donc un effet intéressant.\n
, ajoutent automatiquement certains éditeurs de texte,vim
ne le font pas).a.cc
-ftemplate-backtrace-limit=0
changement. Cela signifierait également 3185 points pour moi!std::unique_ptr
est simplement la classe de modèle qui parvient à émettre le message d'erreur le plus long, détecté par essais et erreurs et par la connaissance de la STL et des chats, etc.la source
Score 7.865
À strictement parler, la réponse de 0 octet n'est PAS correcte, car ideone.com refusera de compiler le fichier sans erreur. La même chose est vraie avec l'exemple
int foo();
- il ne compilera pas sur ideone.com (je ne peux pas commenter à cause de la réputation manquante ...)Donc, le plus petit programme possible à compiler sans aucun
#includes
est celui-ci:Si vous modifiez cela en code suivant, il échouera avec 409 octets de code d'erreur (après avoir renommé prog.cpp en a.cc à partir de la sortie de ideone.com):
409 / (13 * 4) = 7,865
Veuillez mettre à jour la question en conséquence, car les exemples donnés ne respectent pas les règles données ...
la source
C, nommé comme
.cc
Code d'erreur:
la source
main(){}
, mais je ne suis pas sûr) En outre, n'est-ce pas simplement une amélioration de la réponse ci-dessus? Bien que vous puissiez certainement garder cette réponse, si elle était inspirée par celle de @ StefanM, vous devriez le mentionner. Enfin, maintenant que vous avez 50 représentants, vous pouvez commenter n'importe où.Score 12.xx (erreur en effaçant un caractère)
S'il vous plaît pardonnez la violation de la règle 2 (IMHO ajouter OU supprimer un caractère serait dans l'esprit de la règle), mais cela m'est arrivé accidentellement (n'utilise donc pas de ruse "intentionnellement" abusive) lors de l'écriture de Real Code (TM) - le code de travail et le code source d’erreurs sont (ou ont l’air) simples et directs, j’ai donc pensé que c’était assez élégant pour les inclure ici. Code d'origine
Code générant l'erreur (le dernier '<' a été supprimé, ce qui ressemble à une comparaison inférieure à, mais noooooooooooo ...)
Il ne s'agit que de 8241 octets de messages d'erreur du compilateur dans ideone.com g ++ 4.3.2.
la source