Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

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

902 views

Published on

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

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

Published in: Technology
  • Be the first to comment

  • Be the first to like this

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

  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>

×