Как стать автором
Поиск
Написать публикацию
Обновить

Комментарии 2

Здравствуйте, Владислав. Меня зовут Алексей Бородин, я руковожу группой разработки анализатора Svace. Я проектировал возможность кастомизации. Было интересно прочесть вашу статью.

В целом всё так и есть. При создании Svace API хотелось предоставить функциональность для написания правил, которые не требуют много опыта в статическом анализе и знания множества особеностей Svace. Я писал в нашем блоге (https://svace.pages.ispras.ru/svace-website/2023/04/28/svace-api.html), что первая версия должна позволять писать детекторы, которые чуть сложнее, чем использование утилиты grep. Функциональность планировалось расширять на основе обратной связи от пользователей.

Обратной связи было не много. Но стало понятно, что идея с IR API неудачная. Пользователь оказывался один на один с промежуточным представлением Svace без какого либо анализа со стороны движка: распространения констант, анализа алиасов и т.д. В вашем примере детектор выдал срабатывание для строки 'index % 1', т. к. 1 - это единственная константа, которая используется в примере. Во всех остальных случаях используются переменные, имещие значение 1. Код с использованием функции 'foo' требует уже межпроцедурного анализа. Писать дополнительные анализы сложно, и кроме этого, неэффективно, т.к. похожая функциональность будет писаться в каждом детекторе. Можно предоставить доступ к внутренним свойствам анализатора, но в этом случае потребуется больших знаний об его устройстве.

Вместо этого мы решили развивать Svace Light API. В релизе 4.0 мы добавили больше паттернов в этот движок. Можно писать паттерны на константы, на часть внутренних атрибутов анализатора (интервалы целочисленных значений, размеры массивов, tainted-свойства), на типы узлов и другие. Мы включили примеры реализации некоторых простых детекторов.

Пример реализации детектора на вызов функции malloc с нулевым или отрицательным аргументом:

@Override
public void createChecker() {
  SvaceLightPattern nullAndNegativeOp = interval(SvaceCond.NotGreater, 0);
  //the pattern below will react if 1st argument of malloc is 0 or negative.
  SvaceLightPattern pattern = funcCall("malloc", 0, nullAndNegativeOp);

  registerChecker(warning, "Do not use 0 for malloc.", pattern);
}


Другой пример находит бесполезные вызовы операций деления и остатка от деления:

@Override
public void createChecker() {
  // React to division operator "/" or call of function named "div_vec"
  SvaceLightPattern divisionOperator = or(entityType(BinaryOperator.Division.type()), funcCall("div_vec"));

  // React to modulo (a.k.a. remainder) "%" operator
  SvaceLightPattern moduloOperator = entityType(BinaryOperator.Modulo.type());

  // React when right hand side value of division (or second parameter of div_vec function)
  // equals to one
  SvaceLightPattern divisorEqualsToOne = arg(1, interval(SvaceCond.Equals, 1));

  // Construct the final pattern by matching both operator type and argument value
  SvaceLightPattern divisionPattern = and(divisionOperator, divisorEqualsToOne);
  SvaceLightPattern moduloPattern = and(moduloOperator, divisorEqualsToOne);

  // And finally don't forget to register patterns as checkers
  registerChecker(divisionByOne, "Division by one is redundant.", divisionPattern);
  registerChecker(moduloByOne, "Modulo by one always returns zero.", moduloPattern);
}


Фактически это реализация вашего детектора в Svace Light API. В коде переменные divisionByOne и moduloByOne - это 2 детектора для выдачи предупреждений. Я убрал код по их созданию, т. к. он тривиальный. На вашем примере детектор выдаёт 5 срабатываний из 7. Не находится 2 срабатывания, связанные со значениями глобальных переменных.

В ближайшем обновлении анализатора мы планируем добавить возможность создавать свои собственные атрибуты, которые будут распространяться движком Svace. Это позволит создавать значительно более интересные детекторы.

Если у вас есть какие-то вопросы или пожелания по поводу возможностей Svace API - пишите, мы постараемся сделать, если это возможно в архитектуре анализатора.


Здравствуйте, Алексей!

Спасибо за развёрнутый и информативный фидбек. Очень интересно попробовать новую функциональность Light API. Я обязательно это сделаю и расскажу о том, что получилось.

Зарегистрируйтесь на Хабре, чтобы оставить комментарий