Что такое Джаланги?

Фреймворк динамического анализа как для внешнего, так и для внутреннего JavaScript. Он позволяет вам отслеживать каждую операцию программы JavaScript, писать собственные анализы программ и инструменты, такие как линтеры, средства проверки стиля, оптимизация кэширования и т. д.

Он был создан Koushik Sen и Liang Gong в Беркли в 2013 году при поддержке Samsung Research America, которая хотела восполнить недостаток инструментов, которыми пользовались другие популярные языки, такие как C++ или Java [1].

Требования

  • Node v12 (кажется, v18 хорошо работает для меня)
  • Python 2.7 или выше и ниже 3.0, но нужен только для тестирования

Монтаж

Либо скачать из npm:

npm install jalangi2 
cd node_modules/jalangi2

Или клонируйте репозиторий:

git clone https://github.com/Samsung/jalangi2 
cd jalangi2

Чтобы проверить, все ли работает, запустите образец анализа со следующим (обратите внимание, что вы должны находиться в каталоге jalangi2/):

node src/js/commands/jalangi.js --inlineSource --analysis src/js/sample_analyses/dlint/CheckNaN.js src/js/sample_analyses/dlint/Utils.jsIf everything went well this will have generated:

Если все прошло хорошо, это сгенерирует:

  • Utils_jalangi_.js с инструментальным кодом
  • Utils_jalangi_.json с результатом анализа.

Как это работает

Он использует исходный код javascript для обеспечения уровня абстракции и простого API, что значительно упрощает реализацию сложных методов анализа.

API позволяет подключать обратные вызовы функций до и после почти каждого события или операции в вашем коде.

Наш собственный анализ

Вы можете найти каждую перехватываемую операцию в документах. Мы собираемся начать с перехвата вызовов console.log и изменения вывода.

  1. Создайте файл analysis.js
(function (sandbox) {
    J$.analysis = {
      invokeFunPre: function (iid, f, base, args) {
        args[0] = "You've been modyfied!";
        if (f == console.log) {
          return { f: f, base: base, args: args };
        }
      }
    };
  })(J$);

2. Создайте файл sample.js для анализа

function annoyingLogger(msg) {
    console.log(msg);
}
annoyingLogger("Hello World");

3. Заходим в терминал и запускаем

node src/js/commands/jalangi.js --inlineSource --analysis <analysis.js filepath> <sample.js filepath>

И он должен выводить только You've been modyfied!

Секреты и уловки

Вы можете связать анализы с:

node src/js/commands/jalangi.js --inlineSource --analysis src/js/sample_analyses/ChainedAnalyses.js --analysis <analysis 1 filepath> --analysis <analysis 2 filepath> <target file>

Для расположения кода включите флаг --inlineIID и используйте:

var iidToLocation = sandbox.iidToLocation;
var codeLine = iidToLocation(getGlobalIID(iid)).split(":")[2];

Если вы хотите узнать о более сложных анализах, используйте их онлайн-песочницу.

Рекомендации

Первоначально опубликовано на https://dev.to 10 ноября 2022 г.