4

私は Clojure がどのように機能するかを学んでいる最中であり、(Clojure と Lisp の方言が一般的にどのように機能するかを理解するためだけに) Clojure プログラムをコンパイルして実行することが可能かどうか疑問に思っています」evalの使用を禁止します。

実行中の Clojure プログラムにホットパッチを適用して、Clojure プログラムを一度コンパイルすると、evalが呼び出されたときに例外がスローされるようにすることが技術的に可能かどうかを私が尋ねているわけではないことに注意してください。

私が求めているのは、技術的にevalの使用を禁止することが可能である場合、REPL を使用せず、特にevalを使用しないほとんどの Clojure プログラムは引き続き機能するかということです。

または、実行時にフードの下でevalを使用するデフォルト/組み込み API/マクロ/関数ですか?

4

3 に答える 3

10

eval対話型プログラミングを Clojure (および Lips) にもたらすものです。Clojure コードを jvm バイト コード (どこでも eval 関数呼び出しを使用しない) にコンパイルしたり、他の Lisp 方言を対象のランタイム (主にネイティブ コード) にコンパイルしたりしたら、eval は必要ありません。

evalアプリケーションの主な目的は、実行時にコードを生成して実行することです。基本的に、「実行時マクロ」を作成できます。これは、言語のコア API が実行する必要があることではありません。

于 2012-12-02T15:36:06.010 に答える
1

私はずっと前にこの質問をしましたが、追加情報が出てきてエクスプロイトも出てきて、他の質問が問題に正しく対処していないため、私は自分の質問に答えています。

基本的に、デフォルトの読み取り関数は安全ではありません。

2013 年、Ruby のすべての悪用 (セキュリティへの影響に人々が突然懸念を感じた) の後、この問題に関して Clojure グループに関する激しい議論が行われました。

" read-eval のデフォルトは false"

Clojure のドキュメント自体には、次のように明確に記載されています。

http://clojuredocs.org/clojure_core/clojure.core/read

;; WARNING: You SHOULD NOT use clojure.core/read or
;; clojure.core/read-string to read data from untrusted sources.  They
;; were designed only for reading Clojure code and data from trusted
;; sources

read-evalfalseに設定しても(少なくとも Clojure 1.5 までは) 十分ではないことに注意してください。これは、一部の Java コンストラクターが強制的に呼び出され、悪意のある入力を慎重に作成することによって副作用が生じる可能性があるためです。

これについては、 「Clojure's Reader is Unsafe」というブログ エントリで詳しく説明されています。

http://www.learningclojure.com/2013/02/clojures-reader-is-unsafe.html

簡単に言えば、 のような別のものを使用してclojure.ednください。

于 2013-03-08T16:14:40.710 に答える
0

それを言うのはおそらく公正です:

  • のほとんどの使用はeval、インタラクティブに(REPLで)またはコンパイル時に(たとえば、マクロの展開および実行中に)行われます。
  • evalのいくつかの使用法は、通常のコードで発生します。これは、スプレッドシートプログラムで動的に生成された数式を実行する場合など、便利なトリックになる可能性があります。

2番目の理由により、evalの使用をグローバルに禁止すると、すべてがすでにコンパイルされている場合でも、実行時に多くのコード/ライブラリが破損します。

于 2012-12-10T04:01:10.770 に答える