⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 verifierutil.h

📁 java 1.1 gemini 08_16
💻 H
📖 第 1 页 / 共 3 页
字号:
 *
 * @param ip            The IP address
 */
extern void Vfy_setErrorIp(int ip);

/*
 * Output a trace statement at the head of the dispatch loop
 *
 * @param vMethod       The METHOD being verified
 * @param ip            The IP address
 */
extern void Vfy_printVerifyLoopMessage(METHOD vMethod, IPINDEX ip);

#else

#define Vfy_trace1(x, y)                    /**/
#define Vfy_setErrorIp(x)                   /**/
#define Vfy_printVerifyLoopMessage(x, y)    /**/

#endif /* INCLUDEDEBUGCODE */

/* ------------------------------------------------------------------------ *\
 *                           Class Accessor Methods                         *
\* ------------------------------------------------------------------------ */

/*
 * Return TRUE is the class is java.lang.Object
 *
 * @param vClass        The CLASS to be accessed
 * @return              TRUE if the the class is java.lang.Object
 */
#define Cls_isJavaLangObject(vClass)    ((INSTANCE_CLASS)vClass == JavaLangObject)

/*
 * Return the superclass of the class
 *
 * @param vClass        The CLASS to be accessed
 * @return              The CLASS of its superclass
 */
#define Cls_getSuper(vClass)            ((CLASS)(((INSTANCE_CLASS)vClass)->superClass))

/*
 * Return the constant pool for the class
 *
 * @param vClass        The CLASS to be accessed
 * @return              Its CONSTANTPOOL
 */
#define Cls_getPool(vClass)             (((INSTANCE_CLASS)vClass)->constPool)

/*
 * Lookup a method
 *
 * @param vClassContext The CLASS of the lookup context (e.g. calling class)
 * @param vClassTarget  The CLASS to be accessed (e.g. called class)
 * @param vMethod       The METHOD who's name should be used to do the lookup
 * @return              The METHOD if it exists else NULL
 */
#define Cls_lookupMethod(vClassContext, vClassTarget, vMethod) \
    lookupMethod(vClassTarget, vMethod->nameTypeKey, (INSTANCE_CLASS)vClassContext)

/*
 * Lookup a field 
 *
 * @param vClass        The CLASS of the lookup context (e.g. calling class)
 * @param vNameTypeKey  The nameTypeKey which is being searched in field table
 * @return              The FIELD if it exists else NULL
 */
#define Cls_lookupField(vClass, vNameTypeKey) \
    lookupField(vClass, vNameTypeKey)

/*
 * Get a class's key
 *
 * @param vClass        The CLASS to be accessed
 * @return              Its CLASSKEY
 */
#define Cls_getKey(vClass)  (vClass->key)

/* ------------------------------------------------------------------------ *\
 *                            Pool Accessor Methods                         *
\* ------------------------------------------------------------------------ */

/*
 * Get the tag of the pool entry at index.
 *
 * @param vPool         The CONSTANTPOOL to be accessed
 * @param index         The index to be accessed
 * @return              Its POOLTAG
 * @throw               If index out of bounds
 */
#define Pol_getTag(vPool, index)                            \
    (index >= CONSTANTPOOL_LENGTH(vPool)) ?                 \
        (Vfy_throw(120), 0)                                 \
        :                                                   \
        (CONSTANTPOOL_TAG(vPool, index) & CP_CACHEMASK)     \

/*
 * Check the tag at index is the same as "tag".
 *
 * @param vPool         The CONSTANTPOOL to be accessed
 * @param index         The index to be accessed
 * @param tag           The POOLTAG that should be there
 * @param errorcode     The error to throw if it is not
 * @throw               If tag is wrong
 */
#define Pol_checkTagIs(vPool, index, tag, errorcode) {      \
    if (Pol_getTag(vPool, index) != tag) {                  \
        Vfy_throw(errorcode);                               \
    }                                                       \
}

/*
 * Check the tag at index is the same as "tag"or "tag2".
 *
 * @param vPool         The CONSTANTPOOL to be accessed
 * @param index         The index to be accessed
 * @param tag           The POOLTAG that should be there
 * @param tag2          The POOLTAG that should be there
 * @param errorcode     The error to throw if it is not
 * @throw               If both tags are wrong
 */
#define Pol_checkTag2Is(vPool, index, tag, tag2, errorcode) {   \
    POOLTAG t = Pol_getTag(vPool, index);                       \
    if (t != tag && t != tag2) {                                \
        Vfy_throw(errorcode);                                   \
    }                                                           \
}

/*
 * Check the tag at index is CONSTANT_Class.
 *
 * @param vPool         The CONSTANTPOOL to be accessed
 * @param index         The index to be accessed
 * @throw               If the pool tag is not CONSTANT_Class
 */
#define Pol_checkTagIsClass(vPool, index)                   \
     Pol_checkTagIs(vPool, index, CONSTANT_Class, VE_EXPECT_CLASS)

/*
 * Get the CLASSKEY for the pool entry at index
 *
 * @param vPool         The CONSTANTPOOL to be accessed
 * @param index         The index to be accessed
 * @return              The CLASS of the CONSTANT_Class at that index
 */
#define Pol_getClassKey(vPool, index)                       \
     Cls_getKey(vPool->entries[index].clazz)


/* For CONSTANT_FieldRef_info, CONSTANT_MethodRef_info, CONSTANT_InterfaceMethodRef_info  */

/*
 * Get the class index for the pool entry at index
 *
 * @param vPool         The CONSTANTPOOL to be accessed
 * @param index         The index to be accessed
 * @return              The POOLINDEX in the class_index field
 */
#define Pol_getClassIndex(vPool, index)                     \
    (vPool->entries[index].method.classIndex)

/*
 * Get the class for the pool entry at index 
 *
 * @param vPool         The CONSTANTPOOL to be accessed
 * @param index         The index to be accessed
 * @return              The POOLINDEX in the name_and_type_index field
 */
#define Pol_getClass(vPool, fieldClassIndex)               \
    (vPool->entries[fieldClassIndex].clazz)

/*
 * Get the Name-and-type index for the pool entry at index
 *
 * @param vPool         The CONSTANTPOOL to be accessed
 * @param index         The index to be accessed
 * @return              The POOLINDEX in the name_and_type_index field
 */
#define Pol_getNameAndTypeIndex(vPool, index)               \
    (vPool->entries[index].method.nameTypeIndex)

/*
 * Get the Name-and-type key for the pool entry at index
 *
 * @param vPool         The CONSTANTPOOL to be accessed
 * @param index         The index to be accessed
 * @return              The nameTypeKey 
 */
#define Pol_getNameTypeKey(vPool, index)                    \
    (vPool->entries[index].nameTypeKey)

/* For CONSTANT_NameAndType_info, */

/*
 * Get the type key of a Name-and-type for the pool entry at index
 *
 * @param vPool             The CONSTANTPOOL to be accessed
 * @param nameAndTypeIndex The index to be accessed
 * @return                  The METHODTYPEKEY of that entry
 */
#define Pol_getTypeKey(vPool, nameAndTypeIndex)             \
    (vPool->entries[nameAndTypeIndex].nameTypeKey.nt.typeKey)

/*
 * Get the descriptor key of a Name-and-type for the pool entry at index
 *
 * @param vPool             The CONSTANTPOOL to be accessed
 * @param nameAndTypeIndex The index to be accessed
 * @return                  The METHODNAMEKEY of that entry
 */
#define Pol_getDescriptorKey(vPool, nameAndTypeIndex)       \
    (vPool->entries[nameAndTypeIndex].nameTypeKey.nt.nameKey)

/* ------------------------------------------------------------------------ *\
 *                          Method Accessor Methods                         *
\* ------------------------------------------------------------------------ */

/*
 * Get the CLASS of a METHOD
 *
 * @param vMethod       The METHOD to be accessed
 * @return              The CLASS of the method
 */
#define Mth_getClass(vMethod)  ((CLASS)vMethod->ofClass)

/*
 * Get the CLASS of a FIELD
 *
 * @param vField        The FIELD to be accessed
 * @return              The CLASS of the field
 */
#define Fld_getClass(vField)  ((CLASS)vField->ofClass)

/*
 * Get the address of the bytecode array
 *
 * @param vMethod       The METHOD to be accessed
 * @return              The address of the bytecodes
 */
#define Mth_getBytecodes(vMethod) (vMethod->u.java.code)

/*
 * Get the length of the bytecode array
 *
 * @param vMethod       The METHOD to be accessed
 * @return              The length of the bytecodes
 */
#define Mth_getBytecodeLength(vMethod) (vMethod->u.java.codeLength)

/*
 * Return TRUE if it is a static method
 *
 * @param vMethod       The METHOD to be accessed
 * @return              TRUE if it is a static method
 */
#define Mth_isStatic(vMethod) (vMethod->accessFlags & ACC_STATIC)

/*
 * Return TRUE if it is a final method
 *
 * @param vMethod       The METHOD to be accessed
 * @return              TRUE if it is a final method
 */
#define Mth_isFinal(vMethod) (vMethod->accessFlags & ACC_FINAL)

/*
 * Return the number of locals in used by the method
 *
 * @param vMethod       The METHOD to be accessed
 * @return              The number of local variable slots
 */
#define Mth_frameSize(vMethod) (vMethod->frameSize)

/*
 * Get the start ip address for the i-th exception table entry
 *
 * @param vMethod       The METHOD to be accessed
 * @param i             The exception table index
 * @return              The startPC
 */
#define Mth_getExceptionTableStartPC(vMethod, i)        \
    ((vMethod->u.java.handlers)->handlers[i].startPC)

/*
 * Get the end ip address for the i-th exception table entry
 *
 * @param vMethod       The METHOD to be accessed
 * @param i             The exception table index
 * @return              The endPC
 */
#define Mth_getExceptionTableEndPC(vMethod, i)          \
    ((vMethod->u.java.handlers)->handlers[i].endPC)

/*
 * Get the handler ip address for the i-th exception table entry
 *
 * @param vMethod       The METHOD to be accessed
 * @param i             The exception table index
 * @return              The handlerPC
 */
#define Mth_getExceptionTableHandlerPC(vMethod, i)      \
    ((vMethod->u.java.handlers)->handlers[i].handlerPC)

/*
 * Get the exception class for the i-th exception table entry
 *
 * @param vMethod       The METHOD to be accessed
 * @param i             The exception table index
 * @return              The CLASSKEY of the exception
 */
#define Mth_getExceptionTableCatchType(vMethod,i)       \
    ((vMethod->u.java.handlers)->handlers[i].exception)

/*
 * Get the ip address for the i-th entry in the stack map table
 *
 * @param vMethod       The METHOD to be accessed
 * @param i             The index into the stack map table
 * @return              The IP address for that entry
 */
extern int Mth_getStackMapEntryIP(METHOD vMethod, int i);


/*
 * Check the stackmap offset for the ith entry in the stack map table
 *
 * @param vMethod       The METHOD to be accessed
 * @param stackmapIndex The index into the stack map table
 * @return              true if ok, false if not valid. 
 */

extern bool_t Mth_checkStackMapOffset(METHOD vMethod, int stackmapIndex);

/*
 * Get the length of the stack map table
 *
 * @param vMethod       The METHOD to be accessed
 * @return              The number of entries in the  stack map table
 */

extern int Mth_getExceptionTableLength(METHOD vMethod);

/*
 * The following are not a part of this interface, but defined the
 * other variables and routines used from verifier.c
 */

#define IS_NTH_BIT(var, bit)    (var[(bit) >> 5] & (1 <<  ((bit) & 0x1F)))
#define SET_NTH_BIT(var, bit)   (var[(bit) >> 5] |= (1 << ((bit) & 0x1F)))
#define callocNewBitmap(size) \
        ((unsigned long *) callocObject((size + 31) >> 5, GCT_NOPOINTERS))

extern unsigned short* vStack;
extern unsigned short* vLocals;
extern unsigned long *NEWInstructions;
extern unsigned short  vSP;
extern bool_t vNeedInitialization;

extern bool_t   vIsAssignable(CLASSKEY fromKey, CLASSKEY toKey, CLASSKEY *mergedKeyP);
extern bool_t   matchStackMap(METHOD thisMethod, IPINDEX target_ip, int flags);
extern bool_t   checkNewObject(IPINDEX this_ip, IPINDEX target_ip);

extern bool_t   vIsProtectedAccess(INSTANCE_CLASS thisClass, POOLINDEX index, bool_t isMethod);
extern int      change_Field_to_StackType(CLASSKEY fieldType, CLASSKEY* stackTypeP);
extern int      change_Arg_to_StackType(unsigned char** sigP, CLASSKEY* typeP);

#if CACHE_VERIFICATION_RESULT
    bool_t checkVerifiedClassList(INSTANCE_CLASS);
    void appendVerifiedClassList(INSTANCE_CLASS);
#else 
#   define checkVerifiedClassList(class) FALSE
#   define appendVerifiedClassList(class)
#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -