Finden Sie eine illegale Zeichenfolge


81

Die Herausforderung besteht darin , eine Reihe von Zeichen zu finden , die nicht kann in erscheint jedes rechtliches Programm in Ihrer Programmiersprache der Wahl. Dazu gehören Kommentare, Zeichenfolgen oder andere "nicht ausführbare" Teile.

Herausforderung

  • Ihr Programm ist möglicherweise spezifisch für eine bestimmte Version oder Implementierung der Compiler- / Interpreter- / Laufzeitumgebung Ihrer Sprache. Wenn ja, geben Sie bitte die Einzelheiten an.
  • Es sind nur Standardoptionen für Compiler / Interpreter / Laufzeit zulässig. Sie können Ihrem Compiler kein seltsames Flag übergeben, um ein bestimmtes Ergebnis zu erhalten (z. B. das Übergeben eines Flags, um Warnungen in Fehler umzuwandeln).
  • Wenn Ihre Programmiersprache eine bestimmte Codierung erfordert (z. B. UTF-8), muss Ihre Zeichenfolge auch korrekt codiert sein (dh Zeichenfolgen, die nur aufgrund von Zeichendekodierungsfehlern fehlschlagen, sind nicht zulässig).
  • Jeder einzelne Charakter in Ihrem Beitrag muss in einem juristischen Programm zulässig sein. Das heißt, Sie können nicht einfach ein Zeichen verwenden, das immer abgelehnt wird.
  • Der Compiler / Interpreter / Laufzeit muss einen Fehler, wenn sie angegeben sind alle Quellcode, der die Zeichenfolge als Teil enthält. Der Fehler muss nicht programmübergreifend gleich sein - eine Einbettung Ihres Strings kann einen Syntaxfehler verursachen, während eine andere einen Laufzeitfehler verursachen kann.

Wertung

  • Kürzeste unzulässige Zeichenfolge für jede Sprache gewinnt.
  • Sie sollten erklären, warum Ihre Zeichenfolge illegal ist (warum sie in einem legalen Programm nirgendwo auftauchen kann).
  • Diskutiere falsche Lösungen in den Kommentaren. Insbesondere sollten Sie einen Link zu TIO oder einem vergleichbaren Programm bereitstellen, der ein legales Programm (dh eines, das keine Fehler produziert) demonstriert, das die vorgeschlagene Teilzeichenfolge enthält.
  • In einigen Sprachen (z. B. Bash, Batch, Perl) können beliebige Binärdaten an ein Programm angehängt werden, ohne die Gültigkeit zu beeinträchtigen (z. B. Verwendung __DATA__in Perl). Für solche Sprachen können Sie eine Lösung einreichen, die nur in einem solchen abschließenden Abschnitt angezeigt werden kann . Stellen Sie sicher, dass Sie dies in Ihrer Antwort vermerken. (Die Definition dieses "abschließenden Abschnitts" ist sprachabhängig, bedeutet jedoch im Allgemeinen jeden Text, nachdem der Parser das Skript vollständig nicht mehr gelesen hat.)

Beispiel

In Python könnte ich einreichen

x
"""
'''

Dies kann jedoch in das größere Programm eingebettet werden

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

also ist es nicht zulässig.


2
Kann sich ein Gegenbeispiel auf die Eingabe von STDIN stützen?
Zacharý

5
Wäre das ein guter CnR?
CalculatorFeline

2
Ich denke, jetzt ist es zu spät, aber es scheint, dass dies eine Herausforderung für Polizisten und Räuber gewesen sein könnte. Die Versuche, gültige Programme zu erstellen und die Saiten überhaupt erst zu entwickeln, sind sehr geschickt.
user2390246

4
Mein Beileid an die Perl-Versuche. :)
Kaz

2
Ich bin mir ziemlich sicher, dass es dank verschachtelter Kommentare in Haskell völlig unmöglich ist, nicht lesen und schreiben zu können.
dfeuer

Antworten:


57

Änderung , 2 Bytes




Das sind zwei Zeilenvorschübe. Valid Changeling muss immer ein perfektes Quadrat aus druckbaren ASCII-Zeichen bilden, damit es nicht zwei Zeilenvorschübe hintereinander enthält.

Der Fehler ist immer ein Parser-Fehler und immer derselbe:

This shape is unpleasant.

begleitet von Exit-Code 1 .

Probieren Sie es online!


Dies funktioniert auch mit 2Col . Probieren Sie es online! . Der Grund, warum dies in 2Col unterbrochen wird, ist, dass jede Zeile aus genau 2 Zeichen bestehen muss, aber die leere Zeile unterbricht dies.
Kritixi Lithos

2
+1, weil dies automatisch der Gewinner ist, da 1-Byte-Lösungen nicht zulässig sind, weil "Sie nicht einfach ein Zeichen verwenden können, das immer abgelehnt wird."
Zacharý

1
@Cowsquack tfw Ich habe meine eigene Sprache vergessen
Skidsdev

1
@Skidsdev tfw Ich habe meine eigene Sprache wieder vergessen und vergessen, dass ich meine eigene Sprache vergessen habe
Skidsdev

@ Zacharý Was ist mit 0-Byte-Lösungen?
PyRulez

32

Java, 4 Bytes

;\u;

Probieren Sie es online!

Dies ist eine ungültige Unicode-Escape-Sequenz und führt zu einem Fehler im Compiler.

error: illegal unicode escape

Funktioniert nicht - man könnte ein String-Literal wie haben "\\u;".
Feersum

@feersum Auf Kosten eines Bytes
behoben

21
@TheLethalCoder: Java bereitet den Quellcode vor, um Escape-Anweisungen zu ändern, \uXXXXbevor etwas anderes ausgeführt wird. Ja, dies funktioniert sogar innerhalb von comments.za
nneonneo

3
Ich denke, dies ist die kürzeste Java-Antwort in der Geschichte dieser Website noch ..
Magic Octopus Urn

1
@MagicOctopusUrn Tatsächlich gibt es diese 0-Byte-Java-Antwort (die im aktuellen Meta nicht mehr relevant ist, da sie auf STDERR anstatt auf STDOUT ausgegeben wird). Obwohl beide ziemlich erstaunlich und klug sind. :)
Kevin Cruijssen

25

COBOL (GNU) , 8 Bytes


THEGAME

Zuerst ein Zeilenvorschub, um zu verhindern, dass Sie mein Wort in eine kommentierte Zeile einfügen.

In der Vergangenheit wurden COBOL-Programme auf Codierungsblättern gedruckt, der Compiler stützt sich stark auf Zeilen mit einer Länge von 80 Zeichen, es gibt keine mehrzeiligen Kommentare und die ersten 6 Zeichen sind Kommentare (oft als bearbeitbare Zeilennummern verwendet). Sie können fast alles dort einfügen , SO VIEL ICH WEISS. Ich habe THEGAMam Anfang der nächsten Zeile gewählt.

Dann akzeptiert das 7. Symbol in jeder Zeile nur eine sehr eingeschränkte Liste von Zeichen: Leerzeichen (kein Effekt), Sternchen (kommentiert den Rest der Zeile), Bindestrich, Schrägstrich, es kann andere geben, aber sicherlich nicht E.

Der Fehler von GnuCobol ist zum Beispiel:

error: invalid indicator 'E' at column 7

Probieren Sie es online!

Außerdem hast du gerade das Spiel verloren.


30
Also, you just lost the game.Ich hätte fast downvoted
Stephen

24

JavaScript, 7 Bytes


;*/\u)

Beachten Sie den führenden Zeilenumbruch.

  • \u) ist eine ungültige Unicode-Escape-Sequenz. Aus diesem Grund ist diese Zeichenfolge ungültig
  • Das Hinzufügen von //am Anfang wird immer noch nicht funktionieren, da die zweite Zeile unkommentiert bleibt
  • Durch das Hinzufügen von a /*wird die Zeichenfolge nicht vollständig dekommentiert, da das Schließen */damit abgeschlossen ist und das \u)Exponierte erhalten bleibt
  • Wie von @tsh angegeben, kann die unterste Zeile in einen regulären Ausdruck umgewandelt werden, indem ein /nach dem String steht. Wenn also das )vor dem steht \u, können wir sicherstellen, dass das reguläre Ausdrücke-Literal immer ungültig ist
  • Wie von @asgallant angegeben, könnte man 1||1(string)/es vermeiden, den regulären Ausdruck bewerten zu müssen. Das Semikolon am Anfang der zweiten Zeile verhindert dies, indem der Ausdruck beendet wird, 1||1bevor er die zweite Zeile erreicht. Dadurch wird ein SyntaxError mit dem Symbol erzwungen ;*.

Versuch es!


2
/* */\u0045 = 3scheint gültiger JavaScript-Code zu sein.
TSH

2
3 */\u;/Ist noch gültig.
TSH

3
Interessant ist, dass Sie ab ES2018 (das erst Ende dieses Jahres offiziell sein wird) das Ganze einfach in Backticks packen können . Sie könnten dies wahrscheinlich beheben, indem Sie einfach ein Backtick nach dem einfügen /(nicht, dass Sie es beheben müssen). (Außerdem ;erzwingt das nicht das Parsen des schlechten Regex, sondern einen SyntaxError mit dem *.)
ETHproductions

1
@Leushenko Aber das funktioniert hier nicht #if 0so: Online
Kritixi Lithos

3
In neueren JS-Versionen kann String.raw mit einer Vorlagenzeichenfolge dazu führen, dass dies nicht unterbrochen wird , da das ungültige Escape fehlschlägt. Wäre: String.raw`code here`
iovoid

15

Python, 10 Bytes (nicht Cpython)


?"""?'''?

Beachten Sie den führenden Zeilenumbruch. Kann aufgrund des Zeilenumbruchs nicht auskommentiert werden, und keine Kombination von dreifach zitierten Zeichenfolgen sollte funktionieren, wenn ich das richtig überlegt habe.

@feersum in den Kommentaren scheint jedes cpython-Programm unter Windows völlig kaputt gemacht zu haben, soweit ich das durch Hinzufügen des 0x1A-Zeichens am Anfang einer Datei erkennen kann. Es scheint, dass dies vielleicht (?) An der Art und Weise liegt, wie dieses Zeichen vom Betriebssystem behandelt wird. Offenbar handelt es sich dabei um eine Übersetzung in ein EOF, wenn es aufgrund eines älteren DOS-Standards durch stdin geleitet wird.

In einem sehr realen Sinne ist dies kein Problem mit Python, sondern mit dem Betriebssystem. Wenn Sie ein Python-Skript erstellen, das die Datei liest und das eingebaute Skript verwendet compile, wird das erwartungsgemäßere Verhalten beim Auslösen eines Syntaxfehlers angegeben. Pypy (das macht wahrscheinlich nur intern) wirft auch einen Fehler.

Bearbeiten:

Aufgrund der Sorgfalt von @ feersum, obskure Wege zu finden, den Python-Interpreter zu beschädigen, ist diese Antwort für jede typische Cpython-Umgebung, soweit ich das beurteilen kann, vollständig ungültig! (Python 2 und 3 für Windows und Linux) Ich glaube immer noch, dass diese Risse für Pypy auf keiner Plattform funktionieren werden (die einzige andere Python-Implementierung, die ich getestet habe).


1
@officialaimm betrachten"""?'''"""
KSab

3
Mit diesem Teilstring habe ich ein Programm erstellt, das auf meinem Computer ausgeführt wird. Ich denke jedoch, dass es nicht auf vielen Interpreter / Plattformen / Versionen läuft. Können Sie angeben, auf welche Version des Python-Interpreters und des Betriebssystems diese Antwort abzielt?
Feersum

1
Python 3 unter Windows 7 ist genau dort, wo mein Riss funktioniert. Pastebin von base64-codiertem Programm
feersum

1
Ich kann das auch knacken. Fügen Sie einfach ein 0x1A-Zeichen am Anfang der Datei ein und der Rest wird ignoriert (dies funktioniert auch für Python 3).
Feersum

1
Ich weiß, dass dies wirklich alt ist, aber nachdem wir mit einigen Leuten im Python Discord gearbeitet haben, haben wir diesen Riss gefunden , obwohl ich nicht weiß, ob eine Änderung der Codierung als Betrug angesehen werden kann
EdgyNerd

14

C (clang) , 16 Bytes

 */
#else
#else

Probieren Sie es online!

*/schließt jeden /*Kommentar und das führende Leerzeichen stellt sicher, dass wir nicht nur eines gestartet haben. Die neue Zeile schließt jeden //Kommentar und unterbricht jedes Zeichenfolgenliteral. Dann verursachen wir ein #else without #ifoder einen #else after #elseFehler (unabhängig davon, wie viele #if 0s wir in uns haben).



2
Auch da C ++ 11-Rohstrings zu funktionieren scheinen, ist eine Lösung mit gcc unmöglich.
Feersum

@feersum Huh, bis das GCC die im C-Code akzeptiert. Ich könnte es spezifizieren -std=c99, aber lasst uns versuchen, auf clang umzuschalten.
Anders Kaseorg

3
Ich bin wirklich überrascht, dass gcc C ++ 11-Zeichenfolgen akzeptiert. Die Angabe der Compilerversion oder -implementierung ist vollkommen in Ordnung. Wenn dies in Clang illegal ist, ist dies also ein faires Spiel.
Nneonneo

1
@ l4m2 Ich kann Ihre Frage nicht analysieren (wer ist das und was ist damit gemeint?), aber beachten Sie, dass ein C ++ - Zeichenfolgenliteral ein benutzerdefiniertes Delimeter unterstützt: R"foobar(...)foobar"und nur ein rechtes Paren, gefolgt von dem passenden Delimeter und einem Zitat wird es schließen.
Anders Kaseorg

11

Pyth, 6 Bytes

¡¡$¡"¡

¡ist ein nicht implementiertes Zeichen, dh wenn der Pyth-Parser es jemals auswertet, tritt ein Fehler mit einem PythParseError auf. Der Code stellt sicher, dass dies auf einem der ¡s geschieht .

Es gibt drei Möglichkeiten, wie ein Byte in einem Pyth-Programm vorhanden sein und nicht analysiert werden kann: In einem Zeichenfolgenliteral ( "oder ."gleichwertig analysiert), in einem Python-Literal ( $) und unmittelbar nach einem \.

Dieser Code verhindert, \dass er fehlerfrei ausgewertet wird, da dies nur das unmittelbar folgende Byte und die zweiten ¡Fehler betrifft .

$bettet den Code innerhalb des $s direkt in den kompilierten Python-Code ein. Ich gehe nicht davon aus, was dort passieren könnte.

Wenn das Programm diesen Code in einem $Kontext erreicht, endet es am $, und ¡unmittelbar danach tritt der Parser-Fehler auf. Pyths Python-Literale enden immer beim nächsten $, unabhängig davon, was der Python-Code tut.

Wenn das Programm in einem "Kontext gestartet "wird, beendet das den String und das Finale ¡den Parser-Fehler.


11

Ada - 2 Bytes

Ich denke das sollte funktionieren:


_

Das ist Newline-Unterstrich. Newline beendet Kommentare und ist in einer Zeichenfolge nicht zulässig. Auf Leerzeichen kann kein Unterstrich folgen. Früher war es nur nach Buchstaben und Zahlen erlaubt, aber die Einführung von Unicode machte die Dinge kompliziert.


2
Willkommen auf der Seite! :)
DJMcMayhem

9

x86 32-Bit-Maschinencode, 11 Bytes (und zukunftssicher 64-Bit)

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

Das ist times 9 nop/ ud2. Es handelt sich im Grunde genommen um einen NOP-Schlitten , der immer noch als 0 oder mehr nops ausgeführt wird und dann ud2eine Ausnahme auslöst, unabhängig davon, wie viele 0x90Bytes als Operanden für einen vorhergehenden Opcode verwendet wurden. Andere Einzelbyte-Befehle (wie times 9 xchg eax, ecx) würden auch funktionieren.

x86 64-Bit-Computercode, 10 Byte (aktuelle CPUs)

Es gibt einige unzulässige 1-Byte-Anweisungen im 64-Bit-Modus, bis einige zukünftige ISA-Erweiterungen sie als Präfixe oder Teile von Multi-Byte-Opcodes nur im 64-Bit-Modus neu verwenden, unabhängig von ihrer Bedeutung im 32-Bit-Modus. 0x0ebefindet sich push csim 32-Bit-Modus, ist jedoch auf aktuellen CPUs (getestet auf Intel Skylake) in 64-Bit unzulässig .

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

Regelinterpretation für ausführbaren Maschinencode :

  • Die Bytes können nicht übersprungen werden (wie die Einschränkung "nicht analysiert"), da CPUs keine Ausnahmen auslösen, bis sie tatsächlich versuchen, sie zu dekodieren / auszuführen (nicht spekulativ).

  • Illegale Mittel lösen immer eine Ausnahme aus, zum Beispiel eine Ausnahme für illegale Anweisungen. (Echte Programme können dies mit einem Exception-Handler auf Bare-Metal-Basis abfangen oder einen OS-Signal-Handler installieren, aber ich denke, dies fängt den Geist der Herausforderung ein.)


ud2Dies funktioniert, weil eine kürzere Byte-Zeichenfolge, die auf endet , als imm32 und / oder Teil des Adressierungsmodus für einen anderen Befehl angezeigt oder über ein Befehlspaar aufgeteilt werden kann . Es ist am einfachsten, darüber nachzudenken, was Sie vor die Zeichenfolge stellen könnten, um die Bytes als Teil einer Anweisung zu "verbrauchen" und etwas zu hinterlassen, das keine Fehler verursacht.

Ich denke, ein Befehl kann höchstens 9 Bytes von beliebigem Material aufnehmen: ein SIB-Byte, ein disp32 und ein imm32. dh die ersten 2 Bytes dieses Befehls können 8 NOPs und ein ud2, aber nicht 9, verbrauchen.

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

9 Nops nicht zu schlagen:

    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    

64-Bit-Modus:

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

Aber die Bytes für 8 NOPs + ud2 (oder times 9 db 0x0e) können als Teil anderer Insns erscheinen:

    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
  ...

Die Regeln hier waren nicht klar genug, um eine asm / machine-Code-Antwort zu veröffentlichen. Warum kannst du es zum Beispiel nicht einfach tun ud2? Es scheint, dass Sie sagen, dass Sie die Regeln so interpretieren, als würden Sie das Springen über die Bytes verbieten. ud2Würde das alleine also gut funktionieren, oder? Oh ... ich denke, Sie sagen, das Problem ist, dass ud2es als Präfix zu einer gültigen Anweisung erscheinen kann? Der zweite Teil dieser Antwort war für mich etwas schwer zu verstehen.
Cody Grey

@CodyGray: Richtig, die 2 Bytes, die kodieren, ud2können in imm32jeder Anweisung vorkommen. Ich habe darüber nachgedacht, welche Bytes Sie vor eine solche Zeichenfolge stellen können, die 0f 0bals Teil eines früheren Befehls "verbraucht", anstatt als "dekodiert" ud2. Ich war nicht ganz zufrieden damit, wie ich es präsentiert habe, aber ich wollte veranschaulichen, warum nur 8 nops nicht genug waren und was mit 9 nops + passierte ud2.
Peter Cordes

@CodyGray: Ein ASM-Quellprogramm wäre eine völlig andere Antwort. Das müsste den vom Assembler verwendeten Parser verfälschen und keinen fehlerhaften Maschinencode erzeugen. Es könnte also funktionieren, dass etwas wie %else/ %elsebesiegt wird %if 0, was normalerweise jeden ungültigen Text davor schützt, analysiert zu werden. (Idee aus einer CPP-Antwort)
Peter Cordes

Nicht ganz befriedigen. Ihre Lösung befindet sich möglicherweise nur in .data. (obwohl es unmöglich macht)
l4m2

@ l4m2: Um die Frage beantwortbar / interessant zu machen, musste ich sie auf Code beschränken , der ausgeführt wird (und nicht übersprungen wird). Siehe die Aufzählungspunkte zur Regelinterpretation in meiner Antwort. Das würde natürlich auch statische Daten ausschließen. Weil es dann überhaupt kein Maschinencode ist, sondern nur Daten. Diese Frage erforderte mehr Anpassungen als die meisten anderen, damit eine Antwort mit Maschinencode Sinn macht, da es keine Kompilierungs- / Assemblierungsstufe gibt, in der Sie den Parser verfälschen können. Es handelt sich lediglich um bereits im Speicher befindliche Bytes.
Peter Cordes

7

C #, 16 Bytes


*/"
#endif<#@#>

Funktioniert weil:

  • // Kommentar funktioniert wegen der neuen Zeile nicht
  • /* Kommentar wird wegen der nicht funktionieren */
  • Sie können keine Konstanten im Code alleine haben
  • Das Hinzufügen #if falsezum Start wird wegen der nicht funktionieren#endif
  • Das "schließt jedes String-Literal
  • Dies <#@#>ist eine namenlose Direktive, die für T4-Vorlagen fehlschlägt.
  • Die neue Linie täuscht es aus, so dass es /das nicht täuscht , wenn man sie am Start hat*/

Jede Variation schlägt mit einem Kompilierungsfehler fehl.


1
Seltsam, dass Sie sich entschieden haben, T4-Vorlagen in Ihren Code aufzunehmen. Wird T4 nicht als separate Sprache betrachtet?
Arturo Torres Sánchez

1
@ ArturoTorresSánchez Ich weiß nicht, dass ich noch nie von ihnen gehört hatte. Jemand kommentierte, dass dies nicht funktioniert hat, als Sie T4-Vorlagen einbezogen haben, also habe ich das Update hinzugefügt.
TheLethalCoder


5

Literate Haskell , 15 Bytes

Einen gelöschten Versuch von nimi reparieren.


\end{code}
5
>

Probieren Sie es online!

Nimis ursprünglicher Versuch sind die letzten beiden Zeilen, die auf Literate Haskell basieren und es nicht zulassen, dass sich >Style Literate Code in einer benachbarten Zeile zu einer Kommentarzeile befindet ( 5hier). Es ist fehlgeschlagen, weil es in einen Kommentar mit der alternativen ("LaTeX") Schreibweise eingebettet werden kann:

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

Doch die \begin{code}tut Stil von Literate Haskell nicht nisten, weder an mir noch in {- -}mehrzeiligen Kommentaren, so durch eine Linie mit dem Setzen \end{code}kurz vor der Linie mit der 5, dass Abhilfe schlägt fehl, und ich habe kein anderes sehen.


4

Free Pascal, 18 Bytes


*)}{$else}{$else}

Schließen Sie zuerst alle möglichen Kommentare und führen Sie dann die bedingte Kompilierung durch.

Bitte kommentieren Sie hier, wenn ich etwas vergessen habe.


3
@ user902383 Enthält Ihr Beispiel die führende Zeile seines Snippets?
Brian J

@ BrianJ Nein, ich dachte, es war nur ein Formatierungsproblem, mein schlechter
user902383

Ich denke nicht, dass es in Free Pascal möglich ist. Setzen Sie sie einfach nach begin end..
Jimmy23013

@ jimmy23013 aber es scheint, dass Codes nach der end.Gültigkeit von der Frage zugelassen werden.
Dienstag,

4

Commodore 64 Basic, 2 Bytes


B

(das ist eine neue Zeile, gefolgt von dem Buchstaben "B").

Jede Zeile in einem Commodore 64-Programm muss entweder mit einer Zeilennummer oder einem BASIC-Schlüsselwort beginnen, und gespeicherte Programme lassen nur Zeilennummern zu. Es gibt keine Schlüsselwörter, die mit "B" beginnen (oder "H", "J", "K", "Q", "X", "Y" oder "Z").


Wenn ich =0dann anhänge, wird dies nur eine Anweisung Anweisung ...
Neil

1
@Neil, das wäre ein gültiger Sofortmodus-Befehl, aber kein gültiges Programm.
Mark

4

Brain-Hack (eine Variation von Brain-Flak ), 3 2 Bytes

Vielen Dank an Wheat Wizard, der darauf hingewiesen hat, dass Brain-Hack keine Kommentare unterstützt, und mir ein Byte erspart hat.

(}

Probieren Sie es online!


Wie macht man Kommentare in Brain-Flak? Ich kenne keinen Weg, das zu tun.
Erik der Outgolfer

@EriktheOutgolfer # TIO
Riley

Huh undokumentiertes Verhalten.
Erik der Outgolfer

@EriktheOutgolfer Ich habe immer angenommen, dass sie irgendwo dokumentiert wurden. Ich werde sie hinzufügen.
Riley

Sie brauchen keine Zeilenumbrüche in BrainHack oder Craneflak, Rain-Flak ist die einzige der drei Versionen, die Zeilenkommentare enthält. Obwohl Craneflak die Analyse im laufenden Betrieb durchführt, ist es unmöglich, dies in Craneflak zu lösen (()){()}.
Weizen-Zauberer


3

VBA, 2 Bytes

Ein Zeilenvorschub, gefolgt von einem Unterstrich, _fungiert in VBA als Zeilenfortsetzungszeichen, und da sich nichts in der Zeile direkt links oder oberhalb der Zeilenfortsetzung befindet, führt das Fehlen mehrzeiliger Kommentare in VBA dazu, dass die Kompilierung immer ausgelöst wird ZeitfehlerCompile Error: Invalid character


_

Sie hängen davon ab, ob Ihr Muster in einer neuen Zeile beginnt. Fügen Sie also eine neue Zeile hinzu.
Deduplizierer

@ Deduplicator es hat bereits eine neue Zeile, - es spielt keine Rolle, was folgt _, nur, dass es keine gültige Zeile auf der linken Seite oder darüber gibt
Taylor Scott

Was passiert , wenn es wie folgt eingebettet: myfunction( \n_ )?
Deduplizierer

@Deduplicator Das Zeilenfortsetzungszeichen muss sich in derselben Zeile befinden, in der es sich befindet, dh Public Function Foo( ByVal bar as Integer, _ (neue Zeile). bas as long) as doubleWenn Sie also die von Ihnen beschriebene Funktion aufrufen , würde dies zu einem Fehler führen
Taylor Scott

Ok, in diesem Fall ist es eher so myfunction( _ \n_ ). Entschuldigung für die Verwirrung. Anders ausgedrückt, Sie hätten zwei Zeilenumbrüche verwenden sollen.
Deduplizierer

3

SmileBASIC, 2 Bytes


!

Nach dem Ende einer Zeile wird nichts mehr fortgesetzt. Sie brauchen also nur einen Zeilenumbruch, gefolgt von etwas, das nicht der Anfang einer Anweisung sein kann. !ist der logische Nicht-Operator, aber Sie dürfen das Ergebnis eines Ausdrucks nicht ignorieren, daher wäre auch so etwas !10ungültig ( X=!10natürlich solange es funktioniert).

Ähnliche Dinge funktionieren in jeder Sprache, in der alles am Ende einer Zeile endet, solange der Code analysiert wird, bevor er ausgeführt wird.

Es gibt eine Menge alternativer Zeichen, die hier verwendet werden könnten. Daher halte ich es für interessanter, diejenigen aufzulisten, die möglicherweise gültig sind.

@ist beispielsweise der Beginn eines Etiketts @DATA; (könnte Teil eines Ausdrucks sein, wie er (X)=1aus irgendeinem Grund erlaubt ist; ein beliebiger Buchstabe oder _könnte ein Variablenname X=1, ein Funktionsaufruf LOCATE 10,2oder ein Schlüsselwort sein WHILE 1; 'ist ein Kommentar; und ?ist die Abkürzung für PRINT.


Oh, aus irgendeinem Grund wurde der Beitrag, als ich ihn bearbeitete, dupliziert ...
12Me21

3

INTERCAL , 12 Bytes

DOTRYAGAINDO

Versuchen Sie es online zu knacken!

Der Ansatz von INTERCAL bei Syntaxfehlern ist etwas Besonderes. Im Grunde genommen wird eine ungültige Anweisung nur dann fehlerhaft, wenn das Programm versucht, sie auszuführen. Tatsächlich PLEASE NOTEbeginnt die idiomatische Syntax für Kommentare damit , dass eine Anweisung wirklich nur gestartet wird , dass sie nicht ausgeführt werden soll, und beginnt sie dann mit dem Buchstaben E. Wenn sich Ihr Code DODOin der Mitte befindet, können Sie DOABSTAINFROM(1)(1)eine gültige Anweisung voranstellen und am Ende anheften, und es ist in Ordnung, wenn Sie die DODODOAusführung einfach um diese herum biegen können (1)DON'TDODODOCOMEFROM(1). Auch wenn INTERCAL keine String-Literal-Syntax zum Ausblenden hat, können mit Syntaxfehlern keine unzulässigen Strings erstellt werden, selbst wenn alle möglichen Zeilennummern mit erschöpft sind(1)DO(2)DO...(65535)DODODO, da es so aussieht, als ob es durchaus möglich ist, doppelte Zeilennummern zu haben, wenn man COME FROMmit einer von ihnen arbeitet.

Um eine illegale Zeichenfolge zu machen, müssen wir tatsächlich eine perfekt gültige Aussage verwenden: TRY AGAIN. Auch wenn es nicht ausgeführt wird, muss es unbedingt die letzte Anweisung in einem Programm sein, wenn es überhaupt im Programm enthalten ist. 12 Bytes sind meines Wissens die kürzeste Zeit, die eine ungültige Zeichenfolge verwenden kann TRY AGAIN, da sie sicherstellen muss, dass eine Anweisung dahinter steht (ausgeführt oder nicht), also DOTRYAGAINnur normaler Code, und sicherstellen muss, dass die gesamte Anweisung verwendet wird in der Tat ist TRY AGAIN, so TRYAGAINDOnicht funktioniert , weil es leicht in ein ignoriert, normalen Syntaxfehler gedreht werden kann: DON'TRYAGAINDOGIVEUPoder PLEASE DO NOT TRY TO USE TRYAGAINDO NOT THAT IT WOULD WORK. Egal, auf was Sie sich begeben DOTRYAGAINDO, Sie werden entweder ICL993I I GAVE UP LONG AGOmit ICL079I PROGRAMMER IS INSUFFICIENTLY POLITE, oder irren ICL099I PROGRAMMER IS OVERLY POLITE.


Möglicherweise gibt es einige andere Fehler bei der Kompilierung, die zuvor ausgelöst werden können ICL993I I GAVE UP LONG AGO.
Nicht verwandte

Wenn Sie bei der Verwendung aller Zeilenbeschriftungen auch COME FROMalle Zeilenbeschriftungen verwenden, kann es etwas schwierig sein, den Steuerungsfluss um den Block herum umzuleiten, aber Sie können einfach nichts dagegen tun GIVING UP!
Nicht verwandte

3

AWK , 4 Bytes



/

Probieren Sie es online!

Da AWKes keine Methode für mehrzeilige Kommentare gibt, müssen Sie 2 Zeilenvorschübe und 1 Zeile danach einfügen /, um das Auskommentieren oder Verwandeln in einen regulären Ausdruck zu verhindern, z 1/. B. Hinzufügen . Die häufigste Meldung ist `unerwarteter Zeilenumbruch oder Ende der Zeichenfolge.

Mit vorherigen Riss


2

Fortran, 14 Bytes


end program
e

Keine mehrzeiligen Kommentare oder Präprozessor-Direktiven in Fortran.


1
Gibt es eine gute Möglichkeit, dies online zu testen? Auch welche Version / Compiler von Fortran?
Robert Benson

2

JavaScript (Node.js) , 9 8 Bytes

`*/
\u`~

Probieren Sie es online!

Ich denke, das sollte illegal genug sein.

Frühere JS-Versuche in anderen Antworten

; * / \ u)

Mit @Cows quaken

Als eine ES5-Antwort sollte dies gültig sein, aber in ES6 zerstört das Umschließen des Codes mit einem Paar Backticks dies. Infolgedessen müssen gültige ES6-Antworten Backticks beinhalten.

`
`* /} '" `\ u!

Von @iovoid

Dies ist eine verbesserte Version mit Backticks. Doch ein einziger , /nachdem der Code diese bricht (Es wird eine Vorlage wörtliche durch einen regulären Ausdruck multipliziert wird, nutzlos , aber syntaktisch gültig.) Gemacht @Neil einen Vorschlag , dass eine Änderung !zu ). Dies sollte theoretisch funktionieren, da das Hinzufügen /am Ende nicht mehr funktioniert (aufgrund eines fehlerhaften regulären Ausdrucks).

Erläuterung

`*/
\u`~

Dies ist an sich illegal und blockiert auch alle einfachen und doppelten Anführungszeichen, da sich diese Anführungszeichen nicht über Zeilen ohne ein \am Ende einer Zeile erstrecken können

//`*/
\u`~

und

/*`*/
\u`~

Blockiert Kommentare durch die Einführung illegaler Escape-Sequenzen

``*/
\u`~

Blockiert das anfängliche Backtick, indem nicht abgeschlossenes RegExp-Literal eingeführt wird

console.log`*/
\u`~

Blockiert mit Tags versehene Vorlagenliterale, indem ein erwarteter Operator zwischen zwei Backticks eingefügt wird


2

Rockstar , 4 5 Bytes

Durchgestrichen 4 ist noch 4 :(

)
"""

Rockstar ist eine sehr ... wortreiche Sprache.
Während "kann verwendet werden , um eine Zeichenfolge, wie zu definieren Put "Hello" into myVares, mein Wissen gibt keine Möglichkeit für 3 Zitate außerhalb eines Kommentars zu erscheinen, und die Nähe sorgt für paren das wird in Klammern auch nicht (Kommentare in Rockstar passiert eingeschlossen, wie diese).

Rockstar hat auch eine poetische wörtliche Syntax, in der die Zeichensetzung ignoriert wird. Die neue Zeile stellt also sicher, dass die drei Anführungszeichen den Anfang einer Codezeile bilden, die immer ungültig sein sollte


Was ist (()"""), wäre das nicht ein No-Op?
21.

@BMO erste Paren öffnet einen Kommentar, 2. Paren macht nichts, weil es kommentiert ist, 3. Paren schließt den Kommentar, dann haben Sie """)als Code analysiert, der ungültig ist
Skidsdev

Hmm, verschachtelte Kommentare sind nicht in der Spezifikation enthalten. Kommentare scheinen sowieso entmutigt zu sein. Aber Sie haben poetische String-Literale überwacht , die jeden String zulassen. Das Goethe says )"""ist also gültig .
22.

@BMO guter Punkt, kann durch Einfügen eines Zeilenumbruchs zwischen )und"""
Skidsdev 23.11.18

2

Powershell, 10 8 12 14 13 14 16 Bytes

-2 Byte dank Mazzy, der dank IsItGreyOrGray einen besseren Weg findet, es
zu knacken +4 -1 Byte

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

Ich hoffe das funktioniert. 'und "um Anführungszeichen #>zu vermeiden, den Blockkommentar zu unterbrechen, neue Zeilen, um den einzeiligen Kommentar zu stoppen, '@und "@um einen anderen Zeichenfolgestil abzufangen, und startet dann ein falsches Array, um einen Syntaxfehler auszulösen.

Die Logik ist, dass sie keinen Satz von Anführungszeichen verwenden können, um hineinzukommen, sie können ihn nicht auskommentieren. Wenn @"verwendet, wird ein Here-String erzeugt, der danach kein Token haben kann, und wenn sie Lass es in Ruhe, es wird versuchen, ein kaputtes Array zu erstellen. Diese Aussage will so hart leben, ich finde immer noch mehr Löcher in der Rüstung.


1
Oder Beschützer +@=
mazzy

1
@IsItGreyOrGray AAAAAAAAAAAw heck.
Veskah

2
Es sieht so aus, als würde das Ändern von #> in $ #> dazu führen, dass "der Name eines Cmdlets nicht erkannt wird ...". Es könnte irgendwie wieder legal gemacht werden, aber ich habe keine Möglichkeit. Noch. :)
GreyOrGray

1
@IsItGreyOrGray Sonofagun. Jetzt mit Semikolon-Rüstung?
Veskah,

1
Nett! Ich habe nichts. Alles, was ich versucht habe, ist fehlgeschlagen.
GreyOrGray

2

Runenverzauberungen, 3 Bytes

Eine von vielen möglichen Variationen.

Probieren Sie es online!

Runic verwendet die Unicode-Kombination von Zeichen in einem " MÄndert das Verhalten von C" (wobei Cein Befehl ist). Aus diesem Grund dürfen keine zwei Modifikatoren denselben Befehl ändern, und der Parser gibt einen Fehler aus, wenn ein solches Vorkommen gefunden wird.

In ähnlicher Weise können bestimmte Befehle, die die IP umleiten, auf keine Weise geändert werden, da richtungsändernde Änderungszeichen vorhanden sind (und beide in derselben Zelle keinen Sinn ergeben).

Es gibt keine Möglichkeit, die Zeichenfolge zu entkommen oder sie wörtlich zu verwenden, um sie gültig zu machen. Tio Link enthält ein ;, um den Fehler "kein Abschlusszeichen" mit höherer Priorität zu umgehen.


2

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

A

(24500 Mal)

TI (-83 + / 84 + / SE) -Basic prüft die Syntax nur für Anweisungen, die es erreicht, sodass auch 5000 EndAnweisungen in einer Zeile mit einem übersprungen werden können Return. Dies kann im Gegensatz dazu nicht in den RAM eines TI-83 + / 84 + / SE passen, daher kann kein Programm diesen String enthalten. Ein bisschen konservativ mit der Anzahl der Charaktere.

Der ursprüngliche TI-83 verfügt über 27000 Byte RAM. AIn diesem Fall benötigen Sie 27500 s.

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

"

Newline, Zitat, Newline. In der neuen Zeile werden alle Kommentare geschlossen (und das Einbetten des unzulässigen Zeichens in eine Zeichenfolge ist nicht zulässig, da AFAIK-Konstanten für mehrzeilige Zeichenfolgen nicht zulässig sind). In der anderen Zeile wird das Schließen der Zeichenfolge nicht zulässig, und im Anführungszeichen wird ein Syntaxfehler angezeigt.

Sie können mit auf 2 Bytes kommen

±

ohne die newline, aber ich bin mir nicht sicher, ob das zählt, weil ±es nur in string konstanten gültig ist.


Fertig, danke :)
BB94

2

Los , 6 Bytes


*/```

Versuchen Sie es online zu knacken!

Der gravierende Akzent (`) markiert ein unformatiertes Zeichenfolgenliteral, in dem alle Zeichen außer`, einschließlich Zeilenumbrüchen und umgekehrten Schrägstrichen, als Teil der Zeichenfolge interpretiert werden. Drei `s in einer Reihe sind der Kern: benachbarte String-Literale sind ungültig und` schließen immer einen ` String, so dass es keinen Sinn gibt, sie zu verstehen. Ich musste 3 weitere Bytes als Umgehungsschutz verwenden, eine neue Zeile, damit wir uns nicht in einem einzeiligen Kommentar oder einer normal zitierten Zeichenfolge befinden können, und ein * /, damit wir uns nicht in einem mehrzeiligen Kommentar befinden können.


1

SILOS , 4 Bytes

Silos ist wettbewerbsfähig \ o /


x+

SILOS läuft auf einem Interpreter / Compiler mit zwei Durchläufen. Vor der Ausführung versucht ein "Compiler", die Quelle in ein Array zu vereinfachen, das die Quelle beschreibt. Jede Zeile wird separat behandelt. x + a ist ein Zuweisungsoperator, der ea zum Wert von x hinzufügt und in x speichert. Der "Compiler" wird jedoch brechen. Daher nehmen wir diese Zeichenfolge und fügen eine neue Zeile hinzu, bevor und nachdem sichergestellt ist, dass sie in einer eigenen Zeile steht und den Compiler unterbricht.

Probieren Sie es online!


Warum kommt kein ax+Fehler raus?
Erik der Outgolfer

undefined compiler behaviour @EriktheOutgolfer
Rohan Jhunjhunwala

1

AutoHotkey , 5 Bytes

`ist das Fluchtzeichen. Sie können ein "nur entziehen, wenn Sie es einer Variablen zuweisen.

\ n * / verhindert, dass es auskommentiert oder einer Variablen zugewiesen wird.


*/`"

1

JavaScript, 11 Zeichen

`
`*/}'"`\u)

Die Backticks sorgen dafür, dass Template-Strings getötet werden, die Anführungszeichen werden von Strings befreit, die Newline vermeidet kommentierte Zeilen, das Ende des Kommentars vermeidet Block-Kommentare und das letzte Backtick und Escape (mit einem!, Um das Anhängen von Zahlen zu vermeiden) versuchen, ein ungültiges zu starten Zeichenfolge.

Probieren Sie es online!



Die ES5-Antwort verwendete eine )nach der \u, vielleicht würde das hier funktionieren?
Neil
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.