Comments 14
Как думаете, много аргументов из этой статьи переносимы на утверждение, что программиста можно заменить ML-алгоритмом?
Здравствуйте, статья интересная. В целом я согласен с выводами, но мне кажется что вы не совсем корректно обозначили скоуп ответственности ML в задаче анализа: например, препроцессированием должны заниматься билд системы, и это они делают довольно успешно, насколько я помню PVS тоже в конечном итоге работает с препроцессированным файлом и делает препроцессинг за него компилятор.
Построением AST тоже может заниматься не ML, к тому же уже есть готовые решения — ваш продукт, clang и пр.
Насчет обучения — можно его "легко" научить на том же гитхабе, только прогоните весь гитаре через стат анализаторы и вы получите критерии хорошего кода
например, препроцессированием должны заниматься билд системы, и это они делают довольно успешноВот тут бы я не был так уверен) Уже в работе статья на тему очередного бага в препроцессоре от Microsoft.
Я имею ввиду, что лучше билд систем не справится никто, а баги в любом софте есть.
Вообще я бы переформулировал свой посыл так: если уж и делать стат анализ с помощью ML, то кто это сделает лучше разработчиков текущих решений? Кто лучше вас знает теорию и практику этой области? Поэтому, хоть Андрей и написал, что мы не луддиты, но выглядит эта статья именно так, при всем уважении
Интересненько, хоть и много букв.
Я думаю, 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 на кодовую базу, чтобы моделька обучилась с учётом контекста какие комбинации формального и фактического параметра верные, а какие ошибочные, было бы вполне разумно.
Статья интересная. Часто черпаю вдохновение из вашего блога, а потом адаптирую идеи для своих анализаторов.
(Ниже комментарий про 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");
}
}
Пришло время посмотреть на ChatGPT: Хорошо ли ChatGPT ищет ошибки в коде? (C#).
Использование машинного обучения в статическом анализе исходного кода программ