2012-11-07 15 views
11

コードが境界外の配列に対処しないことをコンパイル時に証明できる、十分強力なタイプのシステムをサポートする言語がいくつかあります。私の質問は、JVMにそのような言語をコンパイルする場合、パフォーマンスのためにそれを利用して、すべての配列アクセスで発生する配列境界チェックを削除する方法があるのでしょうか?不要な境界チェックとキャストを避けるためにJVMをハックします

1)私は最近のJDKがいくつかの配列境界チェックをサポートしていることを知っていますが、コンパイル時に特定の呼び出しが安全であることがわかっているので、もっと安全に削除できます。

2)これは性能にはあまり影響しませんが、特に科学計算のようなアレイ/計算量の多いアプリケーションでは、最も効果的です。

キャスティングに関する同じ質問です。私は何かが特定のタイプであることを知っていますが、Javaは制限されたタイプのシステムではありません。 JVMに "私を信用する"ように指示して何らかの小切手をスキップする方法がありますか?

JVMが一般的に配布されているため、おそらくこれを行う方法がないことがわかりました.JVMをこの機能で変更するのは妥当でしょうか?これは何かされていますか?

これは、JVMに強力に型付けされた言語をコンパイルする際の不満の1つですが、それでもJavaの制限によって妨げられています。

+0

私は、境界チェックに時間がかかることに同意します。どのくらいの頻度でキャストしていますか? (そして/またはいくつかの詳細を与える)それはほとんどのコードで重要なパフォーマンスヒットであるとは思われない。 – user949300

+1

確かにわかりませんが、一般的な原則です。コードについて特定のことが証明されているため、JVMの制限がこの場合不要になってしまうからです。 – mentics

+0

あなたはsun.misc.Unsafeを見たことがありますか? http://stackoverflow.com/questions/5574241/interesting-uses-of-sun-misc-unsafeアプリケーションに正しい設定が与えられていれば、境界チェックなしで直接メモリにアクセスできます。それが直接的にも間接的にもいくつかの型キャスティング機能を提供していれば、私は驚くことはありません。 – Philip

答えて

3

これは、proof-carrying code(PCC)インフラストラクチャがないと安全には実行できません。 PCCでは、安​​全性の理由をclassファイルに埋め込むことができます。あなたの埋め込みプルーフは、クラスローディング時にチェックされます。証明に瑕疵がある場合、クラスは読み込まれません。

正式な証明を必要とせずにランタイムチェックを削除できるようにした場合、SecurityMattはそれを置くと、安全なプラットフォームとしてJavaの元の哲学を打ち破ります。

JVMは、メソッドのローカル変数の型チェックに特殊な形式のPCCを使用します。すべてのローカル変数の型情報は、クラスローディングメカニズムによってその正しさをチェックするために使用されますが、それ以降は破棄されます。しかし、これはJVMで使用されるPCCの概念の唯一の例です。私が知る限り、JVMのための一般的なPCCインフラストラクチャはありません。

Javaの小さなサブセットをサポートするJavaCardプラットフォーム用に存在していたことはかつて聞きました。私はそれがあなたの問題に役立つことができるかどうかは分かりません。

+0

素晴らしい情報!別の解決策が信頼できるコードの仕組みかもしれないようです。一部の調査によると、PCCでJavaを使用している人がいます。多分私たちはいつかやっていくつもりです。 – mentics

2

Javaの重要な機能の1つは、境界チェックを行うために開発者を「信頼する」必要がないことです。これにより、攻撃者がアプリケーション内で任意のコードを実行する可能性のある「バッファオーバーフロー」のセキュリティ脆弱性が排除されます。

開発者が境界チェックを無効にできるようにすることで、Javaの重要な機能の1つが失われることになります。Java開発者が間違っていても、コード内に悪用可能なバッファオーバーフローは発生しません。

プログラマが自分の境界チェックを管理するために信頼できる言語を使用したい場合は、C++を提案することができます。これにより、自動的な境界チェック(new int [])を持たずに配列を割り当て、inbuilt境界チェック(std :: vector)で配列を割り当てることができます。

また、私は強くあなたのアプリケーションの速度損失をチェック非難バウンドする前に、あなたはボトルネックを引き起こしている可能性がありますあなたのコード内のどこかに存在するかどうかを判断するために、いくつかのベンチマーキングを行うことを示唆しています。

コンパイラのターゲットとして、MSILなどのバイトコード言語がJavaバイトコードよりもニーズに適していることがあります。 MSILは強く型付けされており、Javaで見つかった多くの非効率性に苦しんでいません。

関連する問題