Upgrade to Pro — share decks privately, control downloads, hide ads and more …

[SnowOne 2023] Артемий Сартаков: Статический анализ для всех и для каждого

jugnsk
March 17, 2023
10

[SnowOne 2023] Артемий Сартаков: Статический анализ для всех и для каждого

Каждый начинающий разработчик рано или поздно задается вопросом: "А какое направление мне выбрать?". И если некоторые области освещены довольно неплохо (например, бэкенд-разработка), то о других найти информацию, особенно из первых рук, достаточно сложно.

В этом докладе поговорим о довольно специфичном направлении — статический анализ программ. Обсудим, что нужно знать, чтобы работать в данной области, какие есть преимущества и какие подводные камни. А главное — попробуем все на практике и постараемся разобраться, можно ли пользоваться статическими анализаторами без понимания, как они работают.

Доклад будет сконцентрирован на анализе программ в IntelliJ IDEA

jugnsk

March 17, 2023
Tweet

More Decks by jugnsk

Transcript

  1. СТАТИЧЕСКИЙ АНАЛИЗ
    ДЛЯ ВСЕХ И ДЛЯ КАЖДОГО

    View Slide

  2. ОБО МНЕ
    Артемий Сартаков
    Закончил ФИТ НГУ в 2017
    5 лет в статическом анализе (Java
    plugin for IntelliJ IDEA)
    Преподаю ООП на ФИТе
    2

    View Slide

  3. 3
    Я ЛЮБЛЮ
    МУЧИТЬ
    СТУДЕНТОВ

    View Slide

  4. ALT+ENTER КОД РЕВЬЮ
    » Берем проект студента
    » Открываем в IDEA
    » Ругаемся на желтый код
    4

    View Slide

  5. ЧТО С ЭТИМ МЕТОДОМ НЕ ТАК?
    5

    View Slide

  6. ЧТО С ЭТИМ МЕТОДОМ НЕ ТАК?
    6

    View Slide

  7. ИДЕЙКА ПРО ЭТО ЗНАЕТ
    7

    View Slide

  8. » Статический анализ – это анализ компьютерных
    программ, который производится без их запуска.

    View Slide

  9. Я, СТАТИЧЕСКИЙ
    АНАЛИЗАТОР

    View Slide

  10. Статический анализ – это анализ компьютерных
    программ, который производится без их запуска. Обычно
    этот анализ производится автоматически.

    View Slide

  11. А КАК?
    11

    View Slide

  12. ДАВАЙТЕ АВТОМАТИЗИРУЕМ
    » Ищем for в коде
    » Ищем внутри if (проверяем, что у него нет else). Больше ничего в цикле
    быть не должно
    » Смотрим, что внутри if есть только запись значения в переменную
    12

    View Slide

  13. НО ЕСТЬ НЮАНС(Ы)
    Запись здорового человека Запись курильщика
    13

    View Slide

  14. ДА ЛАДНО, ЧТО ТАМ ПИСАТЬ-
    ТО!
    14

    View Slide

  15. ДА ЛАДНО, ЧТО ТАМ ПИСАТЬ-
    ТО!
    15

    View Slide

  16. View Slide

  17. РЕГЕКСЫ ДОМА…
    Write a regular expression that would match the Java loops like this (if statement
    condition, variable names and types can be different): for(Pipe pipe: pipes) { if
    (pipe.collision(flappyBird)) { found = true; } }
    17

    View Slide

  18. Абстрактное синтаксическое дерево (AST) – это
    представление исходного кода программы в виде дерева,
    каждый из узлов которого является конструкцией языка
    Program structure interface (PSI) – AST внутри IntelliJ IDEA
    AST

    View Slide

  19. ФАЙЛ – ЭТО ДЕРЕВО
    19

    View Slide

  20. ФАЙЛ – ЭТО ДЕРЕВО
    20
    GameModel.java
    PsiFile
    GameModel
    PsiClass
    checkCollisions()
    PsiMethod
    pipes
    PsiField
    flappyBird
    PsiField
    move()
    PsiMethod

    View Slide

  21. МЕТОД – ЭТО ДЕРЕВО
    21
    for (Pipe: pipes) {…}
    PsiForeachStatement
    boolean found = false;
    PsiExpressionStatement
    checkCollisions()
    PsiMethod

    View Slide

  22. FOR – ЭТО ДЕРЕВО
    22
    Pipe pipe
    PsiParameter
    pipes
    PsiReferenceExpression
    { … }
    PsiCodeBlock
    for (Pipe pipe: pipes) {…}
    PsiForeachStatement
    If (…) {…}
    PsiIfStatement

    View Slide

  23. ИНСПЕКЦИИ
    » Обходят дерево (PsiFile) вглубину, используют паттерн визитор
    » Помечают проблемный элемент и предлагают автоматические
    исправления (квик-фиксы)
    » На основе пометок подсвечивается код в редакторе
    23

    View Slide

  24. ПЛАН ДЕЙСТВИЙ
    » Получаем на вход узел дерева (определенную языковую конструкцию)
    » Проверяем, что этот узел нам подходит (выглядит подозрительно)
    » Регистрируем проблему
    24

    View Slide

  25. ПИШЕМ
    ИНСПЕКЦИЮ

    View Slide

  26. КОРРЕКТНОСТЬ
    АНАЛИЗА

    View Slide

  27. FALSE POSITIVE

    View Slide

  28. FALSE-POSITIVE
    28

    View Slide

  29. FALSE-POSITIVE
    29

    View Slide

  30. » Сайд-эффект– что-то, что производит наблюдаемое
    изменение состояния программы

    View Slide

  31. СТАНДАРТНЫЕ САЙД ЭФФЕКТЫ
    » Выброс исключения
    » Логирование / System.out.println
    » Запись в поле
    31

    View Slide

  32. САЙД-ЭФФЕКТЫ
    32

    View Slide

  33. САЙД-ЭФФЕКТЫ (IDEA)
    » Кидание исключения
    » Логирование / System.out.println
    » Запись в поле
    » Чтение из volatile поля
    » Больше одного вызова
    33

    View Slide

  34. FALSE NEGATIVE

    View Slide

  35. FALSE NEGATIVE
    35
    » Поддержать разные виды циклов
    » Скобочки и присваивание к нескольким переменным
    » Поддержать неявные if’ы
    » Удалять if, если переменная не используется

    View Slide

  36. ДА... (ВИДЫ ЦИКЛОВ)
    36

    View Slide

  37. НО СНОВА САЙД-ЭФФЕКТЫ...
    37

    View Slide

  38. ДА... (ЦЕПОЧКА ПРИСВАИВАНИЙ)
    38

    View Slide

  39. НО НУЖНО УЧЕСТЬ МАССИВЫ...
    39

    View Slide

  40. ДА... (НЕЯВНЫЙ IF)
    40

    View Slide

  41. ДА...(НЕЯВНЫЙ IF)
    41

    View Slide

  42. НО ЕЩЕ НЕ СДЕЛАНО...
    42

    View Slide

  43. BIGBRAIN
    ИНСПЕКЦИИ

    View Slide

  44. УДАЛЯТЬ IF ЦЕЛИКОМ
    44

    View Slide

  45. ПЕРЕМЕННАЯ НЕ ИСПОЛЬЗУЕТСЯ
    » Есть объявление, без инициализатора
    » Есть только одно присваивание внутри if внутри цикла
    45

    View Slide

  46. ПЕРЕМЕННАЯ НЕ ИСПОЛЬЗУЕТСЯ
    » Есть только записи, но нет чтения
    46

    View Slide

  47. ПЕРЕМЕННАЯ НЕ ИСПОЛЬЗУЕТСЯ
    » Есть переприсваивания в другие переменные
    » Для всех этих переменных нет другого вида чтения
    47

    View Slide

  48. CONTROL FLOW ANALYSIS
    48

    View Slide

  49. ГДЕ ЕЩЕ СТАТИЧЕСКИЙ АНАЛИЗ
    » Редактор
    » Дебаггер
    » Коммиты
    » Поиск
    » To be continued…
    49

    View Slide

  50. ИТОГ
    » Статический анализ – это автоматический анализ кода без его запуска
    » Очень часто в основе анализа лежит AST – представление кода в виде
    дерева
    » Написать базовую проверку вашего кода просто
    » Написать проверку для всех случаев бывает сложно, но весело
    » Много компаний занимается статическим анализом
    50

    View Slide

  51. Q&A

    View Slide

  52. ПОЛЕЗНЫЕ ССЫЛКИ
    » https://youtrack.jetbrains.com/issue/IDEA-254535/Inspection-Loop-can-be-
    terminated-when-condition-is-met-fails-to-detect-relevant-snippet - request to
    support implicit if statements
    » https://plugins.jetbrains.com/docs/intellij/developing-plugins.html - guide for
    IntelliJ IDEA plugin developers
    » https://craftinginterpreters.com/contents.html - good introduction book about
    static analysis
    52

    View Slide