سؤال

أحاول استخدام مكتبة هندسة كود جافا بايت ASM. لأداء التحليل الثابت. لدي الوضع حيث أود أن أفقد المتغيرات التي يتم تعيينها في مجال.

أملك MethodVisitor التي تنفذ visitFieldInsn() طريقة. أنا على وجه التحديد يبحث عن putfield أمر. هذا ليس بالمشكله. المشكلة هي أنه عندما أواجه putfield, أريد أن أكون قادرا على الوصول إلى المتغير الذي سيتم تعيينه في الحقل. على وجه التحديد أريد الوصول إلى معلومات حول يكتب من المتغير.

في الوقت الحالي، أحتاج إلا إلى أن ننظر إلى ما هو في الجزء العلوي من المكدس، ولكن إذا كان هناك طريقة أكثر عمومية لتفتيشها ذلك أفضل.

هل هناك طريقة باستخدام ASM لتفقد المتغيرات على المكدس؟

هل كانت مفيدة؟

المحلول

أولا وقبل كل شيء، إذا كنت تستطيع أن تفترض أن ByTecode صالح، يجب أن يتطابق نوع القيمة المعينة إلى الحقل مع نوع الحقل، والذي يمكنك قراءته مسبقا باستخدام API ClassReader.

ومع ذلك، إذا كنت بحاجة إلى تتبع المكان الذي جاء فيه كل قيمة فردية على مكدس أو فتحة متغيرة لمؤشر التعليمات المعطى، فيمكنك استخدام محلل API مع SourceIterstreter. في الأساس، سيسمح للعثور على التعليمات التي أنتجت قيمة معينة ويمكنك استخدام معلومات حول هذه التعليمات لاستنتاج نوع (على سبيل المثال إذا كان يقرأ من متغير يتوافق مع معلمة طريقة أو إذا تم إرجاع القيمة من مكالمة طريقة، فماذا الحالات التي يمكنك الحصول عليها من النوع من واصف الأسلوب). انظر أيضا وظيفة مدونتي القديمة التي لديها مثال على استخدام SourceInterReter.

نصائح أخرى

أنا لست على دراية ASM، لكنني فعلت شيئا يبدو مشابها مع إطار Eclipse Java AST. لمعرفة المتغيرات، اضطررت إلى تتبع الإعلانات المتغيرة بنفسي في أساليب الزيارة المناسبة () لزائر AST. لم يكن الأمر صعبا للغاية بمجرد أن أعرف أن العقد AST تتوافق مع تصريحات متغيرة.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top