Pull to refresh

Comments 14

Спасибо за статью, очень познавательно.
Как думаете, много аргументов из этой статьи переносимы на утверждение, что программиста можно заменить ML-алгоритмом?
Не берусь судить. Это другая тема. В данный момент развития, я вообще считаю эту тему не больше чем хайпом. Можно сделать какие-то «игрушки», но о промышленной разработке программ, пока на мой взгляд говорить не приходится.

Здравствуйте, статья интересная. В целом я согласен с выводами, но мне кажется что вы не совсем корректно обозначили скоуп ответственности ML в задаче анализа: например, препроцессированием должны заниматься билд системы, и это они делают довольно успешно, насколько я помню PVS тоже в конечном итоге работает с препроцессированным файлом и делает препроцессинг за него компилятор.


Построением AST тоже может заниматься не ML, к тому же уже есть готовые решения — ваш продукт, clang и пр.


Насчет обучения — можно его "легко" научить на том же гитхабе, только прогоните весь гитаре через стат анализаторы и вы получите критерии хорошего кода

например, препроцессированием должны заниматься билд системы, и это они делают довольно успешно
Вот тут бы я не был так уверен) Уже в работе статья на тему очередного бага в препроцессоре от Microsoft.

Я имею ввиду, что лучше билд систем не справится никто, а баги в любом софте есть.


Вообще я бы переформулировал свой посыл так: если уж и делать стат анализ с помощью ML, то кто это сделает лучше разработчиков текущих решений? Кто лучше вас знает теорию и практику этой области? Поэтому, хоть Андрей и написал, что мы не луддиты, но выглядит эта статья именно так, при всем уважении

А для DeepCode специально приложен скриншот срабатывания с неправильной рекомендацией? Ошибка тут не про escape, а про неправильный Content-Type для JSON. Или про ручной вызов json.dumps вместо использования JsonResponse. Если специально — почему на этом не акцентировано внимание?
Ох, а я пример с их сайта взяла, с демонстрационного прогона, просто для демонстрации интерфейса. Я даже не подумала, что там что-то с ошибкой может быть. Это предупреждение просто выглядело особенно наворочено.

Интересненько, хоть и много букв.


Я думаю, ML не должен заменять традиционный статический анализ, а должен усиливать его слабые стороны. Слабые стороны — это эвристические инспекции. Иногда нормально не заскриптуешь ошибочную ситуацию и абстрактной интерпретацией её не решишь. Например, пользователь в коде обработки графики передаёт в какой-то метод x там, где параметр называется y, и наоборот. Выглядит подозрительно. Давайте ругаться, если имя формального параметра y, а фактически передаётся переменная с именем x (или x1, или xx, или boundX). Окей, работает, нашли пару багов. Релизнули, пользователи начали жаловаться:


System.out.println(y);

Собака, метод PrintStream#println почему-то обозначил свой параметр буквой x! Добавляем исключение. Далее видим такой код:


return new Point(y, -x);

Здесь речь действительно о координатах, и действительно где ожидается x, передаётся y. Вот только полный код:


if(rotate90DegreesClockwise) {
  return new Point(y, -x);
}

Понятно, что никакой ошибки нет. И так далее. Получается очень хрупкая инспекция, у которой большой процент FP/FN и нужно скриптовать кучу случаев. Причём часто вокруг не стандартные методы API, а какие-то сторонние библиотеки или вообще классы пользовательского приложения. И это только про перепутанные x и y, а можно ведь и многие другие имена путать. В таких случаях, мне кажется, натравить ML на кодовую базу, чтобы моделька обучилась с учётом контекста какие комбинации формального и фактического параметра верные, а какие ошибочные, было бы вполне разумно.

У Вас очень крутой графический дизайнер в команде. Единорожки просто великолепны!
Отличный (как, впрочем, и всегда в вашем блоге) пост для демонстрации кейса, в который люди на волне хайпа пытаются вкрутить ML, а он там и не нужен.
Хорошая статья, и иллюстрации интересные.

Статья интересная. Часто черпаю вдохновение из вашего блога, а потом адаптирую идеи для своих анализаторов.


(Ниже комментарий про Go, но концепция не привязана к нему, уже есть для PHP похожая реализация, остальные языки — тоже не проблема.)


Для сравнения, в ruleguard правило для "x==x" выглядело бы так:


m.Match(`$x == $x`).
  Where(m["x"].Pure).
  Report(`suspicious identical LHS and RHS`)

Условие pure нужно в основном для избежания false positives в случаях, где у нас $x — это выражение с побочными эффектами, типа вызова функции, которая модифицирует глобальный state.


Const folding ещё не доделан, но запланирован, поэтому эквивалентность x[0] и x[1-1] будет учтена.


В match через запятую можно перечислить остальные шаблоны, например $x != $x:


m.Match(`$x || $x`,
        `$x && $x`,
        `$x | $x`,
        `$x & $x`,
        `$x ^ $x`,
        `$x < $x`,
        `$x > $x`,
        `$x &^ $x`,
        `$x % $s`,
        `$x == $x`,
        `$x != $x`,
        `$x <= $x`,
        `$x >= $x`,
        `$x / $x`,
        `$x - $x`).
  Where(m["x"].Pure).
  Report(`suspicious identical LHS and RHS`)

Хотя в PVS-Studio не так много синтаксических проверок, в основном самые лучшие — это связанные с data flow, что через шаблоны представить пока трудно. Но в CodeQL он есть, и там тоже похожая концепция поиска кода через запросы с условиями.


Больше примеров: https://github.com/quasilyte/go-ruleguard/blob/master/rules.go


Для удобства, вот сниппет из статьи, на который я делаю комментарий:


void RulePrototype_V501(VivaWalker &walker,
  const Ptree *left, const Ptree *right, const Ptree *operation)
{
  if (SafeEq(operation, "==") && SafeEqual(left, right))
  {
    walker.AddError("Ой беда, беда!", left, 501, Level_1, "CWE-571");
  }
}
Sign up to leave a comment.