1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/mirrors_trending-weggli

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

weggli

Введение

weggli — это быстрый и надёжный инструмент семантического поиска для кодовых баз на C и C++. Он предназначен для того, чтобы помочь исследователям безопасности выявлять интересные функции в больших кодовых базах.

weggli выполняет сопоставление с образцом по абстрактным синтаксическим деревьям на основе запросов, предоставленных пользователем. Его язык запросов напоминает код на C и C++, что упрощает превращение интересных шаблонов кода в запросы.

weggli вдохновлён такими замечательными инструментами, как Semgrep, Coccinelle, joern и CodeQL, но принимает несколько иные проектные решения:

  • Поддержка C++: weggli имеет первоклассную поддержку современных конструкций C++, таких как лямбда-выражения, циклы for на основе диапазонов и constexprs.

  • Минимальная настройка: weggli должен работать из коробки с большинством программного обеспечения, с которым вы столкнётесь. weggli не требует возможности сборки программного обеспечения и может работать с неполными исходными кодами или отсутствующими зависимостями.

  • Интерактивность: weggli разработан для интерактивного использования и быстрой работы с запросами. В большинстве случаев запрос weggli будет выполняться быстрее, чем поиск grep. Цель состоит в том, чтобы обеспечить интерактивный рабочий процесс, в котором возможно быстрое переключение между проверкой кода и созданием/улучшением запроса.

  • Жадность: сопоставление шаблонов weggli предназначено для нахождения как можно большего количества (полезных) совпадений для конкретного запроса. Хотя это увеличивает риск ложных срабатываний, это упрощает создание запросов. Например, запрос $x = 10; будет соответствовать как выражениям присваивания (foo = 10;), так и объявлениям (int bar = 10;).

Использование

Используйте -h для кратких описаний и --help для получения более подробной информации.

 Домашняя страница: https://github.com/weggli-rs/weggli

 ИСПОЛЬЗОВАНИЕ: weggli [OPTIONS] <ШАБЛОН> <ПУТЬ>

 АРГУМЕНТЫ:
     <ШАБЛОН>
            Шаблон поиска weggli. Язык запросов weggli очень похож на
             C и C++ с небольшим количеством дополнительных функций.

             Например, шаблон '{_ $buf[_]; memcpy($buf,_,_);}' найдёт все вызовы memcpy, которые непосредственно записывают данные в буфер стека.

             Помимо обычных конструкций C и C++, язык запросов weggli поддерживает следующие функции:

             _        Подстановочный знак. Будет соответствовать любому узлу AST.

             $var     Переменные. Можно использовать для написания запросов, независимых
                      от идентификаторов. Переменные соответствуют идентификаторам, типам,
                      именам полей или пространствам имён. Опция --unique дополнительно обеспечивает, что $x != $y != $z. Опция --regex может
                      обеспечить соответствие переменной (или несоответствие) регулярному выражению.

             _(..)    Подвыражения. Подстановочный знак _(..) соответствует произвольным
                      подвыражениям. Это может быть полезно, если вы ищете какую-то
                      операцию с участием переменной, но больше ничего о ней не знаете.
                      Например, _(test) будет соответствовать таким выражениям, как test+10,
                      buf[test->size] или f(g(&test));

             not:     Отрицательные подзапросы. Показывать только результаты, которые не соответствуют
                      следующему подзапросу. Например, '{not: $fv==NULL; not: $fv!=NULL *$v;}'
                      найдёт разыменования указателей, которым не предшествует проверка NULL.

            strict:  Включить более строгое сопоставление. Это отключает разворачивание операторов и жадное сопоставление имён функций. Например 'strict: func();' 
                      больше не будет соответствовать 'if (func() == 1)..' или 'a->func()'.

             weggli автоматически разворачивает выражения в запросе, чтобы искать внутреннее выражение вместо этого. Это означает, что запрос `{func($x);}`
             будет соответствовать `func(a);`, но также `if (func(a)) {..}` или  `return func(a)`. Сопоставление с `func(a)` также будет соответствовать `func(a,b,c)` или `func(z,a)`. ### Аналогично, `void func($t $param)` также будет соответствовать определениям функций с несколькими параметрами.

Дополнительные шаблоны можно указать с помощью опции `--pattern` (`-p`). Это позволяет выполнять поиск по функциям или определениям типов.

**<PATH>**

Входной каталог или файл для поиска. По умолчанию, weggli будет искать внутри файлов `.c` и `.h` для режима C по умолчанию или файлов `.cc`, `.cpp`, `.cxx`, `.h` и `.hpp` при выполнении в режиме C++ (с использованием опции `--cpp`).

Альтернативные окончания файлов можно задать с помощью опции `--extensions` (`-e`).

При объединении weggli с другими инструментами или шагами предварительной обработки файлы также могут быть указаны через STDIN путём установки каталога на `-` и передачи списка имён файлов.

### **Опции:**

* `-A`, `--after <after>`: строки для печати после совпадения. По умолчанию = 5.
* `-B`, `--before <before>`: строки для печати перед совпадением. По умолчанию = 5.
* `-C`, `--color`: принудительное включение цветного вывода.
* `-X`, `--cpp`: включение режима C++.
* `--exclude <exclude>...`: исключить файлы, соответствующие заданному регулярному выражению.
* `-e`, `--extensions <extensions>...`: расширения файлов для включения в поиск.
* `-f`, `--force`: принудительный поиск, даже если запросы содержат синтаксические ошибки.
* `-h`, `--help`: выводит справочную информацию.
* `--include <include>...`: поиск только файлов, соответствующих заданному регулярному выражению.
* `-l`, `--limit`: показать только первое совпадение в каждой функции.
* `-p`, `--pattern <p>...`: дополнительные шаблоны поиска.
* `-R`, `--regex <regex>...`: фильтрация совпадений переменных на основе регулярного выражения. Эта функция использует Rust regex crate, поэтому поддерживается большинство функций регулярных выражений в стиле Perl. (см. https://docs.rs/regex/1.5.4/regex/#syntax)

Примеры:

Найти вызовы функций, начинающиеся со строки «mem»:

weggli -R 'func=^mem' '$func(_);'


Найти вызовы memcpy, где последний аргумент не назван «size»:

weggli -R 's!=^size$' 'memcpy(,,$s);'

* `-u`, `--unique`: обеспечение уникальности совпадений переменных. По умолчанию две переменные, такие как `$a` и `$b`, могут совпадать по одинаковым значениям. Например, запрос `$x=malloc($a); memcpy($x, _, $b);` будет соответствовать обоим

void *buf = malloc(size); memcpy(buf, src, size);

и

void *buf = malloc(some_constant); memcpy(buf, src, size);

Использование флага unique отфильтрует первое совпадение, поскольку `$a==$b`.
* `-v`, `--verbose`: устанавливает уровень детализации.
* `-V`, `--version`: выводит информацию о версии.
## Примеры

Вызовы memcpy, которые записывают в буфер стека:

```c
weggli '{
    _ $buf[_];
    memcpy($buf,_,_);
}' ./target/src

Вызовы foo, которые не проверяют возвращаемое значение:

weggli '{
   strict: foo(_);
}' ./target/src

Потенциально уязвимые пользователи snprintf():

weggli '{
    $ret = snprintf($b,_,_);
    $b[$ret] = _;
}' ./target/src

Потенциальные неинициализированные указатели:

weggli '{ _* $p;
NOT: $p = _;
$func(&$p);
}' ./target/src

Потенциально небезопасное использование WeakPtr:

weggli --cpp '{
$x = _.GetWeakPtr(); 
DCHECK($x); 
$x->_;}' ./target/src

Проверка итератора только для отладки:

weggli -X 'DCHECK(_!=_.end());' ./target/src

Функции, выполняющие запись в буфер стека на основе аргумента функции:

weggli '_ $fn(_ $limit) {
    _ $buf[_];
    for (_; $i<$limit; _) {
        $buf[$i]=_;
    }
}' ./target/src

Функции со строкой decode в их имени:

weggli -R func=decode '_ $func(_) {_;}'

Функции кодирования/преобразования:

weggli '_ $func($t *$input, $t2 *$output) {
    for (_($i);_;_) {
        $input[$i]=_($output);
    }
}' ./target/src
## Установка
```sh
$ cargo install weggli

Инструкция по сборке

# опционально: установить rust
``` ## Детали реализации

Weggli создан на основе библиотеки для синтаксического анализа *tree-sitter* и её грамматик для *C* и *C++*.

Поисковые запросы сначала анализируются с помощью расширенной версии соответствующей грамматики, а полученный *AST* преобразуется в набор запросов *tree-sitter* в файле *builder.rs*. 
Фактическое сопоставление запросов реализовано в *query.rs*, который представляет собой относительно небольшую оболочку вокруг механизма запросов *tree-sitter*, добавляющую специфические функции *Weggli*.

## Вклад

Подробности см. в *CONTRIBUTING.md*.

## Лицензия

Apache 2.0; подробности см. в *LICENSE*.

## Отказ от ответственности

Этот проект не является официальным проектом Google. Он не поддерживается Google, и Google специально отказывается от всех гарантий относительно его качества, товарной пригодности или пригодности для определённой цели.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Weggli — это быстрый и надёжный инструмент семантического поиска для кодовых баз на C и C++. Он разработан, чтобы помочь исследователям в области безопасности выявлять интересные функциональные возможности в больших кодовых базах. Развернуть Свернуть
Rust и 2 других языков
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/mirrors_trending-weggli.git
git@api.gitlife.ru:oschina-mirror/mirrors_trending-weggli.git
oschina-mirror
mirrors_trending-weggli
mirrors_trending-weggli
main