ข้อความแสดงข้อผิดพลาดปลอม


18

เขียนโปรแกรมที่พิมพ์ข้อความแสดงข้อผิดพลาดทางไวยากรณ์ของคอมไพเลอร์หรือล่าม ข้อความแสดงข้อผิดพลาดควรทำให้เข้าใจผิดเพื่อให้ผู้ดูแลโค้ดใช้เวลาหลายวันในการตรวจสอบว่าข้อผิดพลาดนั้นปลอมซึ่งหมายความว่าคุณควรทำให้งงงวย (และซ่อนเจตนาของคุณ) นอกจากนี้ข้อผิดพลาดจะต้องตรงตามที่เป็นไปได้และควรอ้างอิงรหัสอย่างถูกต้อง

สำหรับภาษาที่ใช้งานสมมติว่าผู้ดูแลรหัสของคุณจะทำcompile program.p && ./programในบรรทัดคำสั่งเพื่อคอมไพล์และรันโปรแกรมซึ่งหมายความว่าเขาไม่สามารถแยกแยะได้ว่าเอาต์พุตมาจากคอมไพเลอร์หรือตัวโปรแกรมเอง นอกจากนี้สมมติว่าผู้ดูแลรหัสของคุณจะเปิดข้อความแสดงข้อผิดพลาดทางไวยากรณ์

สำหรับการอ้างอิงต่อไปนี้เป็นตัวอย่างที่ฉันทำ: https://gist.github.com/359604

DATAส่วน encodes สตริงของข้อผิดพลาดและกัญชา%abcdefเป็นตารางการถอดรหัส ข้อผิดพลาดที่พิมพ์อ้างอิงถึงแบ็กสแลชซึ่งทำให้ผู้ดูแลโค้ดจะพยายามนับแบ็กสแลช

ผลงานจะถูกให้คะแนนโดย:

  • รหัสมีเจตนาชัดเจนที่หลอกลวง /6
  • โค้ดทำซ้ำข้อผิดพลาดอย่างถูกต้อง/16 (จุดของคุณเริ่มต้นด้วย 16 และหารด้วยปัจจัยที่เกี่ยวข้องสำหรับความไม่ถูกต้องแต่ละครั้ง)
    • การใช้อักษรตัวพิมพ์ใหญ่ให้ถูกต้อง: 4
    • หมายเลขบรรทัดที่ถูกต้องและหมายเลขคอลัมน์: 4
    • ถ้อยคำที่ถูกต้อง: 2 สำหรับแต่ละคำที่ไม่ถูกต้อง
  • หมายเลขบรรทัดที่อ้างถึงทำให้ผู้ดูแลโค้ดเข้าใจผิด /3

ตัวอย่างเช่น,

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

ได้รับ 8 (16/2) เมื่อความถูกต้องหายไป "ไม่คาดคิด" ก่อน "โทเค็น", Python ล่ามปกติแสดง

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

หากจุด "รหัสทำซ้ำผิดพลาดอย่างถูกต้อง" ต่ำกว่า 1 รายการของคุณจะถูกตัดสิทธิ์

ในกรณีที่มีการผูกผมจะวางปัจจัยการจัดลำดับเพิ่มเติม


อืม ... ฉันปิดคำถามที่น่าเบื่อหน่ายของ Sparky เมื่อไม่นานมานี้และตอนนี้เรามีสิ่งที่ซ่อนเร้นอยู่ของปีเตอร์และสิ่งนี้ แทนที่จะนั่งทุกอย่างที่จำใจหรือเลือกตามอคติส่วนตัวของฉันฉันจะเปิดหัวข้ออื่นในเมตาดาต้าหรืออาจจะฟื้นคืนชีพเก่า โปรดระวังว่า Jeff ดูเหมือนจะคิดว่า "วัตถุประสงค์" เป็นข้อกำหนด
dmckee


วิธีการแก้ปัญหาสามารถเป็นความนิยมประกวด เกณฑ์การชนะอย่างมีวัตถุประสงค์
Johannes Kuhn

คำตอบ:


35

หลาม

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

นี่คือโปรแกรมที่ควรใช้ชื่อไฟล์ในบรรทัดคำสั่งประเมินบรรทัดแรกในนั้นและพิมพ์ผลลัพธ์ มันมี 2 ข้อบกพร่อง ข้อผิดพลาดที่สำคัญคือมันควรจะใช้sys.argv[1]ไม่ได้sys.argv[0]ดังนั้นจึงจบลงด้วยการประเมินโปรแกรมตัวเองไม่ใช่เนื้อหาของไฟล์ที่มีชื่อโดยอาร์กิวเมนต์แรก ข้อผิดพลาดที่สองคือการโต้แย้งที่จะทำให้มันพิมพ์เฉพาะกรอบที่ลึกที่สุดในกองซ่อนความจริงที่ว่าข้อผิดพลาดที่เกิดขึ้นภายในprint_exc evalดังนั้นคุณจะได้รับข้อผิดพลาดดังนี้:

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

ดูเหมือนว่าบรรทัดแรกของโปรแกรมจะมีข้อผิดพลาดทางไวยากรณ์ มันค่อนข้างไม่ถูกต้องเหมือนไฟล์<string>ไม่ใช่fake_error.pyแต่อย่างอื่นมันแยกไม่ออกจากกรณีที่คุณสะกดimportผิด

ข้อผิดพลาดทั้งสองนี้ค่อนข้าง "ใช้เล่ห์เหลี่ยม" เนื่องจากอาจเกิดอุบัติเหตุได้


นี่มันยอดเยี่ยม
Cruncher

สุกใส สิ่งนี้ทำให้ฉันนึกถึง Python ทำงานraiseใน Python 2 แต่ใน IDLE ซึ่งเป็น IDE เริ่มต้นของ python ทำให้เกิดข้อผิดพลาดภายในในการพิมพ์ซึ่งพูดพล่อยๆเกี่ยวกับคิว 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

เตือนฉันให้เป็นเรื่องตลกในทางปฏิบัติ

$ 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 ***

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

ฉันไม่พบคอมไพเลอร์เฉพาะที่ฉันเคยใช้มาก่อน แต่ฉันรับรองกับคุณว่านั่นเป็นข้อความแสดงข้อผิดพลาดที่แน่นอน


5
สำหรับผู้ที่ไม่มีคอมไพเลอร์ BF ที่มีความอยากรู้อยากเห็นภาพนี้ "F ***! ข้อผิดพลาดทางไวยากรณ์: โทเค็นการปิด" ปรากฏขึ้นก่อนการเปิด [โทเค็น "
Peter Olson

1
ยินดีที่ได้พบคุณใน CG, Minitech:)
Bojangles

ฮ่า ๆ ประวัติการแก้ไขน่าสนุก: P
Doorknob

1

ชวา

throw new Error();  

ฉันไม่ทราบว่าคุณหมายถึงการโยนข้อยกเว้นที่ไม่สามารถจัดการได้ (ตามตัวอย่าง) หรือการจำลองข้อความแสดงข้อผิดพลาด หากเป็นกรณีนี้ควรทำงาน:

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

(ซึ่งถือว่าstdio.hเป็น #included)


อ๊ะเพียงอ่านโพสต์ของคุณในเชิงลึกเกี่ยวกับความสับสน ฉันจะเพิ่ม obfuscator ลงไป แต่ตอนนี้ฉันไม่มีสิทธิ์เข้าถึง ides [:(] เมื่อฉันได้รับหนึ่งฉันจะโพสต์รุ่นที่สับสน (ใครจะรู้อาจจะใน lang อีก);
เนท Koppenhaver


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.