سؤال

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

الخلفية: أريد أن أكتب كاشف findbgs (الذي ينظر إلى bytecode المترجمة) وإبلاغ حدوث معينة من مخصصات الصفيف. من أجل التصفية الإيجابيات الخاطئة، أنا غير مهتم بصفائف "صغيرة"، ولكن فقط تلك التي لا يتوفر حجمها في وقت الترجمة أو أكبر من عتبة شكلي.

نظرا لأن SourCeCode Findbugs غير موثق بشدة، فأنا أبحث عن بعض المؤشرات حول كيفية البدء - ربما هناك بالفعل مزخرف يقوم بشيء مماثل في أنني يمكن أن ننظر إليه.

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

المحلول

هذا يمكن أن تحصل نوعا من صعبة. معرفتي غير مكتملة، ولكن سيكون لديك ثلاثة أنواع على الأقل من التعليمات للبحث عن (Newarray، Anewarray و Multianewarriay). النظر في التعليمات السابقة (أو في حالة Multianewarray، ن التعليمات السابقة) يحصل على الحجم، والذي حتى لو كان ثابتا قد يتم تحميله مع Bipush أو Sipush أو LDC (أي شيء آخر؟) اعتمادا على الحجم. كما لاحظت، إذا كانت الفئة نتيجة لحساب، فقد تتمكن من تتبع الإرشادات مرة أخرى إلى أجل غير مسمى.

إذا كنت أتذكر بشكل صحيح، فإن Findbugs تستخدم روتس داخليا، لكنني لم أخرج أبدا في هناك لنرى بالضبط مدى ذكيا. إذا كان أي من هذه الفرق قوائم بريدية مناسبة، فقد تثبت مكانا أفضل لسؤاله - فربما سيكون على الأقل يعرفون ما إذا كان شخص ما قد أسفل هذا الطريق.

نصائح أخرى

حسنا، إذا تم تخصيصها بناء على ثابت، يمكنك التحقق من وجود ثابت تم دفعه قبل التخصيص مباشرة. علي سبيل المثال:

class ArraySize {
    private static final int smallsize = 10;
    private static final int largesize = 1000;
    public static void main(String[] args) {
        int[] small = new int[smallsize];
        int[] big = new int[largesize];
    }
}

يعطي bytecode:

Compiled from "ArraySize.java"
class ArraySize extends java.lang.Object{
ArraySize();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   return

public static void main(java.lang.String[]);
  Code:
   0:   bipush  10
   2:   newarray int
   4:   astore_1
   5:   sipush  1000
   8:   newarray int
   10:  astore_2
   11:  return

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