l6_NC
.pdfТехническая поддержка программных решений 6/10 Продвинутые инструменты разработчика
© 2013 NetCracker Technology Corporation Confidential
Цель лекции
•Декомпиляторы
•Статический анализ кода
•Инструменты сборки кода
•Continuous Integration
© 2013 NetCracker Technology Corporation Confidential |
2 |
Декомпиляция исходного кода
© 2013 NetCracker Technology Corporation Confidential |
3 |
JAVAP: Java-дизасамблер
>javap.exe -p DocFooter.class
import java.awt.*; |
|
|
import java.applet.*; |
Compiled from |
|
|
||
public class DocFooter extends Applet { |
"DocFooter.java" |
|
public class DocFooter |
||
String date; |
||
extends java.applet.Applet { |
||
String email; |
||
java.lang.String date; |
||
|
||
public void init() { |
java.lang.String email; |
|
public DocFooter(); |
||
resize(500,100); |
||
public void init(); |
||
date = |
||
public void |
||
getParameter("LAST_UPDATED"); |
||
paint(java.awt.Graphics); |
||
email = getParameter("EMAIL"); |
||
} |
||
} |
||
|
public void paint(Graphics g) { g.drawString(date + " by ",100, 15); g.drawString(email,290,15);
}
}>javac.exe -p DocFooter.java
© 2013 NetCracker Technology Corporation Confidential |
4 |
JAVAP: Java-дизасамблер
> javap.exe -p -c DocFooter.class > 1.log
Compiled from "DocFooter.java"
public class DocFooter extends java.applet.Applet {
java.lang.String date; |
|
|
public void init() { |
|
|
|
|
java.lang.String email; |
|
resize(500,100); |
|
|
|
|
|
public DocFooter(); |
|
|
date = getParameter("LAST_UPDATED"); |
Code: |
|
|
email = getParameter("EMAIL"); |
0: aload_0 |
|
|
|
1: invokespecial #1 |
// |
Method java/applet/Applet."<init>":()V |
|
4: return |
|
|
} |
|
|
|
|
public void init(); |
|
|
|
|
|
|
|
Code: |
|
|
|
0: aload_0 |
|
|
|
1: sipush |
500 |
|
|
4: bipush |
100 |
|
|
6: invokevirtual #2 |
// Method resize:(II)V |
||
9: aload_0 |
|
|
|
10: aload_0 |
|
|
|
11: ldc |
#3 |
// String LAST_UPDATED |
|
13: invokevirtual #4 |
// Method getParameter:(Ljava/lang/String;)Ljava/lang/String; |
||
16: putfield |
#5 |
// Field date:Ljava/lang/String; |
|
19: aload_0 |
|
|
|
20: aload_0 |
|
|
|
21: ldc |
#6 |
// String EMAIL |
|
23: invokevirtual #4 |
// Method getParameter:(Ljava/lang/String;)Ljava/lang/String; |
||
26: putfield |
#7 |
// Field email:Ljava/lang/String; |
|
29: return |
|
|
|
© 2013 NetCracker Technology Corporation Confidential |
5 |
JAD
import java.awt.*; import java.applet.*;
public class DocFooter extends Applet { String date;
String email;
public void init() { resize(500,100);
date = getParameter("LAST_UPDATED");
email = getParameter("EMAIL");
}
public void paint(Graphics g) { g.drawString(date + " by ",100, 15); g.drawString(email,290,15);
}
}
> jad.exe DocFooter.class
import java.applet.Applet; import java.awt.Graphics;
public class DocFooter extends Applet {
public DocFooter() |
{ |
|
|
} |
|
|
|
public void |
init() |
{ |
|
resize(500, 100); |
|
||
date = getParameter("LAST_UPDATED"); |
|||
email = |
getParameter("EMAIL"); |
||
} |
|
|
|
public void |
paint(Graphics g) |
{ |
g.drawString((new StringBuilder()).append(date).append(" by ").toString(), 100, 15);
g.drawString(email, 290, 15);
}
String date; String email;
}
© 2013 NetCracker Technology Corporation Confidential |
6 |
JD
import java.awt.*; import java.applet.*;
public class DocFooter extends Appl String date;
String email;
public void init() { resize(500,100);
date = getParameter("LAST_U email = getParameter("EMAIL
}
public void paint(Graphics g) { g.drawString(date + " by ",1 g.drawString(email,290,15);
}
}
http://java.decompiler.free.fr/
© 2013 NetCracker Technology Corporation Confidential |
7 |
Статический анализ кода
© 2013 NetCracker Technology Corporation Confidential |
8 |
Задачи статического анализа
•Выявление ошибок в программах
•Рекомендации по оформлению кода
Некоторые статические анализаторы позволяют проверять, соответствует ли исходный код, принятому в компании стандарту оформления кода. Имеется в виду контроль количества отступов в различных конструкциях, использование пробелов/символов табуляции и так далее.
• Подсчет метрик
Метрика программного обеспечения - это мера, позволяющая получить численное значение некоторого свойства программного обеспечения или его спецификаций. Существует большое количество разнообразных метрик, которые можно подсчитать, используя те ли иные инструменты.
http://www.viva64.com/ru/t/0046/
© 2013 NetCracker Technology Corporation Confidential |
9 |
Метрики исходного кода
•Детальнее: http://www.viva64.com/ru/a/0045/
•Пример: «Цикломатическая сложность»
•Цикломатическая сложность части программного кода — счётное число линейно независимых маршрутов через программный код.
•M = E − N + 2P, где:
‒M = цикломатическая сложность,
‒E = количество рёбер в графе,
‒N = количество узлов в графе,
‒P = количество компонент связности.
© 2013 NetCracker Technology Corporation Confidential |
10 |