偽のエラーメッセージ


18

コンパイラまたはインタープリターの構文エラーメッセージを出力するプログラムを作成します。エラーメッセージは誤解を招くものである必要があります。そのため、コードメンテナーはエラーが偽造されたことを見つけるのに数日かかります。また、エラーはできるだけ正確でなければならず、コードを正しく参照する必要があります。

準拠言語の場合、コードメンテナーがcompile program.p && ./programコマンドラインでプログラムをコンパイルして実行すると想定します。つまり、コンパイラーからの出力かプログラム自体からの出力かを区別できません。また、コードメンテナが構文エラーメッセージを有効にすることを前提としています。

参考のために、ここに私が作成した例を示しますhttps : //gist.github.com/359604

DATAセクションには、エラーメッセージの文字列を符号化し、ハッシュが%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の最近の難読化の質問を客観的ではないという理由で閉じました、そして今、私たちはPeterの手に負えないものとこれを持っています(客観性を得るために勇敢な努力をすることを認めます)。気ままにすべてに座ったり、個人的な偏見に基づいて選択したりするのではなく、メタに関する別のトピックを開くか、古いトピックを復活させます。ジェフは「客観的」が要件だと考えているように見えることに注意してください。
-dmckee


ソリューションは、popularity-contestにすることができます。さて、客観的な勝利基準。
ヨハネ

回答:


35

Python

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]ため、最初の引数で指定されたファイルの内容ではなく、プログラム自体を評価することになります。2番目のバグは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間違っている場合と区別できません。

両方のエラーは、偶発的である可能性があるため、やや「手に負えない」ものです。


これは素晴らしい
ランチャー

鮮やかさ。これは、Pythonのもう1つの奇妙な点を思い起こさせます。raisePython 2で実行しますが、PythonのデフォルトIDEであるIDLEで実行すると、キューに関する意味不明な情報を出力する内部エラーが発生します。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
マット

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
好奇心are盛なBFコンパイラをお持ちでない方のために、これは「F ***!構文エラー:クローズ」トークンがオープニング[トークン]の前に現れました
ピーターオルソン

1
CG、Minitech:)
Bojanglesで

笑、改訂履歴は面白いです:P
ドアノブ

1

Java

throw new Error();  

実際に未処理の例外をスローするのか(その例のように)、エラーメッセージをシミュレートするのかを知りませんでした。その場合、これは動作するはずです:

C

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

(これstdio.hは#includedであると仮定します)


おっと、難読化の部分について詳細に投稿を読んでください。私はそれに難読化ツールを追加しますが、現在はどのIDEにもアクセスできません。[:(]入手したら、明確に難読化されたバージョンを投稿します(おそらく別の
言語

0

ゲームメーカーの言語

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

0

ACTIONSCRIPT 3

trace("TypeError: Error #1009: Cannot access a property or method of a null object reference.");
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.