Thông báo lỗi giả


18

Viết chương trình in ra thông báo lỗi cú pháp của trình biên dịch hoặc trình thông dịch. Thông báo lỗi nên gây hiểu lầm để những người duy trì mã sẽ mất nhiều ngày để phát hiện ra rằng lỗi đã bị làm giả, điều đó có nghĩa là, bạn nên che giấu (và che giấu ý định của mình). Ngoài ra, lỗi phải càng chính xác càng tốt và nên tham chiếu đúng mã.

Đối với các ngôn ngữ tuân thủ, giả sử người duy trì mã của bạn sẽ thực hiện compile program.p && ./programtrên dòng lệnh để biên dịch VÀ chạy chương trình, điều đó có nghĩa là anh ta không thể phân biệt nếu đầu ra đến từ trình biên dịch hoặc chính chương trình. Ngoài ra, giả sử người bảo trì mã của bạn sẽ bật các thông báo lỗi cú pháp.

Để tham khảo, đây là một ví dụ tôi đã thực hiện: https://gist.github.com/359604

Các DATAphần mã hóa chuỗi thông báo lỗi, và băm %abcdeflà bảng giải mã. Lỗi được in tham chiếu đến dấu gạch chéo ngược, làm cho bộ duy trì mã sẽ cố gắng đếm dấu gạch chéo ngược.

Bài dự thi sẽ được xếp loại bởi:

  • Mã có một ý định rõ ràng /6
  • Mã tái tạo lỗi chính xác /16 (điểm của bạn bắt đầu bằng 16 và chia cho các yếu tố tương ứng cho từng điểm không chính xác)
    • Viết hoa đúng: 4
    • Số dòng và số cột đúng: 4
    • Từ đúng: 2 cho mỗi từ không chính xác
  • Số dòng được tham chiếu đánh lừa người bảo trì mã /3

Ví dụ,

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

nhận được 8 (16/2) về tính chính xác khi thiếu "mã thông báo" bất ngờ trước "mã thông báo", trình thông dịch Python bình thường hiển thị

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

Nếu điểm "mã tái tạo lỗi chính xác" của bạn dưới 1, mục nhập của bạn không đủ điều kiện.

Trong trường hợp hòa, tôi sẽ đưa ra các yếu tố chấm điểm bổ sung.


Uh ... Tôi đã đóng câu hỏi ám ảnh gần đây của Sparky vì lý do không khách quan, và bây giờ chúng tôi đã có được sự khéo léo của Peter và điều này (mà tôi thừa nhận đã nỗ lực dũng cảm để có được sự khách quan). Thay vì chỉ ngồi trên mọi thứ gợn sóng hoặc chọn dựa trên định kiến ​​cá nhân của tôi, tôi sẽ mở một chủ đề khác trên meta, hoặc có thể hồi sinh một chủ đề cũ. Hãy lưu ý rằng Jeff dường như nghĩ rằng "mục tiêu" là một yêu cầu.
dmckee


Một giải pháp có thể là cuộc thi phổ biến . Vâng, một tiêu chí chiến thắng khách quan.
Julian Kuhn

Câu trả lời:


35

Con trăn

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

Đây là một chương trình nên lấy tên tệp trên dòng lệnh, đánh giá dòng đầu tiên trong đó và in kết quả. Nó có 2 lỗi. Lỗi chính là nó nên sử dụng sys.argv[1], không phải sys.argv[0], vì vậy nó kết thúc việc đánh giá chính chương trình, chứ không phải nội dung của tệp được đặt tên bởi đối số đầu tiên. Lỗi thứ hai là đối số để print_exclàm cho nó chỉ in khung sâu nhất trên ngăn xếp, che giấu thực tế là lỗi xảy ra bên trong eval. Kết quả là bạn gặp lỗi như thế này:

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

Điều này trông rất giống như dòng đầu tiên của chương trình có lỗi cú pháp. Nó không hoàn toàn đúng như tập tin <string>, không fake_error.py, nhưng nếu không thì nó không thể phân biệt được với trường hợp, ví dụ, bạn đánh vần importsai.

Cả hai lỗi đều hơi "lép vế" ở chỗ chúng có thể là vô tình.


Điều này thật tuyệt vời
Cruncher

Xuất sắc. Điều này làm tôi nhớ đến một sự kỳ lạ khác của Python. Chạy raisetrong Python 2, nhưng trong IDLE, IDE mặc định của python, gây ra lỗi in nội bộ vô nghĩa về hàng đợi. 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

Nhắc nhở tôi một trò đùa thực tế.

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

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

Tôi không thể tìm thấy trình biên dịch cụ thể mà tôi đã sử dụng trước đây, nhưng tôi đảm bảo với bạn rằng đó là thông báo lỗi chính xác.


5
Đối với những người không có trình biên dịch BF, những người tò mò, bản in này, "F ***! Cú pháp lỗi: đóng] mã thông báo đã xuất hiện trước khi mở [mã thông báo"
Peter Olson

1
Rất vui được gặp bạn trên CG, Minitech:)
Bojangles

Lol, lịch sử sửa đổi thật thú vị: P
Doorknob

1

Java

throw new Error();  

Tôi không biết liệu bạn có thực sự ném một ngoại lệ chưa được xử lý (như trong ví dụ đó) hoặc mô phỏng một thông báo lỗi. Nếu đó là trường hợp, điều này sẽ làm việc:

C

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

(giả định stdio.hnày là #inculled)


Rất tiếc, chỉ cần đọc bài viết của bạn chuyên sâu về phần obfuscation. tôi sẽ thêm một obfuscator vào nó, nhưng hiện tại tôi không có quyền truy cập vào bất kỳ ides nào. [:(] khi tôi nhận được một, tôi sẽ chắn gửi một phiên bản khó hiểu (ai mà biết được, có lẽ ngay cả một lang;)
Nate Koppenhaver

0

Ngôn ngữ nhà sản xuất trò chơi

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

0

HÀNH ĐỘNG 3

trace("TypeError: Error #1009: Cannot access a property or method of a null object reference.");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.