Date: Mon, 4 Oct 99 02:21:45 JST From: SHUDO Kazuyuki Subject: [JavaHouse-Brewers:28225] Re: private =?ISO-2022-JP?B?GyRCJEskTzRKQzEkSyUiJS8lOyU5JEckLSRrISkbKEI=?= To: java-house-brewers at java-house.etl.go.jp (JavaHouse Brewers ML) Message-Id: <199910031719.CAA02231@cafe.muraoka.info.waseda.ac.jp> 首藤です。 > > 〓 private の変数やメソッドへの実行時アクセスが可能な環境 > >   は、上記以外に存在するかどうか。 > > いくつかの環境で試してみました。 JDK 1.1.X では、-verify オプションの有無を変えて試してみ るのも有意義かと思います。 システムクラスローダ (null で表現されるクラスローダ) に よってロードされたクラスのメソッドは、 -verify オプションなしでは verify されないので。 > ------------------------------------------------ > Linux Blackdown JDK1.2.2 pre2 > > dg val = 0 setData() > SIGSEGV 11* segmentation violation > stackpointer=0xbffff574 > > Full thread dump Classic VM (Linux_JDK_1.2_pre-release-v2, green threads): これは、付属している Sun の JIT コンパイラが起こしている Segmentation violation です。 -Djava.compiler= とオプションを付けてインタプリタで実行すると、 Windows などの JDK 1.2.X と同じ結果となります。 しかし… > ------------------------------------------------ > Windows NT4.0 Microsoft jview 5.00.3167 > > java.lang.IllegalAccessError: dataguard/DataGuard: method setData(I)V is > inaccessible Microsoft 製の virtual machine の挙動が一番まともというのは なんとも皮肉… 今回の問題、確かに JVM は IllegalAccessError を発生させ た方がベターだと思います。Sun の JVM は javac に頼ってし まっているのでしょう。また、quick 命令のなかった JDK 1.0.X の頃は、厳密なアクセスチェックと効率的な interpret とが両立し難かったのではないかと想像します。これについて は別メイルでもうちょっと詳しく書きたいと思います。 さらに言うと、Sun JVM のインタプリタがアクセス違反のチェッ クに対して甘いので、Java Compatibility Kit (JCK) もそれ について厳しいチェックはしないのでしょう。それゆえ、JCK でテストされているはずの IBM 製 JDK も、Sun のものと同様 に甘いのでしょう。 しかし、Sun JVM ではクラスベリファイアすら private, protected のアクセス違反を検出しないとなると、アプレット から任意の private, protected のフィールドをアクセス、メ ソッドを呼び出すことができそうな気がします。 何か悪事に使えるかもしれません。 SHUDO Kazuyuki/首藤一幸 私をたばねないで あらせいとうの花のように shudoh at muraoka.info.waseda.ac.jp