Trouver une chaîne illégale


81

Le défi consiste à trouver une chaîne de caractères qui ne peut apparaître dans aucun programme légal dans le langage de programmation de votre choix. Cela inclut les commentaires, les chaînes ou d’autres parties "non exécutables".

Défi

  • Votre programme peut être spécifique à une version ou à une implémentation particulière de l'environnement de compilation / interpréteur / exécution de votre langage. Si oui, veuillez préciser les détails.
  • Seules les options standard du compilateur / interprète / runtime sont autorisées. Vous ne pouvez pas transmettre un indicateur étrange à votre compilateur pour obtenir un résultat spécifique (par exemple, passer un indicateur pour convertir les avertissements en erreurs).
  • Si votre langage de programmation nécessite un codage spécifique (par exemple, UTF-8), votre chaîne doit également être correctement codée (c.-à-d. Que les chaînes qui échouent uniquement en raison d'erreurs de décodage de caractères ne sont pas autorisées).
  • Chaque caractère individuel dans votre soumission doit être admissible dans un programme juridique; c'est-à-dire que vous ne pouvez pas simplement utiliser un personnage qui est toujours rejeté.
  • Le compilateur / interprète / runtime doit donner une erreur à tout code source contenant votre chaîne en tant que sous-chaîne. L'erreur ne doit pas nécessairement être la même pour tous les programmes - une incorporation de votre chaîne peut provoquer une erreur de syntaxe, tandis qu'une autre peut provoquer une erreur d'exécution.

Notation

  • La chaîne illégale la plus courte pour chaque langue gagne.
  • Vous devez expliquer pourquoi votre chaîne est illégale (pourquoi elle ne peut apparaître nulle part dans un programme légal).
  • Contester les solutions incorrectes dans les commentaires. Plus spécifiquement, vous devez fournir un lien vers TIO ou équivalent, démontrant un programme juridique (c'est-à-dire ne générant aucune erreur) contenant la sous-chaîne proposée.
  • Certaines langues (par exemple, Bash, Batch, Perl) permettent d’ajouter des données binaires arbitraires à un programme sans affecter la validité (par exemple, l’utilisation __DATA__de Perl). Pour ces langues, vous pouvez soumettre une solution qui ne peut apparaître que dans une telle section de fin. Assurez-vous de noter cela dans votre réponse. (La définition de cette "section finale" dépend de la langue, mais signifie généralement tout texte après que l'analyseur ait complètement arrêté de lire le script).

Exemple

En Python, je pourrais soumettre

x
"""
'''

mais cela peut être intégré dans le programme plus large

"""
x
"""
'''
y
'''

donc ce n'est pas admissible.


2
Un contre-exemple peut-il s'appuyer sur l'entrée de STDIN?
Zacharý

5
Cela ferait-il un bon CnR?
CalculatriceFeline

2
Trop tard maintenant, je suppose, mais il semble que cela aurait pu être un défi pour les flics et les voleurs. Il y a beaucoup d'habileté évidente dans les tentatives pour rendre des programmes valides, ainsi que pour trouver les ficelles en premier lieu.
user2390246

4
Mes condoléances aux tentatives Perl. :)
Kaz

2
Je suis presque sûr que c'est complètement impossible en haskell analphabète, grâce aux commentaires imbriqués.
dfeuer

Réponses:


57

Changeling , 2 octets




C'est deux linefeeds. Un fichier de conversion valide doit toujours former un carré parfait de caractères ASCII imprimables, de sorte qu'il ne puisse pas contenir deux sauts de ligne à la suite.

L'erreur est toujours une erreur de l'analyseur et toujours la même:

This shape is unpleasant.

accompagné du code de sortie 1 .

Essayez-le en ligne!


Cela fonctionne aussi avec 2Col . Essayez-le en ligne! . Mais la raison pour laquelle ceci se casse dans 2Col est que chaque ligne doit comporter exactement 2 caractères, mais la ligne vide le casse.
Kritixi Lithos

2
+1 car c'est automatiquement le gagnant, car les solutions à 1 octet ne sont pas autorisées car "vous ne pouvez pas simplement utiliser un caractère qui est toujours rejeté".
Zacharý

1
@Cowsquack tfw J'ai oublié ma propre langue
Skidsdev le

1
@ Skidsdev tfw J'ai de nouveau oublié ma propre langue, et j'ai oublié de ma propre langue
Skidsdev

@ Zacharý Qu'en est-il des solutions à 0 octet?
PyRulez

32

Java, 4 octets

;\u;

Essayez-le en ligne!

Ceci est une séquence d'échappement Unicode non valide et entraînera une erreur dans le compilateur.

error: illegal unicode escape

Ne fonctionne pas - on pourrait avoir un littéral de chaîne comme "\\u;".
Feersum

@feersum Fixe au prix d'un octet
Kritixi Lithos

21
@TheLethalCoder: Java pré-traite le code source afin de modifier les \uXXXXfuites avant de faire quoi que ce soit d' autre, alors oui, cela fonctionnera même dans comments.za
nneonneo

3
Je pense que c'est toujours la réponse la plus courte sur Java de l'histoire de ce site.
Urne Magique Octopus

1
@MagicOctopusUrn En fait, il y a cette réponse Java à 0 octets (qui n'est plus pertinente dans la méta en cours, car elle sort en STDERR au lieu de STDOUT). Bien que les deux soient assez étonnants et intelligents. :)
Kevin Cruijssen

25

COBOL (GNU) , 8 octets


THEGAME

Tout d'abord, un saut de ligne pour vous empêcher de mettre ma parole dans une ligne commentée.

Ensuite, historiquement, les programmes COBOL étaient imprimés sur des feuilles de codage, le compilateur s’appuyait fortement sur des lignes limitées à 80 caractères, il n’existait pas de commentaires multilignes et les 6 premiers caractères étaient des commentaires (souvent utilisés comme numéros de ligne modifiables). , AUTANT QUE JE SACHE. J'ai choisi THEGAMau début de la ligne suivante.

Ensuite, le 7ème symbole d'une ligne n'accepte qu'une liste de caractères très restreinte: Espace (pas d'effet), Asterisk (commente le reste de la ligne), Trait d'union, Slash, il peut y en avoir d'autres, mais certainement pas E.

L'erreur donnée par GnuCobol, par exemple, est:

error: invalid indicator 'E' at column 7

Essayez-le en ligne!

En outre, vous venez de perdre la partie.


30
Also, you just lost the game.J'ai presque voté
Stephen

24

JavaScript, 7 octets


;*/\u)

Notez la nouvelle ligne principale.

  • \u) est une séquence d'échappement Unicode non valide, raison pour laquelle cette chaîne n'est pas valide
  • L'ajout d'un //au début ne fonctionnera toujours pas à cause de la nouvelle ligne principale, ce qui laissera la deuxième ligne sans commentaires.
  • Ajout d' un /*ne sera pas décommenter la chaîne complètement en raison de la fermeture */qui complète, en laissant l' \u)exposé
  • Comme indiqué par @tsh, la ligne du bas peut être transformée en une expression rationnelle en ayant un /après la chaîne. Ainsi, en ayant le )devant de la chaîne \u, nous pouvons nous assurer que le littéral de l'expression rationnelle sera toujours invalide.
  • Comme indiqué par @asgallant, on pourrait 1||1(string)/éviter l’évaluation de la regex. Le point-virgule au début de la deuxième ligne empêche cela de se produire en mettant fin à l'expression 1||1avant qu'elle ne touche la deuxième ligne, forçant ainsi une SyntaxError avec le ;*.

Essayez le!


2
/* */\u0045 = 3semble valide code JavaScript.
tsh

2
3 */\u;/est toujours valide.
tsh le

3
Il est intéressant de noter qu’à partir de ES2018 (qui ne sera pas officiel avant la fin de cette année), vous pouvez simplement envelopper le tout dans des backticks pour cette raison . Vous pourriez probablement résoudre ce problème en insérant simplement un backtick après le /(pas que vous ayez besoin de le réparer). (En outre, le ;ne force pas l'analyse syntaxique de la mauvaise expression rationnelle, il force une syntaxeError avec le *.)
ETHproductions

1
@ Leushenko Mais cela ne fonctionne pas #if 0comme on le voit ici: essayez-le en ligne!
Kritixi Lithos

3
Dans les versions plus récentes de JS, String.raw avec une chaîne de modèle peut empêcher cette interruption, car l'échappement non valide échoue. Serait: String.raw`code here`
iovoid

15

Python, 10 octets (pas cpython)


?"""?'''?

Notez la nouvelle ligne principale. Ne peut pas être commenté à cause de la nouvelle ligne, et aucune combinaison de chaînes entre guillemets triples ne devrait fonctionner si j'y pensais correctement.

Autant que je sache, @feersum dans les commentaires semble avoir complètement rompu tout programme cpython sous Windows en ajoutant le caractère 0x1A au début d'un fichier. Il semble que cela soit peut-être dû à la façon dont ce caractère est géré par le système d'exploitation. Il s'agit apparemment d'un fichier traduit en EOF, car il passe par stdin en raison d'une norme DOS ancienne.

Dans un sens très réel, ce n'est pas un problème avec python mais avec le système d'exploitation. Si vous créez un script python qui lit le fichier et utilise sa fonction intégrée compile, le comportement attendu de la génération d'une erreur de syntaxe est plus attendu. Pypy (qui fait probablement cela en interne) génère également une erreur.

Modifier:

En raison de la diligence de @ feersum pour trouver des moyens obscurs de casser l'interpréteur Python, cette réponse est complètement invalidée pour tout environnement cpython typique, pour autant que je sache! (Python 2 et 3 pour Windows et Linux) Je pense toujours que ces fissures ne fonctionneront pas pour Pypy sur n’importe quelle plate-forme (la seule autre implémentation de Python que j’ai testée).


1
@officialaimm considère"""?'''"""
KSab

3
J'ai créé un programme avec cette sous-chaîne qui s'exécute sur ma machine. Cependant, je pense qu'il ne fonctionne pas sur beaucoup d'interprètes / plates-formes / versions. Pouvez-vous spécifier la version de l'interpréteur Python et du système d'exploitation ciblée par cette réponse?
Feersum

1
Python 3 sur Windows 7 se trouve être exactement où mon crack fonctionne. Pastebin du programme encodé en base64
feersum le

1
Je peux craquer celui-ci aussi. Il suffit de mettre un caractère 0x1A au début du fichier et tout le reste est ignoré (cela fonctionne également pour Python 3).
Feersum

1
Je sais que c'est vraiment vieux, mais après avoir travaillé avec certaines personnes dans Python Discord, nous avons trouvé cette fêlure , bien que je ne sache pas si changer l'encodage peut être considéré comme une tricherie
EdgyNerd

14

C (clang) , 16 octets

 */
#else
#else

Essayez-le en ligne!

*/ferme tous les /*commentaires, et l’espace principal nous assure que nous n’en avons pas commencé. La nouvelle ligne ferme tout //commentaire et casse tout littéral de chaîne. Ensuite, nous provoquons une erreur #else without #ifou une #else after #elseerreur (peu importe le nombre de #if 0secondes à l'intérieur).



2
De plus, comme les chaînes brutes C ++ 11 semblent fonctionner, une solution est impossible avec gcc.
Feersum

@feersum Huh, TIL que GCC accepte ceux en code C. Je pourrais préciser -std=c99, mais essayons de passer à Clang.
Anders Kaseorg

3
Je suis vraiment surpris que gcc accepte les chaînes brutes C ++ 11. Spécifier la version ou l'implémentation du compilateur est parfaitement correct, donc si c'est illégal dans Clang, c'est un jeu juste.
nneonneo

1
@ l4m2 Je ne peux pas analyser votre question (qui sont-ils et que voulez-vous dire encore une fois?), mais notez qu'un littéral de chaîne brute C ++ prend en charge un délimètre personnalisé: R"foobar(...)foobar"et uniquement un paren de droite suivi du délimètre correspondant la citation va la fermer.
Anders Kaseorg

11

Pyth, 6 octets

¡¡$¡"¡

¡est un caractère non implémenté, ce qui signifie que si l'analyseur Pyth l'évalue, il générera une erreur avec une erreur PythParseError. Ce code garantit que cela se produira sur l' une des ¡s.

Un octet peut être présent dans un programme Pyth de trois manières différentes et ne pas être analysé: dans un littéral chaîne ( "ou ."analysé de manière équivalente), dans un littéral Python ( $) et immédiatement après un \.

Ce code empêche \de le faire évaluer sans erreur, car cela n'affecte que l'octet immédiatement suivant et la deuxième ¡erreur.

$incorpore le code dans le $s directement dans le code Python compilé. Je ne fais aucune hypothèse sur ce qui pourrait s'y passer.

Si le programme atteint ce code dans un $contexte, il se terminera par le $, et ¡juste après, l'erreur d'analyse sera affichée. Les littéraux Python de Python se terminent toujours par le suivant $, quel que soit le comportement du code Python.

Si le programme commence dans un "contexte, il "finira la chaîne et la dernière ¡fera l'erreur d'analyse.


11

Ada - 2 octets

Je pense que cela devrait fonctionner:


_

C'est newline-underscore. Newline termine les commentaires et n'est pas autorisé dans une chaîne. Un trait de soulignement ne peut pas suivre les espaces; Auparavant, il n'était autorisé qu'après des lettres et des chiffres, mais l'introduction de Unicode a compliqué les choses.


2
Bienvenue sur le site! :)
DJMcMayhem

9

Code machine x86 32 bits, 11 octets (et compatibilité future 64 bits)

90 90 90 90 90 90 90 90 90 0f 0b

C'est times 9 nop/ ud2. C'est fondamentalement un slogan NOP , de sorte qu'il fonctionne toujours à 0 nops ou plus , puis ud2à déclencher une exception, quel que soit le nombre d' 0x90octets utilisés en tant qu'opérandes dans un opcode précédent. D'autres instructions sur un seul octet (comme times 9 xchg eax, ecx) fonctionneraient également.

Code machine x86 64 bits, 10 octets (processeurs actuels)

Il existe des instructions non autorisées d'un octet en mode 64 bits, jusqu'à ce qu'une extension ISA les réutilise en tant que préfixes ou parties d'opcodes multi-octets en mode 64 bits uniquement, distinctes de leur signification en mode 32 bits. 0x0eest push csen mode 32 bits, mais illégal sur les processeurs actuels (testé sur Intel Skylake) en 64 bits.

0e 0e 0e 0e 0e 0e 0e 0e 0e 0e

Interprétation des règles pour le code machine exécutable :

  • Les octets ne peuvent pas être ignorés (comme la restriction "non analysé"), car les processeurs ne déclenchent pas d'exceptions tant qu'ils ne tentent pas de décoder / exécuter (de manière non spéculative).

  • Moyens illégaux soulève toujours une exception, par exemple une exception d'instruction illégale. (Les programmes réels peuvent résoudre ce problème avec un gestionnaire d'exceptions sur du métal nu ou installer un gestionnaire de signaux de système d'exploitation, mais je pense que cela reflète l'esprit du défi.)


Cela fonctionne car une chaîne d'octets plus courte finissant par ud2peut apparaître comme une imm32 et / ou une partie du mode d'adressage pour une autre instruction, ou être divisée en une paire d'instructions . Il est plus facile de penser à cela en termes de ce que vous pouvez mettre devant la chaîne pour "consommer" les octets dans le cadre d'une instruction et laisser quelque chose qui ne fait pas défaut.

Je pense qu'une instruction peut consommer au maximum 9 octets d'éléments arbitraires: un octet SIB, un disp32 et un imm32. c'est-à-dire que les 2 premiers octets de cette instruction peuvent consommer 8 NOP et un ud2, mais pas 9.

c7 84 4b 00 04 00 00 78 56 34 12        mov dword [rbx+rcx*2+0x400],0x12345678

Ne peut pas battre 9 nops:

    db 0xc7, 0x84   ; opcode + mod/rm byte: consumes 9 bytes (SIB + disp32 + imm32)
    times 9 nop          ; 1-byte xchg eax, ecx or whatever works, too
    ud2
  ----
   b:   c7 84 90 90 90 90 90 90 90 90 90        mov    DWORD PTR [rax+rdx*4-0x6f6f6f70],0x90909090
  16:   0f 0b                   ud2    

Mode 64 bits:

 c7 84 0e 0e 0e 0e 0e 0e 0e 0e 0e        mov    DWORD PTR [rsi+rcx*1+0xe0e0e0e],0xe0e0e0e
 0e                      (bad)  

Mais les octets de 8 NOPs + ud2 (ou times 9 db 0x0e) peuvent apparaître dans le cadre d’autres insns:

    db 0xc7, 0x84   ; defender's opcode + mod/rm that consumes 9 bytes

    times 8 nop          ; attacker code
    ud2

    times 10 nop    ;; defenders's padding to be consumed by the 0b opcode (2nd half of ud2)
----
  18:   c7 84 90 90 90 90 90 90 90 90 0f        mov    DWORD PTR [rax+rdx*4-0x6f6f6f70],0xf909090
  23:   0b 90 90 90 90 90       or     edx,DWORD PTR [rax-0x6f6f6f70]
  29:   90                      nop
  2a:   90                      nop
  ...

Les règles ici n'étaient pas assez claires pour que je puisse envisager de poster une réponse code asm / machine. Par exemple, pourquoi ne pouvez-vous pas simplement faire ud2? Il semblerait que vous disiez que vous interprétez les règles comme interdisant de sauter par-dessus les octets, alors ud2cela fonctionnerait-il parfaitement, non? Oh… je suppose que vous dites que le problème est que ud2peut apparaître comme préfixe d’une instruction valide? La deuxième partie de cette réponse était un peu difficile à comprendre pour moi.
Cody Gray

@CodyGray: D'accord, les 2 octets encodés ud2peuvent apparaître dans imm32n'importe quelle instruction. J'y pensais en termes d'octets que vous pouvez mettre avant une chaîne telle que "consommer" 0f 0bdans le cadre d'une instruction précédente au lieu de le décoder en tant que ud2. Je n’étais pas totalement satisfait de la manière dont je l’ai présenté, mais je voulais expliquer pourquoi seulement 8 nopsecondes ne suffisait pas et ce qui s’est passé avec 9 ans nop+ ud2.
Peter Cordes

@CodyGray: Un programme source asm serait une réponse totalement différente. Cela devrait provoquer une erreur de l'analyseur utilisé par l'assembleur et ne pas produire de code machine défectueux. Donc, quelque chose comme %else/ %elsepourrait fonctionner pour vaincre %if 0, ce qui peut normalement protéger n'importe quel texte invalide d'être analysé. (Idée tirée d'une réponse au RPC)
Peter Cordes Le

Ne satisfait pas tout à fait. Votre solution peut être juste en .data. (bien que cela le rende impossible)
l4m2

@ 14m2: Pour que la question soit répondable / intéressante, je devais la limiter au code exécuté (et non sauté). Voir les points d'interprétation des règles dans ma réponse. Cela exclurait également les données statiques, bien sûr. Parce qu'alors ce n'est pas du tout un code machine, ce sont juste des données. Cette question nécessitait plus d’adaptation que la plupart des autres pour qu’une réponse en code machine ait un sens, car il n’existait pas d’étape de compilation / assemblage dans laquelle l’analyseur pouvait se tromper, nous ne parlons que d’octets déjà en mémoire.
Peter Cordes

7

C #, 16 octets


*/"
#endif<#@#>

Fonctionne parce que:

  • // le commentaire ne fonctionnera pas à cause de la nouvelle ligne
  • /* commentaire ne fonctionnera pas à cause de la */
  • Vous ne pouvez pas avoir de constantes dans le code seul
  • Ajouter #if falseau début ne fonctionnera pas à cause de la#endif
  • La "ferme tout littéral de chaîne
  • Le <#@#>est une directive sans nom, donc échoue pour les modèles T4.
  • La nouvelle ligne le trompe afin d’avoir /au départ un avantage certain.*/

Chaque variante échoue avec une erreur de compilation.


1
Bizarre que vous ayez décidé d'inclure des modèles T4 dans votre code. Le T4 n'est-il pas considéré comme une langue distincte?
Arturo Torres Sánchez le

1
@ ArturoTorresSánchez Je ne sais pas, je n'en avais jamais entendu parler. Quelqu'un a fait remarquer que cela ne fonctionnait pas lorsque vous avez inclus les modèles T4. J'ai donc ajouté le correctif.
TheLethalCoder


5

Haskell lettré , 15 octets

Réparation d'une tentative supprimée par Nimi.


\end{code}
5
>

Essayez-le en ligne!

La tentative initiale de nimi est constituée des deux dernières lignes, sur la base de Literate Haskell ne permettant pas au >code alphabétisé de se trouver sur une ligne voisine d'une ligne de commentaire alphabétisée ( 5ici). Il a échoué car il peut être incorporé dans un commentaire dans le style de codage littéral de remplacement ("LaTeX"):

\begin{code}
{-
5
>
-}
\end{code}

Cependant, le \begin{code}style de Literate Haskell ne s'emboîte pas , ni en lui-même ni dans les {- -}commentaires multilignes. En mettant une ligne \end{code}juste avant la ligne avec le 5, la solution de contournement échoue et je ne vois pas de solution différente.


4

Free Pascal, 18 octets


*)}{$else}{$else}

Fermez d’abord tous les commentaires possibles, puis gérez la compilation conditionnelle.

S'il vous plaît commenter ici si j'ai oublié quelque chose.


3
@ user902383 Votre exemple contient-il la nouvelle ligne principale de son extrait?
Brian J

@BrianJ Nope, je pensais que c'était juste un problème de formatage, mon mauvais
user902383

Je ne pense pas que ce soit possible en Free Pascal. Il suffit de les mettre après begin end..
jimmy23013

@ jimmy23013 mais il semble que end.la question autorise les codes postérieurs à la validité.
tsh

4

Commodore 64 Basic, 2 octets


B

(c'est une nouvelle ligne suivie de la lettre "B").

Toute ligne d'un programme Commodore 64 doit commencer par un numéro de ligne ou un mot-clé BASIC. Les programmes enregistrés n'autorisent que les numéros de ligne. Il n'y a pas de mots-clés commençant par "B" (ou "H", "J", "K", "Q", "X", "Y" ou "Z").


Si je l’ajoute, =0cela devient alors une déclaration de mission ...
Neil

1
@ Neil, ce serait une commande en mode immédiat valide, mais pas un programme valide.
Marc

4

Brain-Hack (une variante de Brain-Flak ), 3 2 octets

Merci à Wheat Wizard d’ avoir signalé que Brain-Hack ne prend pas en charge les commentaires, ce qui m’a sauvé un octet.

(}

Essayez-le en ligne!


Comment faites-vous des commentaires dans Brain-Flak? Je ne connais aucun moyen de les faire.
Erik the Outgolfer

@EriktheOutgolfer # TIO
Riley

Euh comportement non documenté.
Erik the Outgolfer

@EriktheOutgolfer J'ai toujours supposé qu'ils étaient documentés quelque part. Je vais regarder pour les ajouter.
Riley

Vous n'avez pas besoin de la nouvelle ligne dans BrainHack ou Craneflak, Rain-Flak est la seule des trois versions à comporter des commentaires de ligne. Bien que Craneflak analyse à la volée, il est donc impossible de résoudre ce problème à Craneflak, toute solution pourrait être éliminée par prépondérance (()){()}.
Wheat Wizard


3

VBA, 2 octets

Un saut de ligne suivi d'un trait de soulignement - les _fonctions utilisées en tant que caractère de continuation de ligne dans VBA, et comme il n'y a rien dans la ligne directement à gauche ou au-dessus de la continuation de ligne, couplées au manque de commentaires multilignes de VBA signifie que la compilation sera toujours lancée. erreur de tempsCompile Error: Invalid character


_

Vous dépendez de votre modèle commençant sur une nouvelle ligne ... ajoutez donc une nouvelle ligne.
Déduplicateur

@Deduplicator il a déjà une nouvelle ligne, - peu importe ce qui suit _, seulement qu'il n'y a pas de ligne valide à gauche ou au-dessus
Taylor Scott

Et si il est intégré comme ceci myfunction( \n_ ):?
Déduplicateur

@Deduplicator, le caractère de continuation de ligne doit être sur la même ligne car il est continu, c.-à-d. Public Function Foo( ByVal bar as Integer, _ (Nouvelle ligne) bas as long) as double- alors oui, cela entraînerait une erreur si vous appelez la fonction que vous avez décrite
Taylor Scott le

Ok, dans ce cas, c'est plus comme myfunction( _ \n_ ). Désolé pour la confusion. En d'autres termes, vous auriez dû utiliser deux nouvelles lignes.
Déduplicateur

3

SmileBASIC, 2 octets


!

Comme rien ne continue au-delà de la fin d'une ligne, vous avez uniquement besoin d'un saut de ligne suivi de quelque chose qui ne peut pas être le début d'une déclaration. !est la logique pas opérateur, mais vous n'êtes pas autorisé à ignorer le résultat d'une expression, donc même quelque chose comme !10serait invalide (pendant que ça X=!10marche, bien sûr)

Des choses similaires fonctionneront dans toutes les langues où tout se termine à la fin d'une ligne, à condition que le code soit analysé avant de l'exécuter.

Il y a beaucoup de caractères alternatifs qui pourraient être utilisés ici, donc je pense qu'il serait plus intéressant de lister ceux qui POURRAIENT être valables.

@est le début d'une étiquette, par exemple, @DATA; (pourrait faire partie d'une expression comme celle (X)=1qui est autorisée pour une raison quelconque; toute lettre ou _pourrait être un nom de variable X=1, un appel de fonction LOCATE 10,2ou un mot clé WHILE 1; 'est un commentaire et ?est l'abréviation de PRINT.


oh, pour une raison quelconque, quand j'ai édité le post, il a été dupliqué ...
12Me21

3

INTERCAL , 12 octets

DOTRYAGAINDO

Essayez de le casser en ligne!

L'approche d'INTERCAL pour les erreurs de syntaxe est un peu spéciale. Essentiellement, une instruction non valide ne provoquera pas d'erreur à moins que le programme tente de l'exécuter. En fait, la syntaxe idiomatique des commentaires consiste à les commencer PLEASE NOTE, ce qui ne fait que démarrer une instruction, déclare qu'elle ne doit pas être exécutée, puis la commence par la lettre E. Si votre code est DODOau milieu de celui-ci, vous pouvez ajouter DOABSTAINFROM(1)(1)une déclaration valide à la fin et y insérer une instruction valide. Tout ira bien. Si DODODOvous pouvez simplement contourner l'exécution comme elle le permet (1)DON'TDODODOCOMEFROM(1). Même si INTERCAL n’a pas de syntaxe littérale pour les échapper, il n’ya aucun moyen d’utiliser des erreurs de syntaxe pour créer une chaîne illégale, même en utilisant tous les numéros de ligne possibles.(1)DO(2)DO...(65535)DODODO, puisqu'il semble qu'il est tout à fait possible d'avoir des numéros de ligne en double pour COME FROMtravailler avec n'importe lequel d'entre eux.

Pour une chaîne illégale, nous avons vraiment besoin d'utiliser une déclaration parfaitement valide: TRY AGAIN. Même s’il n’est pas exécuté, il doit obligatoirement être la dernière instruction d’un programme, si elle est dans le programme. À ma connaissance, 12 octets est la plus courte qu'une chaîne illégale puisse utiliser TRY AGAIN, car elle doit garantir qu'il y a une instruction après (exécutée ou non), de sorte qu'il ne DOTRYAGAINs'agit que de code normal et qu'elle doit s'assurer que l'intégralité de l'instruction est en effet TRY AGAIN, donc TRYAGAINDOne fonctionne pas car il peut facilement être transformé en une erreur de syntaxe normale ignorée:, DON'TRYAGAINDOGIVEUPou PLEASE DO NOT TRY TO USE TRYAGAINDO NOT THAT IT WOULD WORK. Peu importe ce que vous mettez de chaque côté DOTRYAGAINDO, vous l' erreur, soit ICL993I I GAVE UP LONG AGO, ICL079I PROGRAMMER IS INSUFFICIENTLY POLITEou ICL099I PROGRAMMER IS OVERLY POLITE.


Il peut y avoir quelques autres erreurs de compilation pouvant se déclencher auparavant ICL993I I GAVE UP LONG AGO.
Unrelated String

Si, en utilisant chaque libellé de ligne, vous COME FROMmodifiez également le libellé de ligne, il peut être un peu difficile de détourner le flux de contrôle autour du bloc, mais rien ne vous en empêche juste GIVING UP!
Chaîne sans lien

3

AWK , 4 octets



/

Essayez-le en ligne!

N'ayant AWKpas de méthode pour faire des commentaires sur plusieurs lignes, il faut 2 nouvelles lignes avant et 1 après /pour éviter les commentaires ou la transformation en regex, par exemple add 1/. Le message le plus courant est `Nouvelle ligne ou fin de chaîne inattendue.

Avec fissure précédente


2

Fortran, 14 octets


end program
e

Pas de commentaires multilignes ni de directives de préprocesseur dans Fortran.


1
Y at-il un bon moyen de tester cela en ligne? Aussi, quelle version / compilateur de Fortran?
Robert Benson le

2

JavaScript (Node.js) , 9 à 8 octets

`*/
\u`~

Essayez-le en ligne!

Je pense que cela devrait être assez illégal.

Tentatives précédentes du JS dans d'autres réponses

; * / \ u)

Par @Cows Quack

En tant que réponse ES5, cela devrait être valide, mais dans ES6, le code est encapsulé avec une paire de backticks. Par conséquent, les réponses ES6 valides doivent impliquer des backticks.

`
`* /} '" `\ u!

Par @iovoid

Ceci est une version améliorée impliquant des backticks. Cependant, un seul /après la rupture du code (cela devient un modèle littéral en cours de multiplication par une expression rationnelle, inutile mais syntaxiquement valide.) @Neil a suggéré de passer !à ). Cela devrait théoriquement fonctionner parce que l'ajout /à la fin ne fonctionne plus (en raison d'une expression rationnelle mal formée).

Explication

`*/
\u`~

Cela est en soi illégal et bloque également toutes les guillemets simples et doubles, car ces guillemets ne peuvent pas s'étendre sur plusieurs lignes sans un point \final.

//`*/
\u`~

et

/*`*/
\u`~

Bloque les commentaires en introduisant des séquences d'échappement illégales

``*/
\u`~

Bloque les backtick initiaux en introduisant un littéral RegExp non terminé

console.log`*/
\u`~

Bloque les littéraux de modèles étiquetés en introduisant un opérateur attendu entre deux backticks


2

Rockstar , 4 à 5 octets

4 barrés sont encore 4 :(

)
"""

Rockstar est une langue très ... verbeuse.
Alors que "peut être utilisé pour définir une chaîne, telle que Put "Hello" into myVar, à ma connaissance, il n’est pas possible que 3 guillemets apparaissent en dehors d’un commentaire, et le paren proche garantit que cela ne se produira pas non plus (les commentaires dans Rockstar sont entre parenthèses, comme cette).

Rockstar a également une syntaxe littérale poétique, dans laquelle la ponctuation est ignorée. La nouvelle ligne garantit ainsi que les 3 guillemets sont le début d'une ligne de code, qui doit toujours être invalide.


Qu'en est-il (()"""), ne serait-ce pas un non-op?
ბიმო

@BMO premier paren ouvre un commentaire, le second paren ne fait rien car il est commenté, le troisième paren ferme le commentaire, puis vous avez """)été analysé comme un code invalide
Skidsdev

Hmm, les commentaires imbriqués ne sont pas dans les spécifications. Les commentaires semblent de toute façon découragés. Mais vous avez surveillé les littéraux de chaîne poétiques qui autorisent n'importe quelle chaîne, donc Goethe says )"""est valide .
ბიმო

@BMO bon point, peut être fixé par l' insertion d' une nouvelle ligne inbetween )et"""
Skidsdev

2

Powershell, 10 8 12 14 13 14 16 octets

-2 octets merci à Mazzy de trouver un meilleur moyen de le casser
+4 -1 octets grâce à IsItGreyOrGray

$#>
'@';
"@";
@=

J'espère que ça marche. 'et "pour se protéger des guillemets, #>pour casser le commentaire de bloc, de nouvelles lignes pour arrêter le commentaire d'une seule ligne, les deux '@et "@pour intercepter un autre style de chaîne, puis démarre un tableau incorrect pour générer une erreur de syntaxe.

La logique étant qu'ils ne peuvent pas utiliser n'importe quel ensemble de guillemets pour entrer, ils ne peuvent pas bloquer le commentaire. Si @"est utilisé, il va créer une chaîne ici qui ne peut pas avoir de jeton par la suite, et s'ils laissez-le tranquille, il va essayer de faire un tableau cassé. Cette déclaration veut vivre si fort que je continue à trouver encore plus de trous dans l'armure.


1
Ou protecteurs +@=
mazzy

1
@IsItGreyOrGray AAAAAAAAAAAw diable.
Veskah

2
Il semble que le fait de changer #> en $ #> le divisera en "non reconnu comme nom d'applet de commande ..." Il sera peut-être de nouveau légal, mais je n'ai pas le moyen. Encore. :)
GreyOrGray le

1
@IsItGreyOrGray Sonofagun. Maintenant, avec une armure de deux points?
Veska le

1
Agréable! Je n'ai rien Tout ce que j'ai essayé a échoué.
GreyOrGray le

2

Enchantements runiques, 3 octets

Une des nombreuses variantes possibles.

Essayez-le en ligne!

Runic utilise des caractères de combinaison unicode dans un " Mmodifie le comportement de C" (où Cest une commande). En tant que tel, deux modificateurs ne sont pas autorisés à modifier la même commande et l'analyseur émettra une erreur si une telle occurrence est trouvée.

De même, certaines commandes redirigeant l'IP ne peuvent être modifiées d'aucune façon, en raison de l'existence de caractères modificateurs de modification de la direction (et les deux dans la même cellule n'ont aucun sens).

Il n'y a aucun moyen d'échapper ou de littéraliser la chaîne pour la rendre valide. Le lien Tio contient un ;afin de contourner l’erreur "pas de terminateur" de priorité supérieure.


2

TI-Basic (83 + / 84 + / SE, 24500 octets)

A

(24500 fois)

TI (-83 + / 84 + / SE) -Basic vérifie la syntaxe uniquement sur les instructions qu'il atteint. Même les 5000 Endinstructions d'une ligne peuvent être ignorées avec a Return. Cela, en revanche, ne peut pas entrer dans la RAM d'une TI-83 + / 84 + / SE, aucun programme ne peut donc contenir cette chaîne. Être un peu conservateur avec le nombre de caractères ici.

La TI-83 d’origine dispose de 27 000 octets de RAM; vous aurez donc besoin de 27 500 As dans ce cas.

TI-Basic (89 / Ti / 92 + / V200, 3 octets)

"

Newline, citation, nouvelle ligne. La nouvelle ligne ferme tous les commentaires (et interdit l'incorporation du caractère illégal dans une chaîne, car les constantes de chaîne multiligne AFAIK ne sont pas autorisées), l'autre nouvelle ligne interdit la fermeture de la chaîne et la citation génère une erreur de syntaxe.

Vous pouvez obtenir jusqu'à 2 octets avec

±

sans la nouvelle ligne, mais je ne suis pas sûr que cela compte, car elle ±est valide uniquement dans les constantes de chaîne.


Fait, merci :)
bb94

2

Go , 6 octets


*/```

Essayez de le casser en ligne!

L'accent grave (`) marque un littéral de chaîne brute, dans lequel tous les caractères sauf`, y compris les retours à la ligne et les barres obliques inverses, sont interprétés littéralement comme faisant partie de la chaîne. Le noyau est constitué de trois `` dans une ligne: les littéraux de chaîne adjacents ne sont pas valides et `ferme toujours une chaîne` , il n'y a donc aucun moyen de les comprendre. Je devais utiliser 3 octets supplémentaires pour éviter le contournement, une nouvelle ligne afin que nous ne puissions pas être insérés dans un commentaire d'une seule ligne ou une chaîne entre guillemets normaux, et un * / afin que nous ne puissions pas être insérés dans un commentaire de plusieurs lignes.


1

SILOS , 4 octets

Les silos sont compétitifs \ o /


x+

SILOS fonctionne sur un interpréteur / compilateur à deux passes. Avant l'exécution, un "compilateur" tente de simplifier la source dans un tableau décrivant la source. Chaque ligne est traitée séparément. x + a est un opérateur d'assignation qui ajoute ea à la valeur de x et la stocke dans x. Cependant le "compilateur" va casser. Par conséquent, nous prenons cette chaîne et ajoutons une nouvelle ligne avant et après avoir vérifié qu'elle se trouve sur sa propre ligne et rompt le compilateur.

Essayez-le en ligne!


Pourquoi ne pas ax+erreur sur?
Erik the Outgolfer

comportement du compilateur non défini @EriktheOutgolfer
Rohan Jhunjhunwala

1

AutoHotkey , 5 octets

`est le personnage d'échappement. Vous ne pouvez échapper à un "que lorsque vous l'assignez à une variable.

\ n * / l'empêche d'être mis en commentaire ou assigné à une variable.


*/`"

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.