Znajdź nielegalny ciąg

81

Wyzwanie polega na znalezieniu ciągu znaków, który nie może pojawić się w żadnym legalnym programie w wybranym języku programowania. Obejmuje to komentarze, ciągi znaków lub inne części „niewykonywalne”.

Wyzwanie

  • Twój program może być specyficzny dla konkretnej wersji lub implementacji kompilatora / interpretera / środowiska wykonawczego Twojego języka. Jeśli tak, proszę podać dane szczegółowe.
  • Dozwolone są tylko standardowe opcje kompilatora / interpretera / środowiska wykonawczego. Nie można przekazać dziwnej flagi do kompilatora, aby uzyskać określony wynik (np. Przekazanie flagi w celu konwersji ostrzeżeń na błędy).
  • Jeśli Twój język programowania wymaga specyficznego kodowania (np. UTF-8), łańcuch znaków również musi być poprawnie zakodowany (tzn. Łańcuchy, które zawodzą wyłącznie z powodu błędów dekodowania znaków, nie są dozwolone).
  • Każda indywidualna postać w twoim zgłoszeniu musi być dopuszczalna w legalnym programie; to znaczy, nie możesz po prostu użyć postaci, która jest zawsze odrzucana.
  • Kompilator / interpreter / środowisko wykonawcze musi dawać błąd, gdy podany zostanie dowolny kod źródłowy zawierający ciąg znaków jako podłańcuch. Błąd nie musi być taki sam we wszystkich programach - jedno osadzenie łańcucha może powodować błąd składniowy, a inne może powodować błąd w czasie wykonywania.

Punktacja

  • Najkrótszy ciąg niedozwolony dla każdego języka wygrywa.
  • Powinieneś wyjaśnić, dlaczego twój ciąg jest nielegalny (dlaczego nie może pojawić się nigdzie w legalnym programie).
  • Spory dotyczące niewłaściwych rozwiązań w komentarzach. Mówiąc dokładniej, powinieneś podać link do TIO lub równoważnego programu demonstrującego legalny program (tj. Taki, który nie powoduje żadnych błędów), który zawiera proponowane podciągi.
  • Niektóre języki (np. Bash, Batch, Perl) pozwalają na dołączanie dowolnych danych binarnych do programu bez wpływu na ważność (np. Używanie __DATA__w Perlu). W przypadku takich języków możesz przesłać rozwiązanie, które może pojawić się tylko w takiej końcowej sekcji. Zanotuj to w swojej odpowiedzi. (Definicja tej „końcowej sekcji” jest zależna od języka, ale ogólnie oznacza dowolny tekst po całkowitym zaprzestaniu czytania skryptu przez analizator składni).

Przykład

W Pythonie mogę się przesłać

x
"""
'''

ale można to osadzić w większym programie

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

więc nie jest to dopuszczalne.

nneonneo
źródło
2
Czy kontrprzykład może polegać na danych wejściowych STDIN?
Zacharý
5
Czy byłoby to dobre CnR?
CalculatorFeline
2
Chyba za późno, ale wygląda na to, że mogło to być wyzwanie dla gliniarzy i rabusiów. Jest wiele umiejętności widocznych w próbach tworzenia prawidłowych programów, a także wymyślaniu ciągów.
user2390246,
4
Moje kondolencje dla prób Perla. :)
Kaz
2
Jestem pewien, że jest to całkowicie niemożliwe w niepiśmiennych Haskell, dzięki zagnieżdżonym komentarzom.
dfeuer

Odpowiedzi:

57

Zmiana nazw , 2 bajty




To dwa kanały. Prawidłowe zmienianie nazw musi zawsze tworzyć idealny kwadrat drukowanych znaków ASCII, więc nie może zawierać dwóch wierszy wiersza z rzędu.

Błąd jest zawsze błędem analizatora składni i zawsze jest taki sam:

This shape is unpleasant.

wraz z kodem wyjścia 1 .

Wypróbuj online!

Dennis
źródło
Działa to również z 2Col . Wypróbuj online! . Ale powodem tego, że dzieli się na 2Col, jest to, że każda linia musi składać się dokładnie z 2 znaków, ale pusta linia to łamie.
Kritixi Lithos
2
+1, ponieważ automatycznie wygrywa, ponieważ rozwiązania 1-bajtowe są niedozwolone, ponieważ „nie można po prostu użyć postaci, która zawsze jest odrzucana”.
Zacharý
1
@Cowsquack tfw Zapomniałem o swoim własnym języku
Skidsdev
1
@Skidsdev tfw Ponownie zapomniałem o swoim własnym języku i zapomniałem, że zapomniałem o swoim własnym języku
Skidsdev,
@ Zacharý Co z rozwiązaniami 0-bajtowymi?
PyRulez,
32

Java, 4 bajty

;\u;

Wypróbuj online!

Jest to niepoprawna sekwencja ucieczki Unicode i spowoduje błąd w kompilatorze.

error: illegal unicode escape
Kritixi Lithos
źródło
Nie działa - można mieć dosłowny ciąg znaków "\\u;".
feersum
@feersum Naprawiono kosztem jednego bajtu
Kritixi Lithos
21
@TheLethalCoder: Java przetwarza kod źródłowy, aby zmienić zmiany znaczenia \uXXXXprzed wykonaniem czegokolwiek innego, więc tak, zadziała to nawet w komentarzach.za
nneonneo
3
Wydaje mi się, że jest to najkrótsza odpowiedź Java w historii tej strony.
Magic Octopus Urn
1
@MagicOctopusUrn W rzeczywistości jest ta 0 bajtowa odpowiedź Java (która nie jest już aktualna w bieżącej meta, ponieważ jest wysyłana do STDERR zamiast STDOUT). Chociaż oba są dość niesamowite i sprytne. :)
Kevin Cruijssen
25

COBOL (GNU) , 8 bajtów


THEGAME

Po pierwsze, podawanie wiersza, aby zapobiec wstawianiu mojego słowa w komentarzowym wierszu.

Następnie, historycznie, programy COBOL były drukowane na arkuszach kodujących, kompilator w dużej mierze opiera się na 80-znakowych ograniczonych liniach, nie ma komentarzy wielowierszowych, a pierwsze 6 znaków to komentarze (często używane jako edytowalne numery wierszy), możesz umieścić tam prawie wszystko , AFAIK. Wybrałem THEGAMna początku następnego wiersza.

Następnie siódmy symbol w dowolnym wierszu akceptuje tylko bardzo ograniczoną listę znaków: spację (bez efektu), gwiazdkę (komentuje resztę wiersza), łącznik, ukośnik, mogą być inne, ale na pewno nie E.

Na przykład błąd podany przez GnuCobol to:

error: invalid indicator 'E' at column 7

Wypróbuj online!

Właśnie straciłeś grę.

PhilDenfer
źródło
30
Also, you just lost the game.Prawie przegłosowałem
Stephen
24

JavaScript, 7 bajtów


;*/\u)

Uwaga wiodący nowy wiersz.

  • \u) jest niepoprawną sekwencją ucieczkową Unicode i dlatego ten ciąg jest nieprawidłowy
  • Dodanie //na początku nadal nie będzie działać z powodu wiodącej nowej linii, pozostawiając drugą linię bez komentarza
  • Dodanie a /*nie spowoduje całkowitego odkomentowania łańcucha ze względu na zamknięcie, */które go dopełnia, pozostawiając \u)odsłonięte
  • Jak stwierdził @tsh, dolna linia może zostać zamieniona na wyrażenie regularne przez dodanie /łańcucha po, więc mając )przed nim \umożemy zapewnić, że literał wyrażenia regularnego zawsze będzie nieprawidłowy
  • Jak stwierdził @asgallant, można zrobić, 1||1(string)/aby uniknąć konieczności oceny wyrażenia regularnego. Średnik na początku drugiej linii powstrzymuje to przed zakończeniem wyrażenia, 1||1zanim dotrze ono do drugiej linii, wymuszając w ten sposób błąd SyntaxError ;*.

Spróbuj!

Kritixi Lithos
źródło
2
/* */\u0045 = 3wydaje się prawidłowym kodem JavaScript.
tsh
2
3 */\u;/jest ciągle ważny.
tsh
3
Warto zauważyć, że od ES2018 (która nie będzie urzędnik do końca tego roku) można po prostu zawinąć całość w backticks spowodowane tym . Prawdopodobnie możesz to naprawić, po prostu wstawiając backstick po /(nie, że musisz to naprawić). (Poza tym ;, nie wymusza parsowania złego wyrażenia regularnego, wymusza błąd SyntaxError z *.)
ETHprodukcje
1
@Leushenko Ale to nie działa, #if 0jak pokazano tutaj: Wypróbuj online!
Kritixi Lithos
3
W nowszych wersjach JS String.raw z ciągiem szablonu może sprawić, że nie zostanie on zerwany , ponieważ nieprawidłowe wyjście nie powiedzie się. Byłby to: String.raw`code tutaj`
iovoid
15

Python, 10 bajtów (nie cpython)


?"""?'''?

Uwaga wiodący nowy wiersz. Nie można go skomentować z powodu nowej linii i żadna kombinacja ciągów z potrójnymi cytatami nie powinna działać, jeśli pomyślałem o tym poprawnie.

@feersum w komentarzach wydaje się całkowicie zepsuć dowolny program cpython w systemie Windows, o ile mogę to stwierdzić, dodając znak 0x1A na początku pliku. Wydaje się, że być może (?) Wynika to ze sposobu, w jaki znak ten jest obsługiwany przez system operacyjny, najwyraźniej jest przetłumaczony na EOF, gdy przechodzi przez stdin z powodu jakiegoś starszego standardu DOS.

W bardzo realnym sensie nie jest to problem z Pythonem, ale z systemem operacyjnym. Jeśli utworzysz skrypt w języku Python, który czyta plik i korzysta z wbudowanego compilew niego pliku , daje bardziej oczekiwane zachowanie powodujące błąd składniowy. Pypy (który prawdopodobnie robi to tylko wewnętrznie) również generuje błąd.

Edytować:

Ze względu na staranność @ feersum w znajdowaniu niejasnych sposobów na złamanie interpretera Pythona, ta odpowiedź jest całkowicie nieważna dla każdego typowego środowiska cpython, o ile mi wiadomo! (Python 2 i 3 dla systemów Windows i Linux) Nadal uważam, że te pęknięcia nie będą działać dla Pypy na żadnej platformie (jedyna inna implementacja Pythona, którą przetestowałem).

KSab
źródło
1
@officialaimm rozważyć"""?'''"""
KSab
3
Stworzyłem program z tym podciągiem, który działa na moim komputerze. Myślę jednak, że nie działa na wielu tłumaczach / platformach / wersjach. Czy możesz określić, którą wersję interpretera i systemu operacyjnego Python dotyczy ta odpowiedź?
feersum
1
Python 3 w systemie Windows 7 jest dokładnie tam, gdzie działa mój crack. Pastebin programu zakodowanego w base64
feersum
1
Ja też mogę to złamać. Po prostu umieść znak 0x1A na początku pliku, a cała reszta zostanie zignorowana (tak naprawdę działa to również w Pythonie 3).
feersum
1
Wiem, że to naprawdę stare, ale po pracy z niektórymi osobami w Python Discord znaleźliśmy ten crack , chociaż nie wiem, czy zmianę kodowania można uznać za oszustwo
EdgyNerd
14

C (clang) , 16 bajtów

 */
#else
#else

Wypróbuj online!

*/zamyka każdy /*komentarz, a wiodące miejsce zapewnia, że ​​nie uruchomiliśmy tylko jednego. Nowa linia zamyka każdy //komentarz i przerywa dosłowny ciąg znaków. Następnie powodujemy błąd #else without #iflub #else after #elsebłąd (niezależnie od tego, ile #if 0s może być w środku).

Anders Kaseorg
źródło
2
Ponieważ wydaje się, że nieprzetworzone ciągi C ++ 11 działają, rozwiązanie gcc jest niemożliwe.
feersum
@feersum Huh, TIL, że GCC akceptuje te w kodzie C. Mogę określić -std=c99, ale spróbujmy przełączyć na clang.
Anders Kaseorg,
3
Jestem naprawdę zaskoczony, że gcc akceptuje nieprzetworzone ciągi C ++ 11. Określenie wersji lub implementacji kompilatora jest całkowicie OK, więc jeśli jest nielegalne w Clang, jest to uczciwa gra.
nneonneo
1
@ l4m2 Nie mogę przeanalizować twojego pytania (kto to jest, i co masz na myśli?), ale zauważ, że literał łańcucha surowego C ++ obsługuje niestandardowy ogranicznik: R"foobar(...)foobar"i tylko prawy paren, po którym następuje dopasowany ogranicznik i oferta zamknie to.
Anders Kaseorg,
11

Pyth, 6 bajtów

¡¡$¡"¡

¡jest niezaimplementowanym znakiem, co oznacza, że ​​jeśli parser Pyth kiedykolwiek go oceni, to popełni błąd z PythParseError. Kod zapewnia, że ​​tak się stanie na jednym z nich ¡.

Istnieją trzy sposoby, w których bajt może występować w programie Pyth i nie może być analizowany: w literale łańcuchowym ( "lub .", które są analizowane równorzędnie), w literale Python ( $) i bezpośrednio po \.

Ten kod uniemożliwia \dokonanie oceny bezbłędnie, ponieważ wpływa to tylko na bezpośrednio następujący bajt i na drugie ¡błędy.

$osadza $kod bezpośrednio w skompilowanym kodzie Pythona. Nie zakładam, co może się tam wydarzyć.

Jeśli program osiągnie ten kod w $kontekście, zakończy się na $, a ¡zaraz po nim popełni błąd parsera. Literały Pythona zawsze kończą się na następnym $, niezależnie od tego, co może robić kod Pythona.

Jeśli program uruchomi się w "kontekście, "łańcuch zakończy łańcuch, a kod końcowy ¡spowoduje błąd analizatora składni.

isaacg
źródło
11

Ada - 2 bajty

Myślę, że to powinno działać:


_

To podkreślenie nowego wiersza. Newline kończy komentarze i nie jest dozwolone w ciągu. Podkreślenie nie może podążać za białymi znakami; dawniej było dozwolone tylko po literach i cyfrach, ale wprowadzenie Unicode komplikowało sprawę.

xaambru
źródło
2
Witamy na stronie! :)
DJMcMayhem
9

32-bitowy kod maszynowy x86, 11 bajtów (i przyszłościowy 64-bit)

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

To jest times 9 nop/ ud2. Zasadniczo jest to sanie NOP , więc nadal działa jako 0 lub więcej nops, a następnie ud2generuje wyjątek, niezależnie od tego, ile 0x90bajtów zostało wykorzystanych jako operandy do poprzedniego kodu operacyjnego. Inne instrukcje jednobajtowe (jak times 9 xchg eax, ecx) też by działały.

64-bitowy kod maszynowy x86, 10 bajtów (aktualne procesory)

W trybie 64-bitowym jest kilka niedozwolonych instrukcji 1-bajtowych, dopóki jakieś przyszłe rozszerzenie ISA nie zmieni ich przeznaczenia jako przedrostków lub części wielobajtowych kodów operacyjnych tylko w trybie 64-bitowym, niezależnie od ich znaczenia w trybie 32-bitowym. 0x0ejest push csw trybie 32-bitowym, ale nielegalne na obecnych procesorach (testowane na Intel Skylake) w wersji 64-bitowej

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

Interpretacja reguł dla wykonywalnego kodu maszynowego :

  • Bajtów nie można przeskoczyć (podobnie jak ograniczenie „nieparsowane”), ponieważ procesory nie zgłaszają wyjątków, dopóki nie spróbują dekodować / wykonać (nie spekulacyjnie).

  • Nielegalne środki zawsze powodują wyjątek, na przykład wyjątek niezgodny z instrukcją. (Prawdziwe programy mogą to wykryć za pomocą procedury obsługi wyjątków na czystym metalu lub zainstalować procedurę obsługi sygnałów systemu operacyjnego, ale myślę, że to oddaje ducha wyzwania.)


Działa, ponieważ krótszy ciąg bajtów kończący się na ud2może pojawić się jako imm32 i / lub część trybu adresowania dla innej instrukcji lub podzielić na parę instrukcji . Najłatwiej jest o tym pomyśleć w kategoriach tego, co można umieścić przed ciągiem, aby „zużyć” bajty jako część instrukcji i pozostawić coś, co nie będzie winy.

Myślę, że instrukcja może zużyć maksymalnie 9 bajtów dowolnych rzeczy: bajt SIB, disp32 i imm32. tzn. pierwsze 2 bajty tej instrukcji mogą zużywać 8 NOP i ud2, ale nie 9.

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

Nie można pokonać 9 zawodników:

    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    

Tryb 64-bitowy:

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

Ale bajty dla 8 NOP + ud2 (lub times 9 db 0x0e) mogą pojawiać się jako część innych 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
  ...
Peter Cordes
źródło
Reguły tutaj nie były wystarczająco jasne, abym rozważył opublikowanie odpowiedzi na kod asm / maszynowy. Na przykład, dlaczego nie możesz tego zrobić ud2? Wygląda na to, że mówisz, że interpretujesz zasady jako zabraniające przeskakiwania bajtów, więc ud2samo by to zadziałało, nie? Och… Chyba mówisz, że problem polega na tym, że ud2może występować jako przedrostek prawidłowej instrukcji? Druga część tej odpowiedzi była dla mnie trochę trudna do zrozumienia.
Cody Gray
@CodyGray: Racja, 2 bajty, które kodują, ud2mogą pojawić się w imm32dowolnej instrukcji. Myślałem o tym w kategoriach bajtów, które możesz umieścić przed takim ciągiem, który „konsumuje” 0f 0bjako część wcześniejszej instrukcji zamiast dekodować jako ud2. Nie byłem do końca zadowolony z tego, jak to skończyłem, ale chciałem zilustrować, dlaczego tylko 8 nops nie wystarczyło i co się stało z 9 nops + ud2.
Peter Cordes
@CodyGray: Program źródłowy asm byłby zupełnie inną odpowiedzią. Musiałoby to spowodować błąd analizatora składni używanego przez asembler, a nie generowanie błędnego kodu maszynowego. Tak więc coś takiego %else/ %elsemoże działać, aby pokonać %if 0, co normalnie może zabezpieczyć każdy niepoprawny tekst przed parsowaniem. (pomysł z odpowiedzi CPP)
Peter Cordes
Nie do końca zaspokajam. Twoje rozwiązanie może znajdować się w .data. (choć to uniemożliwia)
l4m2
@ l4m2: Aby pytanie było odpowiedzialne / interesujące, musiałem ograniczyć je do kodu, który został wykonany (a nie przeskoczył). Zobacz punktację interpretacji zasad w mojej odpowiedzi. To oczywiście wykluczałoby również dane statyczne. Ponieważ wtedy nie jest to wcale kod maszynowy, to tylko dane. To pytanie wymagało większej adaptacji niż większość, aby odpowiedź kodu maszynowego miała sens, ponieważ nie ma etapu kompilacji / asemblowania, w którym można by pomylić parser, mówimy tylko o bajtach już w pamięci.
Peter Cordes,
7

C #, 16 bajtów


*/"
#endif<#@#>

Działa, ponieważ:

  • // komentarz nie będzie działał z powodu nowej linii
  • /* komentarz nie zadziała z powodu */
  • Nie możesz mieć stałych w samym kodzie
  • Dodawanie #if falsedo początku nie będzie działać z powodu#endif
  • "Zamyka dowolny ciąg dosłowny
  • <#@#>Jest bezimienny dyrektywa więc nie dla szablonów T4.
  • Nowa linia oszuka to, więc posiadanie /na początku nie oszuka*/

Każda odmiana kończy się niepowodzeniem z błędem kompilacji.

TheLethalCoder
źródło
1
Dziwne, że zdecydowałeś się dołączyć szablony T4 do swojego kodu. Czy T4 nie jest uważany za osobny język?
Arturo Torres Sánchez
1
@ ArturoTorresSánchez Nie wiem, nigdy o nich nie słyszałem. Ktoś skomentował, że to nie działa, gdy dołączasz szablony T4, więc dodałem poprawkę.
TheLethalCoder
5

Pisz Haskell , 15 bajtów

Naprawianie usuniętej próby przez nich.


\end{code}
5
>

Wypróbuj online!

Oryginalna próba nich to dwie ostatnie linie, oparte na Literate Haskell, która nie pozwala >na to, aby kod alfabetu stylu znajdował się w sąsiedniej linii do literackiej linii komentarza ( 5tutaj). Nie powiodło się, ponieważ można go osadzić w komentarzu w alternatywnym stylu pisania („LaTeX”):

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

Jednak \begin{code}styl Literate Haskell nie zagnieżdża się, ani sam w sobie, ani w {- -}komentarzach wieloliniowych, więc umieszczając linię \end{code}tuż przed linią z 5, to obejście zawodzi i nie widzę innego.

Ørjan Johansen
źródło
4

Free Pascal, 18 bajtów


*)}{$else}{$else}

Najpierw zamknij wszystkie możliwe komentarze, a następnie obsłuż kompilację warunkową.

Proszę o komentarz tutaj, jeśli coś zapomniałem.

tsh
źródło
3
@ user902383 Czy twój przykład zawiera wiodący nowy wiersz jego fragmentu?
Brian J
@BrianJ nie, myślałem, że to tylko problem z formatowaniem, mój zły
user902383
Nie sądzę, że jest to możliwe w Free Pascal. Po prostu włóż je później begin end..
jimmy23013
@ jimmy23013, ale wygląda na to, że kody po end.uzyskaniu ważności są dozwolone przez pytanie.
tsh
4

Commodore 64 Basic, 2 bajty


B

(to nowa linia, po której następuje litera „B”).

Każda linia w programie Commodore 64 musi zaczynać się od numeru linii lub słowa kluczowego BASIC, a zapisane programy zezwalają tylko na numery linii. Brak słów kluczowych rozpoczynających się od „B” (lub „H”, „J”, „K”, „Q”, „X”, „Y” lub „Z”).

znak
źródło
Jeśli się do tego dołączę, stanie się =0to po prostu oświadczeniem o przydziale ...
Neil
1
@ Neil, byłoby to prawidłowe polecenie trybu natychmiastowego, ale nie prawidłowy program.
Mark
4

Brain-Hack (odmiana Brain-Flak ), 3 2 bajty

Podziękowania dla Kreatora pszenicy za wskazanie, że Brain-Hack nie obsługuje komentarzy, co oszczędza mi bajt.

(}

Wypróbuj online!

Riley
źródło
Jak robisz komentarze w Brain-Flak? Nie wiem, jak to zrobić.
Erik the Outgolfer
@EriktheOutgolfer # TIO
Riley
Nieudokumentowane zachowanie.
Erik the Outgolfer
@EriktheOutgolfer Zawsze zakładałem, że gdzieś zostały udokumentowane. Spróbuję je dodać.
Riley,
Nie potrzebujesz nowej linii w BrainHack ani Craneflak, Rain-Flak jest jedyną z trzech wersji, które mają komentarze do linii. Chociaż Craneflak analizuje w locie, więc niemożliwe jest rozwiązanie tego problemu w Craneflak, każde rozwiązanie można pokonać, przygotowując się (()){()}.
Sriotchilism O'Zaic
3

VBA, 2 bajty

Doprowadzenie wiersza, po którym następuje _znak podkreślenia - działa jako znak kontynuacji linii w VBA, a ponieważ nic nie jest w linii bezpośrednio po lewej lub powyżej kontynuacji linii, w połączeniu z brakiem komentarzy wielowierszowych VBA oznacza, że ​​zawsze spowoduje to kompilację błąd czasuCompile Error: Invalid character


_
Taylor Scott
źródło
Zależysz od wzoru rozpoczynającego się od nowej linii ... więc dodaj nową linię.
Deduplicator,
@Deduplicator ma już nową linię, - nie ma znaczenia, co następuje _, tylko, że nie ma żadnej poprawnej linii po lewej lub powyżej
Taylor Scott
Co jeśli jest osadzony w ten sposób myfunction( \n_ ):?
Deduplicator
@Deduplikator znak kontynuacji linii musi znajdować się w tym samym wierszu, co kontynuacja, tj. Public Function Foo( ByVal bar as Integer, _ (Nowa linia) bas as long) as double- więc tak, spowodowałby błąd, jeśli wywołałeś opisaną funkcję
Taylor Scott
Ok, w takim przypadku to bardziej jak myfunction( _ \n_ ). Przepraszam za zamieszanie. Innymi słowy, powinieneś był użyć dwóch nowych linii.
Deduplicator
3

SmileBASIC, 2 bajty


!

Nic nie przechodzi poza koniec wiersza, więc wszystko czego potrzebujesz to podział wiersza, po którym następuje coś, co nie może być początkiem instrukcji. !jest logicznym operatorem nie, ale nie wolno ignorować wyniku wyrażenia, więc nawet coś takiego !10byłoby niepoprawne ( X=!10oczywiście działa)

Podobne rzeczy będą działać w każdym języku, w którym wszystko kończy się na końcu linii, pod warunkiem, że analizuje kod przed jego wykonaniem.

Istnieje wiele alternatywnych znaków, które mogą być tutaj użyte, więc myślę, że bardziej interesujące byłoby wymienić te, które MOGĄ być prawidłowe.

@jest na przykład początkiem etykiety @DATA; (może być częścią wyrażenia, (X)=1które z jakiegoś powodu jest dozwolone; dowolna litera lub _nazwa zmiennej X=1, wywołanie funkcji LOCATE 10,2lub słowo kluczowe WHILE 1; 'jest komentarzem; i ?jest skrótem od PRINT.

12Me21
źródło
och, z jakiegoś powodu, kiedy edytowałem post, został zduplikowany ...
12Me21
3

INTERCAL , 12 bajtów

DOTRYAGAINDO

Spróbuj go złamać online!

Podejście INTERCAL do błędów składniowych jest nieco wyjątkowe. Zasadniczo niepoprawna instrukcja nie spowoduje błędu, chyba że program spróbuje ją wykonać. W rzeczywistości idiomatyczna składnia komentarzy polega na tym PLEASE NOTE, że zaczyna się od nich , co tak naprawdę dopiero rozpoczyna instrukcję, deklaruje, że nie można jej wykonać, a następnie zaczyna od litery E. Jeśli Twój kod ma go DODOw środku, możesz wstawić DOABSTAINFROM(1)(1)dowolne prawidłowe oświadczenie na końcu i wszystko będzie w porządku, jeśli DODODOmożesz po prostu zgiąć wokół niego wykonanie jako (1)DON'TDODODOCOMEFROM(1). Mimo że INTERCAL nie ma składni dosłownej na ciąg znaków, aby je uciec, nie ma możliwości użycia błędów składniowych do utworzenia niedozwolonego ciągu, nawet wyczerpując każdy możliwy numer wiersza(1)DO(2)DO...(65535)DODODO, ponieważ wydaje się, że istnieje wiele możliwości posiadania zduplikowanych numerów linii podczas COME FROMpracy z dowolnym z nich.

Aby nielegalnej ciąg, faktycznie trzeba użyć doskonale ważne oświadczenie: TRY AGAIN. Nawet jeśli nie zostanie wykonany, musi być ostatnią instrukcją w programie, jeśli w ogóle jest w programie. Według mojej wiedzy 12 bajtów jest najkrótszym możliwym do użycia niedozwolonym łańcuchem TRY AGAIN, ponieważ musi zagwarantować, że po nim jest instrukcja (wykonana lub nie), to DOTRYAGAINjest po prostu normalny kod i musi się upewnić, że cała instrukcja jest rzeczywiście TRY AGAIN, więc TRYAGAINDOnie działa, ponieważ można go łatwo przekształcić w ignorowany, normalny błąd składniowy: DON'TRYAGAINDOGIVEUPlub PLEASE DO NOT TRY TO USE TRYAGAINDO NOT THAT IT WOULD WORK. Bez względu na to, co można umieścić na dowolnej stronie DOTRYAGAINDO, będziesz błędu, ze albo ICL993I I GAVE UP LONG AGO, ICL079I PROGRAMMER IS INSUFFICIENTLY POLITEalbo ICL099I PROGRAMMER IS OVERLY POLITE.

Niepowiązany ciąg
źródło
Może istnieć kilka innych błędów kompilacji, które mogą zostać uruchomione wcześniej ICL993I I GAVE UP LONG AGO.
Niepowiązany ciąg
Jeśli podczas korzystania z każdej etykiety linii, również COME FROMkażdej etykiety linii, może być nieco trudniej zmienić przepływ kontroli wokół bloku, ale nic nie powstrzyma cię od tego GIVING UP!
Niepowiązany ciąg
3

AWK , 4 bajty



/

Wypróbuj online!

Ponieważ AWKnie ma metody wykonywania komentarzy wieloliniowych, potrzebujesz 2 nowych linii przed i 1 po, /aby zapobiec komentowaniu lub przekształceniu go w wyrażenie regularne, np 1/. Dodaj . Najczęstszym komunikatem jest „nieoczekiwany nowy wiersz lub koniec łańcucha”.

Z poprzednim crackem

Robert Benson
źródło
2

Fortran, 14 bajtów


end program
e

Brak komentarzy wielowierszowych lub dyrektyw preprocesora w Fortran.

Steadybox
źródło
1
Czy istnieje dobry sposób na przetestowanie tego online? Ponadto, która wersja / kompilator Fortran?
Robert Benson,
2

JavaScript (Node.js) , 9 8 bajtów

`*/
\u`~

Wypróbuj online!

Myślę, że powinno to być wystarczająco nielegalne.

Poprzednie próby JS w innych odpowiedziach

; * / \ u)

Przez szarlatan @Cows

Jako odpowiedź na ES5 powinna być poprawna, ale w ES6 owijanie kodu parą backsticksa to psuje. W rezultacie poprawne odpowiedzi ES6 muszą obejmować backsticks.

`
`* /} '" \ u!

Przez @iovoid

To jest ulepszona wersja zawierająca backticks. Jednak singiel /po tym, jak kod go złamie (staje się dosłownym szablonem mnożonym przez wyrażenie regularne, bezużyteczne, ale poprawne składniowo). @Neil zasugerował, że zmiana !na ). Powinno to teoretycznie działać, ponieważ dodawanie /na końcu nie działa (ze względu na zniekształcone wyrażenie regularne).

Wyjaśnienie

`*/
\u`~

Jest to samo w sobie nielegalne, a także blokuje wszystkie pojedyncze i podwójne cudzysłowy, ponieważ te cytaty nie mogą rozciągać się na linie bez znaku \na końcu linii

//`*/
\u`~

i

/*`*/
\u`~

Blokuje komentarze, wprowadzając nielegalne sekwencje specjalne

``*/
\u`~

Blokuje początkowy zwrot wsteczny, wprowadzając nie zakończony literał RegExp

console.log`*/
\u`~

Blokuje otagowane literały szablonów, wprowadzając oczekiwany operator między dwoma kursorami wstecznymi

Shieru Asakoto
źródło
2

Rockstar , 4 5 bajtów

Przekreślone 4 to wciąż 4 :(

)
"""

Rockstar to bardzo ... dziwny język.
Chociaż "można go użyć do zdefiniowania ciągu, na przykład, o ile Put "Hello" into myVarwiem, nie ma możliwości, aby 3 cytaty pojawiły się poza komentarzem, a ścisły paren zapewnia, że ​​to się nie stanie (Komentarze w Rockstar są ujęte w nawiasy, takie jak to).

Rockstar ma również poetycką składnię dosłowną, w której interpunkcja jest ignorowana, więc nowy wiersz zapewnia, że ​​3 cudzysłowy są początkiem linii kodu, która zawsze powinna być niepoprawna

Skidsdev
źródło
A co (()"""), czy nie byłby to brak możliwości działania?
ბიმო
@BMO pierwszy paren otwiera komentarz, drugi paren nic nie robi, ponieważ jest skomentowany, trzeci paren zamyka komentarz, a następnie """)analizowany jest kod, który jest nieprawidłowy
Skidsdev
Hmm, zagnieżdżone komentarze nie są w specyfikacji. I tak wydaje się, że komentarze są zniechęcane. Ale nadzorowałeś poetyckie literały ciągów, które dopuszczają dowolny ciąg, więc Goethe says )"""jest to poprawne .
ბიმო
@BMO dobry punkt, można naprawić, wstawiając nowy wiersz pomiędzy )i"""
Skidsdev
2

PowerShell, 10 8 12 14 13 14 16 bajtów

-2 bajty dzięki Mazzy znajdując lepszy sposób na złamanie go
+4 -1 bajtów dzięki IsItGreyOrGray

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

Mam nadzieję, że to zadziała. 'i "zabezpieczyć się przed cudzysłowach, #>aby rozbić blok-komentarz, nowe linie, aby zatrzymać komentarz pojedynczej linii, zarówno '@i "@złapać inny styl ciągów, a następnie rozpoczyna się niewłaściwy tablicę rzucać błąd składni.

Logika polega na tym, że nie mogą użyć żadnego zestawu cudzysłowów, aby się dostać, nie mogą zablokować komentarza, jeśli @"zostanie użyty, utworzy ciąg tutaj, który nie może mieć tokena, a jeśli zostaw to w spokoju, spróbuje zrobić zepsutą tablicę. To oświadczenie chce żyć tak ciężko, że wciąż znajduję jeszcze więcej dziur w zbroi.

Veskah
źródło
1
Lub ochraniacze +@=
mazzy
1
@IsItGreyOrGray AAAAAAAAAAA kurwa.
Veskah
2
Wygląda na to, że zmiana #> na $ #> spowoduje jego uszkodzenie jako „nierozpoznany jako nazwa polecenia cmdlet ...” Może to być jakoś legalne, ale nie mam na to sposobu. Jeszcze. :)
GreyOrGray
1
@IsItGreyOrGray Sonofagun. Teraz masz zbroję z dwukropka?
Veskah
1
Miły! Nic nie mam Wszystko, co próbowałem, zawiodło.
GreyOrGray
2

Runiczne Zaklęcia, 3 bajty

Jedna z wielu możliwych odmian.

Wypróbuj online!

Runiczna używa znaków Unicode łączących znaki w „ Mmodyfikuje zachowanie C” (gdzie Cjest polecenie). W związku z tym żadne dwa modyfikatory nie mogą modyfikować tego samego polecenia, a parser wyśle ​​błąd, jeśli takie wystąpienie zostanie znalezione.

Podobnie, niektóre polecenia przekierowujące adres IP nie mogą być w żaden sposób modyfikowane ze względu na istnienie znaków modyfikujących kierunek (i oba w tej samej komórce nie mają sensu).

Nie ma sposobu na ucieczkę lub dosłowne napisanie łańcucha, aby był on prawidłowy. Łącze Tio zawiera ;w celu ominięcia błędu „brak terminatora” o wyższym priorytecie.

Draco18s
źródło
2

TI-Basic (83 + / 84 + / SE, 24500 bajtów)

A

(24500 razy)

TI (-83 + / 84 + / SE) -Podstawowa sprawdza składnię tylko instrukcji, które osiąga, więc nawet 5000 Endinstrukcji z rzędu można pominąć za pomocą Return. To natomiast nie mieści się w pamięci RAM TI-83 + / 84 + / SE, więc żaden program nie może zawierać tego ciągu. Bycie nieco konserwatywnym w stosunku do postaci liczy się tutaj.

Oryginalny TI-83 ma 27000 bajtów pamięci RAM, więc Aw takim przypadku potrzebujesz 27500 s.

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

"

Nowa linia, cytat, nowa linia. Nowa linia zamyka wszelkie komentarze (i nie zezwala na osadzanie niedozwolonego znaku w łańcuchu, ponieważ stałe wieloliniowe AFAIK nie są dozwolone), druga linia nie zezwala na zamknięcie łańcucha, a cytat powoduje błąd składniowy.

Możesz dostać się do 2 bajtów za pomocą

±

bez nowej linii, ale nie jestem pewien, czy to się liczy, ponieważ ±jest poprawne tylko w stałych ciągów.

bb94
źródło
Gotowe, dziękuję :)
bb94
2

Idź , 6 bajtów


*/```

Spróbuj go złamać online!

Grób akcent (`) oznacza nieprzetworzony ciąg literału, wewnątrz którego wszystkie znaki z wyjątkiem`, włączając znaki nowej linii i odwrotne ukośniki, są interpretowane dosłownie jako część łańcucha. Rdzeń stanowią trzy `` z rzędu '': literały sąsiadujących ciągów są niepoprawne i `zawsze zamyka ciąg` , więc nie ma sposobu, aby je zrozumieć. Musiałem użyć 3 dodatkowych bajtów do obejścia, nowej linii, abyśmy nie mogli znajdować się w komentarzu jednowierszowym lub normalnym cytowanym łańcuchu, a * / więc nie możemy znajdować się w komentarzu wielowierszowym.

Fioletowy P.
źródło
1

SILOS , 4 bajty

Silosy są konkurencyjne \ o /


x+

SILOS działa na dwuprzebiegowym interpretatorze / kompilatorze. Przed wykonaniem „kompilator” próbuje uprościć źródło w tablicy opisującej źródło. Każda linia jest traktowana osobno. x + a to operator przypisania, który doda ea do wartości x i zapisze ją w x. Jednak „kompilator” się zepsuje. Dlatego bierzemy ten ciąg i dodajemy nową linię przed i po upewnieniu się, że jest w swojej własnej linii i przerywa kompilator.

Wypróbuj online!

Rohan Jhunjhunwala
źródło
Dlaczego nie ma ax+błędu?
Erik the Outgolfer
niezdefiniowane zachowanie kompilatora @EriktheOutgolfer
Rohan Jhunjhunwala
1

AutoHotkey , 5 bajtów

`jest znakiem ucieczki. Możesz uniknąć znaku „tylko podczas przypisywania go do zmiennej.

\ n * / zapobiega komentowaniu go lub przypisywaniu do zmiennej.


*/`"
nelsontruran
źródło
1

JavaScript, 11 znaków

`
`*/}'"`\u)

Cofnij się, aby zabijać ciągi szablonów, cytaty pozbywają się ciągów, nowa linia unika komentarzy, linia na końcu unika blokowania komentarzy, a ostatni backstick i ucieczka (z!, Aby uniknąć dołączania liczb), spróbuj rozpocząć nieprawidłowy strunowy.

Wypróbuj online!

iovoid
źródło
Odpowiedź na pytanie ES5 była następująca )po \u, może to by zadziałało tutaj?
Neil