Анализ кода: почему это интересно и когда это нужно Руслан Шевченко ГрадСофт http://www.gradsoft.ua
Предварительные сведения <ul><li>Если предпочитаете читать, а не слушать: </li><ul><li>http://bit.ly/o0sqK8
Есть в  twitterе по тегу #OSDN </li></ul><li>Остановки по требованию </li><ul><li>Подробности - почтой </li></ul></ul>
О чем это вобще все <ul><li>TermWare –  (правила переписывания) </li><ul><li>http://www.gradsoft.ua/products/termware_rus....
(след)  https://github.com/rssh/stermware </li></ul><li>JavaChecker –  (анализ Java кода) </li><ul><li>http://redmine.grad...
TermWare – система переписывания <ul><li>A  ->  B
d(x*y)  =  d(x)*y  + d(y)*x </li></ul>
TermWare <ul><li>протоколы беспроводной передачи данных
Алгортимы  Цейтлина ==> исполняемый код
трансляция алгоритмов  С => NUMA графическом ускорителе
Java =>
Java => Java
6  лет,  около 20 публикаций  </li></ul>
JavaChecker <ul><li>Java =>  whatever </li><ul><li>Перечень дефектов
Понимание
Верификация </li></ul></ul>
JavaChecker this.x =  x
JavaChecker <ul><li>define(EmptyCatchBlock,exceptions,&quot;empty catch block&quot;,
BT_TYPE_RULESET,
ruleset(
Catch($x,Block(NIL))
-> true  [ violationDiscovered(EmptyCatchBlock,&quot;empty catch block&quot;,$x) ]
),
true
Upcoming SlideShare
Loading in …5
×

анализ кода: от проверки стиля до автоматического тестирования

791 views

Published on

Рассказ о истории и использовании в реальной жизни инструментов анализа кода на основе JavaChecker и TermWare

Сопустствующий текст: http://datacenter.gradsoft.ua/files/articles/OSDN2011/

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
791
On SlideShare
0
From Embeds
0
Number of Embeds
2
Actions
Shares
0
Downloads
4
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

анализ кода: от проверки стиля до автоматического тестирования

  1. 1. Анализ кода: почему это интересно и когда это нужно Руслан Шевченко ГрадСофт http://www.gradsoft.ua
  2. 2. Предварительные сведения <ul><li>Если предпочитаете читать, а не слушать: </li><ul><li>http://bit.ly/o0sqK8
  3. 3. Есть в twitterе по тегу #OSDN </li></ul><li>Остановки по требованию </li><ul><li>Подробности - почтой </li></ul></ul>
  4. 4. О чем это вобще все <ul><li>TermWare – (правила переписывания) </li><ul><li>http://www.gradsoft.ua/products/termware_rus.html
  5. 5. (след) https://github.com/rssh/stermware </li></ul><li>JavaChecker – (анализ Java кода) </li><ul><li>http://redmine.gradsoft.ua/projects/javachecker </li></ul><li>JPE -- частичные вычисления: </li><ul><li>http://www.gradsoft.kiev.ua/products/jpe_rus.html </li></ul><li>Langtools – (разные: dot, php, итд) </li></ul>
  6. 6. TermWare – система переписывания <ul><li>A -> B
  7. 7. d(x*y) = d(x)*y + d(y)*x </li></ul>
  8. 8. TermWare <ul><li>протоколы беспроводной передачи данных
  9. 9. Алгортимы Цейтлина ==> исполняемый код
  10. 10. трансляция алгоритмов С => NUMA графическом ускорителе
  11. 11. Java =>
  12. 12. Java => Java
  13. 13. 6 лет, около 20 публикаций </li></ul>
  14. 14. JavaChecker <ul><li>Java => whatever </li><ul><li>Перечень дефектов
  15. 15. Понимание
  16. 16. Верификация </li></ul></ul>
  17. 17. JavaChecker this.x = x
  18. 18. JavaChecker <ul><li>define(EmptyCatchBlock,exceptions,&quot;empty catch block&quot;,
  19. 19. BT_TYPE_RULESET,
  20. 20. ruleset(
  21. 21. Catch($x,Block(NIL))
  22. 22. -> true [ violationDiscovered(EmptyCatchBlock,&quot;empty catch block&quot;,$x) ]
  23. 23. ),
  24. 24. true
  25. 25. ), </li></ul>
  26. 26. JavaChecker <ul><li>EqualityExpressionModel($x,$y,$op,$ctx) [
  27. 27. $x!=NullLiteral() && $y!=NullLiteral()
  28. 28. &&
  29. 29. !car($ctx.getExpressionModel().getSubExpressions()) .getType().isPrimitiveType()
  30. 30. &&
  31. 31. !car($ctx.getExpressionModel().getSubExpressions()).getType().isEnum()
  32. 32. &&
  33. 33. !car(cdr($ctx.getExpressionModel().getSubExpressions())) .getType().isPrimitiveType()
  34. 34. &&
  35. 35. !car($ctx.getExpressionModel().getSubExpressions()) .getType().isEnum()
  36. 36. ] -> true
  37. 37. [ violationDiscovered(ObjectComparisonWithEquality,
  38. 38. &quot;object compared by == or !=&quot;, s($x,$y)) ]
  39. 39. !-> false </li></ul>
  40. 40. Что дальше
  41. 41. Поиск дефектов <ul><ul><li>Люди учатся
  42. 42. False positives </li><ul><ul><li>(?) - эффект есть, но небольшой </li></ul></ul></ul></ul>
  43. 43. Метрики / Понимание <ul><li>Какие классы основные
  44. 44. Разбиение на подсистемы </li></ul>Анализ связности
  45. 45. Метрики / Валидация <ul><li>Можно использовать данный код или нет ?
  46. 46. Какие части нуждаются во внимании </li></ul>
  47. 47. Эволюция API <ul><li>Как понять – какие изменения нужны, а какие – нет. </li></ul><ul><li>Отметить те места, которые подвергнутся изменению
  48. 48. Посчитать соотношение трудоемкость/эффект </li><ul><ul><ul><ul><ul><ul><ul><ul><ul><li>( для нескольких вариантов) </li></ul></ul></ul></ul></ul></ul></ul></ul></ul><li>Выбрать лучший </li></ul>
  49. 49. Пример -- JDK7 <ul><li>Около 20 предложений к изменению имеют смысл
  50. 50. Реализовать можно 5 – какие именно ? </li><ul><li>Выбран корпус Java текстов (jdk, hibernate, CompierCRM, jetty)
  51. 51. Для каждого предложения посчитано к-ство мест, которые будут выглядеть лучше </li></ul></ul>
  52. 52. JDK7: результаты <ul><li>CollectionGetOrSet (simplicified collection element access): 5438
  53. 53. CollectionLiterals (collection literals can be applied): 35
  54. 54. DiamondInitializers (initializers with allocation and type arguments): 1499
  55. 55. DiamondInitializers_percents (per all variable initializers): 1.071503
  56. 56. Elvis (Elvis and Other Null-Safe Operators): 821
  57. 57. Elvis_percents (per if-s and conditions): 2.330136
  58. 58. MultiCatch (multi catch): 412
  59. 59. MultiCatch_percents (per all catchs): 4.898347
  60. 60. NewIntegerLiterals (New Integer Literals): 7131
  61. 61. NewIntegerLiterals_percents (per all integer literal): 5.848821
  62. 62. StringInSwitch (string in switch): 444 </li></ul>
  63. 63. Верификация свойств <ul><li>Может ли возникнуть race condition в данном блоке </li><ul><li>(всю программу не проверишь – блок можно) </li></ul><li>Можно ли показать что нет SQL injection </li><ul><li>(можно и сравнительно легко) </li></ul><li>Правда ли что метод Ххх вызывается всегда с одним параметром </li><ul><li>(проверить легко) </li></ul></ul>
  64. 64. Преобразования кода <ul><li>Одна кодовая база -- несколько реализаций </li></ul>
  65. 65. Преобразование кода/пример void main(String[] args) { if (CompileTimeConstance.DEBUG) { System.out.println(“debug”); } System.out.println(“Hello, world”); }
  66. 66. Преобразование кода / зачем <ul><li>Встроенные устройства
  67. 67. Разная функциональность в одном коде (Free/Pro) </li></ul>
  68. 68. Need Help <ul><li>Два направления </li><ul><li>Движок </li><ul><li>(слишком абстрактный что бы привлекать внимание)
  69. 69. (3-я версия разрабатывается с 2009 г) – (почти perl 6) </li><ul><li>SCALA
  70. 70. Автоматный матчинг
  71. 71. Система типов </li></ul></ul><li>JavaChecker </li><ul><li>(понятный)
  72. 72. Нужна эволюция </li></ul></ul></ul>
  73. 73. TermWare/анализ (2 направления)
  74. 74. Ищем <ul><li>Кому интересен анализ кода </li><ul><li>(взять Java часть) </li></ul><li>Реальные индустриальные задачи анализа </li><ul><li>(апробировать методы решения)
  75. 75. (специализированный консалтинг) </li></ul></ul>
  76. 76. Спасибо за внимание <ul><li>Руслан Шевченко
  77. 77. Http://www.gradsoft.ua
  78. 78. @rssh1
  79. 79. #OSDN </li></ul>

×