Sahte hata mesajı


18

Derleyicinin veya yorumlayıcının sözdizimi hata iletisini yazdıran bir program yazın. Hata mesajının yanıltıcı olması gerekir, böylece kod yöneticileri hatanın sahte olduğunu bulmak günler alır, yani, gizlemeniz (ve niyetinizi gizlemeniz) anlamına gelir. Ayrıca, hata mümkün olduğunca kesin olmalı ve koda doğru bir şekilde başvurmalıdır.

Uyumlu diller için, kod compile program.p && ./programsağlayıcınızın programı derlemek VE çalıştırmak için komut satırında yapacağını varsayalım , yani çıktının derleyiciden mi yoksa programın kendisinden mi geldiğini ayırt edemez. Ayrıca, kod koruyucunuzun sözdizimi hata mesajlarını açacağını varsayın.

Referans olarak, işte yaptığım bir örnek: https://gist.github.com/359604

DATABölümünde hata mesajının dize kodlar ve karma %abcdefkod çözme tablodur. Yazdırılan hata, ters eğik çizgilere başvurur, bu da kod tutucunun ters eğik çizgileri saymaya çalışmasını sağlar.

Girişler şu şekilde derecelendirilecektir:

  • Kod aldatıcı açık bir niyeti var /6
  • Kod hatayı doğru bir şekilde üretir /16 (noktanız 16 ile başlar ve her yanlışlık için ilgili faktörlere bölün)
    • Doğru büyük harf kullanımı: 4
    • Doğru satır numarası ve sütun numarası: 4
    • Doğru ifade: Her yanlış kelime için 2
  • Referans verilen satır kodu kod bakıcısını yanlış yönlendiriyor /3

Örneğin,

./pythontest1.py: line 7: syntax error near token `('
./pythontest1.py: line 7: `   x=input("Enter a number:") #Number input'

"jetondan önce" beklenmeyen "eksiklik için 8 (16/2) doğruluk derecesi alır, normal bir Python yorumlayıcısı görüntülenir

./pythontest1.py: line 7: syntax error near unexpected token `('
./pythontest1.py: line 7: `   x=input("Enter a number:") #Number input'

"Kodunuz hatayı doğru bir şekilde üretir" noktanızın 1 altındaysa, girişiniz diskalifiye olur.

Beraberlik durumunda, ek derecelendirme faktörleri koyacağım.


Ah ... Sparky'ın objektif olmamasından dolayı son gizleme sorusunu kapattım ve şimdi Peter'ın gizli tuttuğu bir şeyimiz var ve bunu itiraf ediyorum (itiraf ediyorum ki objektiflik elde etmek için cesur bir çaba gösteriyor). Willy-nilly her şey oturmak ya da kişisel önyargı dayalı seçti yerine meta başka bir konu açacağım, ya da belki eski bir konu diriliyorum. Jeff'in "nesnel" bir gereklilik olduğunu düşünüyor gibi göründüğünü unutmayın.
dmckee


Bir çözüm popülerlik yarışması olabilir . Objektif kazanma kriterleri.
Johannes Kuhn

Yanıtlar:


35

piton

import sys,traceback
try:
  f=open(sys.argv[0])
  print eval(f.readline())
except Exception, e:
  traceback.print_exc(0)

Bu, komut satırında bir dosya adı almalı, içindeki ilk satırı değerlendirmeli ve sonucu yazdırmalıdır. 2 hata var. Büyük hata kullanmak gerektiğidir sys.argv[1]değil, sys.argv[0]bu yüzden programın kendisini, ilk argüman ile belirtilen dosyanın içeriklerini değerlendiren biter. İkinci hata ise print_exc, yığının yalnızca en derin çerçevesini basmasını sağlayan argümanın , hatanın içinde gerçekleştiğini gizlemesidir eval. Sonuç olarak, böyle bir hata alırsınız:

$ python fake_error.py twelve 
Traceback (most recent call last):
  File "<string>", line 1
     import sys,traceback
          ^
 SyntaxError: invalid syntax

Bu, programın ilk satırında bir sözdizimi hatası olduğu gibi görünüyor. Dosya olduğu gibi doğru <string>değil fake_error.py, ama aksi takdirde yanlış yazdığınız durumdan ayırt edilemez import.

Her iki hata da kazara olabilmeleri için bir şekilde "yetersizdir".


Bu harika
Cruncher

Parlak. Bu bana Python'un başka bir tuhaflığını hatırlatıyor. Koşu raisePython 2'de fakat IDLE içinde, Python varsayılan IDE, kuyruklar hakkında bir iç hata baskı anlamsız olur. Traceback (most recent call last): ** IDLE Internal Exception: File "2.7/lib/python2.7/idlelib/run.py", line 325, in runcode exec code in self.locals File "2.7/lib/python2.7/idlelib/run.py", line 111, in main seq, request = rpc.request_queue.get(block=True, timeout=0.05) File "2.7/lib/python2.7/Queue.py", line 176, in get raise Empty
Matt

10

Bana pratik bir şakayı hatırlatıyor.

$ ls -l
$ cat readme.txt
cat: readme.txt: No such file or directory
$ echo 'cat: readme.txt: No such file or directory' >readme.txt
$ ls -l
total 8
-rw-r--r--  1 florian  staff  43 Mar 16 09:52 readme.txt
$ cat readme.txt
cat: readme.txt: No such file or directory
$ 

9

Brainf ***

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>++++++++++[<+++++++++++<++++++++++<++++++++++<+++++++++++<+++++++++++<+++<+++++++++<+++<++++++++++<+++++++++++<++++++++++<+++++++++++<++++++++++<+++++++++++<+++++++++++<+++<+++++++++++<+++++++++<+++<++++++++++<+++++++++++<+++++++++++<++++++++++<++++++++++<+++++++++<+++<++++++++++<++++++++++<+++++++++++<+++++++++<++++++++++<+++++++++++<+++++++++++<+++++++++<+++<+++++++++++<++++++++++<++++++++++<+++++++++++<+++++++++++<+++<+++++++++<+++<++++++++++<+++++++++++<++++++++++<+++++++++++<+++++++++++<++++++++++<+++++++++<+++<+++++<+++++++++++<+++++++++++<+++++++++++<+++++++++++<++++++++++<+++<++++++++++++<+++++++++<+++++++++++<+++++++++++<++++++++++++<++++++++<+++<+++<++++<++++<++++<+++++++>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>-]<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<.>++.>++.>++.>+++.>++.>+++.>+.>.>++++++.>+++++++.>.>++.>+.>++++.>++++.>+.>++++.>++++++++.>++.>+++++++++.>++++++++.>+.>+++++.>+++++.>.>+++.>++.>+++.>++.>++++++.>+.>+++++++.>+.>.>++.>+++++++.>++.>++.>+.>+++++++.>++++.>+.>.>++.>++++++++.>+.>++.>+.>++++.>+.>++.>+++++++.>.>++.>+.>++.>+.>.>+++++.>.>+++.>++.>+.>++.>++++++.>+.>+++++++.>+.>.>

Daha önce kullandığım derleyiciyi bulamıyorum, ancak bunun tam hata mesajı olduğunu garanti ederim.


5
Merak eden BF derleyicileri olmayanlarınız için bu, "F ***! Sözdizimi hatası: kapanış] belirteci açılıştan önce belirdi [belirteç"
Peter Olson

1
Seni CG, Minitech'te görmek güzel:)
Bojangles

Lol, düzeltme geçmişi eğlenceli: P
Doorknob

1

Java

throw new Error();  

Aslında işlenmemiş bir istisna (bu örnekte olduğu gibi) atmak mı yoksa bir hata mesajı taklit etmek mi demek istemiyordum. Bu durumda, bu işe yaramalıdır:

C

printf("FATAL ERROR #0xBAD\nProgram execution stopped\n\nIn line 123, character 321, of file 'buggy.c'");

(bu stdio.h, #incilt olduğunu varsayar )


Hata! Sadece gizleme bölümü hakkındaki yazınızı derinlemesine okuyun. ben bir obfuscator eklemek istiyorsunuz, ama şu anda herhangi bir ides erişimi yok. [:(] bir tane aldığımda, kesinlikle
şaşkın

0

Oyun Yapıcı Dili

show_error("Error: Undefined variable a##Line 1, character 4, of event Create in obj_controller",0)

0

EYLEMLER 3

trace("TypeError: Error #1009: Cannot access a property or method of a null object reference.");
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.