其神若何,月射寒江。

白盒测试之静态检查--基础java字节码

上一篇 / 下一篇  2010-04-11 22:19:45 / 个人分类:白盒测试研究

要想实现FINDBUGS静态扫描器,如果不熟悉java字节码,是很难写出比较复杂的检测器的。只有对这些指令熟悉了,才能更加容易的分析源代码。看着这些指令,让我们回想起了大学时期的汇编语言。回想起来大学孤灯夜读的日子。

1      Java字节码

栈和局部变量操作

1.1   将常量压入栈的指令

aconst_null        null对象引用压入栈

iconst_m1        int类型常量-1压入栈

iconst_0        int类型常量0压入栈

iconst_1        int类型常量1压入栈

iconst_2        int类型常量2压入栈

iconst_3        int类型常量3压入栈

iconst_4        int类型常量4压入栈

iconst_5        int类型常量5压入栈

lconst_0        long类型常量0压入栈

lconst_1        long类型常量1压入栈

fconst_0        float类型常量0压入栈

fconst_1        float类型常量1压入栈

dconst_0        double类型常量0压入栈

dconst_1        double类型常量1压入栈

bipush            将一个8位带符号整数压入栈

sipush            16位带符号整数压入栈

ldc            把常量池中的项压入栈

ldc_w            把常量池中的项压入栈(使用宽索引)

ldc2_w            把常量池中long类型或者double类型的项压入栈(使用宽索引)

1.2   从栈中的局部变量中装载值的指令

iload            从局部变量中装载int类型值

lload            从局部变量中装载long类型值

fload            从局部变量中装载float类型值

dload            从局部变量中装载double类型值

aload            从局部变量中装载引用类型值(refernce

iload_0            从局部变量0中装载int类型值

iload_1            从局部变量1中装载int类型值

iload_2            从局部变量2中装载int类型值

iload_3            从局部变量3中装载int类型值

lload_0            从局部变量0中装载long类型值

lload_1            从局部变量1中装载long类型值

lload_2            从局部变量2中装载long类型值

 

lload_3            从局部变量3中装载long类型值

fload_0            从局部变量0中装载float类型值

fload_1            从局部变量1中装载float类型值

fload_2            从局部变量2中装载float类型值

fload_3            从局部变量3中装载float类型值

dload_0            从局部变量0中装载double类型值

dload_1            从局部变量1中装载double类型值

dload_2            从局部变量2中装载double类型值

dload_3            从局部变量3中装载double类型值

aload_0            从局部变量0中装载引用类型值

aload_1            从局部变量1中装载引用类型值

aload_2            从局部变量2中装载引用类型值

aload_3            从局部变量3中装载引用类型值

iaload            从数组中装载int类型值

laload            从数组中装载long类型值

faload            从数组中装载float类型值

daload            从数组中装载double类型值

aaload            从数组中装载引用类型值

baload            从数组中装载byte类型或boolean类型值

caload            从数组中装载char类型值

saload            从数组中装载short类型值

1.3   将栈中的值存入局部变量的指令

istore            int类型值存入局部变量

lstore            long类型值存入局部变量

fstore            float类型值存入局部变量

dstore            double类型值存入局部变量

astore            将将引用类型或returnAddress类型值存入局部变量

istore_0        int类型值存入局部变量0

istore_1        int类型值存入局部变量1

istore_2        int类型值存入局部变量2

 

 

istore_3        int类型值存入局部变量3

lstore_0        long类型值存入局部变量0

lstore_1        long类型值存入局部变量1

lstore_2        long类型值存入局部变量2

lstore_3        long类型值存入局部变量3

fstore_0        float类型值存入局部变量0

fstore_1        float类型值存入局部变量1

fstore_2        float类型值存入局部变量2

fstore_3        float类型值存入局部变量3

dstore_0        double类型值存入局部变量0

dstore_1        double类型值存入局部变量1

dstore_2        double类型值存入局部变量2

dstore_3        double类型值存入局部变量3

astore_0        将引用类型或returnAddress类型值存入局部变量0

astore_1        将引用类型或returnAddress类型值存入局部变量1

astore_2        将引用类型或returnAddress类型值存入局部变量2

astore_3        将引用类型或returnAddress类型值存入局部变量3

iastore            int类型值存入数组中

lastore            long类型值存入数组中

fastore            float类型值存入数组中

dastore            double类型值存入数组中

aastore            将引用类型值存入数组中

bastore            byte类型或者boolean类型值存入数组中

castore            char类型值存入数组中

sastore            short类型值存入数组中

wide指令

wide            使用附加字节扩展局部变量索引

1.4   通用(无类型)栈操作

nop            不做任何操作

pop            弹出栈顶端一个字长的内容

pop2            弹出栈顶端两个字长的内容

dup            复制栈顶部一个字长内容

dup_x1            复制栈顶部一个字长的内容,然后将复制内容及原来弹出的两个字长的内容压入栈

 

 

dup_x2            复制栈顶部一个字长的内容,然后将复制内容及原来弹出的三个字长的内容压入栈

dup2            复制栈顶部两个字长内容

dup2_x1            复制栈顶部两个字长的内容,然后将复制内容及原来弹出的三个字长的内容压入栈

dup2_x2            复制栈顶部两个字长的内容,然后将复制内容及原来弹出的四个字长的内容压入栈

swap            交换栈顶部两个字长内容

1.5   类型转换

i2l            int类型的数据转化为long类型

i

TAG: Findbugs findbugs java 字节码

 

评分:0

我来说两句

xiaohanjiang

xiaohanjiang

River.liu又名小寒江。曾经从事多年JAVA软件开发工作,这几年一直从事软件测试工作。多年来,一直致力于软件工程、软件开发、软件测试方面的研究。不喜欢自称高手,不愿意自封资深;科学研究讲究的是务实、实践。真理、真知才是硬道理。茫茫海洋,我只希望我的每个理念能游弋于业界之间。我的思想能在你的脑海中徜徉。

日历

« 2024-05-05  
   1234
567891011
12131415161718
19202122232425
262728293031 

数据统计

  • 访问量: 40051
  • 日志数: 52
  • 建立时间: 2009-12-15
  • 更新时间: 2011-03-14

RSS订阅