Почему libFuzzer в Windows выдает ошибку: «Не найдено интересных входных данных»?

Около полгода назад я настроил проект CMake с VSCode с целью libFuzzer, который работал в Windows и macOS. Я использую расширение C++ вместе с расширением CMakeTools от Microsoft.

Когда я снова возобновил проект, в конце запуска фаззера я получаю сообщение об ошибке:

ERROR: no interesting inputs were found. Is the code instrumented for coverage? Exiting.

Полный вывод:

      INFO: Seed: 2201882200
INFO: -max_len is not provided; libFuzzer will not generate inputs larger than 4096 bytes
INFO: A corpus is not provided, starting from an empty corpus
#2      INITED exec/s: 0 rss: 61Mb
ERROR: no interesting inputs were found. Is the code instrumented for coverage? Exiting.

По сравнению с тем же фаззером при запуске на macOS:

      INFO: Seed: 1824512455
INFO: Loaded 1 modules   (7 inline 8-bit counters): 7 [0x10c2baa88, 0x10c2baa8f), 
INFO: Loaded 1 PC tables (7 PCs): 7 [0x10c2baa90,0x10c2bab00), 
INFO:        6 files found in /Users/thomas/SourceTree/vscode-cmake-libfuzzer/fuzzers/corpus/fuzz_test/
INFO: seed corpus: files: 6 min: 1b max: 10b total: 37b rss: 30Mb
#7      INITED cov: 1 ft: 1 corp: 1/1b exec/s: 0 rss: 30Mb
#1048576        pulse  cov: 1 ft: 1 corp: 1/1b lim: 8192 exec/s: 524288 rss: 1099Mb
#2097152        pulse  cov: 1 ft: 1 corp: 1/1b lim: 8192 exec/s: 699050 rss: 1100Mb
#4194304        pulse  cov: 1 ft: 1 corp: 1/1b lim: 8192 exec/s: 599186 rss: 1101Mb
#5740032        DONE   cov: 1 ft: 1 corp: 1/1b lim: 8192 exec/s: 521821 rss: 1101Mb
Done 5740032 runs in 11 second(s)
stat::number_of_executed_units: 5740032
stat::average_exec_per_sec:     521821
stat::new_units_added:          0
stat::slowest_unit_time_sec:    0
stat::peak_rss_mb:              1101

Фрагменты того, как я связал libFuzzer: (Я добавил библиотеки в Windows вручную, так как необходимо сделать ссылку).

        # https://llvm.org/docs/LibFuzzer.html#fuzzer-usage
  target_link_libraries(clang_fuzzer INTERFACE
    -fsanitize=fuzzer,address
  )
  target_compile_options(clang_fuzzer INTERFACE
    -fsanitize=fuzzer,address
  )

Тестовый фаззер:

      #include <iostream>
#include <stddef.h>
#include <stdint.h>

bool FuzzMe(const uint8_t *Data, size_t DataSize) {
  return DataSize >= 3 &&
      Data[0] == 'F' &&
      Data[1] == 'U' &&
      Data[2] == 'Z' &&
      Data[3] == 'Z';  // :‑<
}

extern "C" int LLVMFuzzerTestOneInput(const uint8_t* data, size_t size)
{
  // std::cout << "Hello Fuzzy...\n";
  FuzzMe(data, size);
  return 0;
}

Минимально полный пример: https://github.com/thomthom/vscode-cmake-libfuzzer

В Windows я установил clang через доступные снимки: https://llvm.org/builds/

На macOS я установил через brew install llvm (Поскольку AppleClang не включает libFuzzer)

Я тестировал это на двух машинах с Windows, которые раньше работали нормально, а теперь нет. Но я не могу понять, что вызвало регресс. Я знаю, что не обновлял Clang ни на одной из систем. На одном я также попытался установить Clang через Visual Studio, и я попытался выбрать эту установку также из VSCode, чтобы увидеть, имеет ли это какое-либо значение, но безрезультатно.

Единственное, о чем я могу думать, это то, что мои проекты VSCode CMake нуждались в корректировке после того, как расширение VSCode-Tools обновило генератор по умолчанию для Windows. Я не помню, что он использовал раньше. Мне все еще кажется странным, если это повлияет на libFuzzer.

2 ответа

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

В моем случае я получал эту ошибку только потому, что изменил разрешение папки корпуса (см. команду ниже). Причина, по которой я это делал, заключалась в том, что libfuzzer не добавлял новые входные данные в папку корпуса.

chmod 644 /corpus(эта команда вызвала ошибку)

Чтобы избежать этой ошибки, я попробовал другой способ добавления новых входных данных в папку; изменил владельца папки корпуса на пользователя процесса фаззера (т.е. демона в моем случае).

mkdir /corpus;chown daemon:daemon /corpus(эта команда помогла)

Оказалось, что это вызвано тем, что моя конфигурация CMake опускает эти строки для сборок Windows:

        target_link_libraries(clang_fuzzer INTERFACE
    -fsanitize=fuzzer,address
  )

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

Зафиксируйте исправление в моем примере выше:

https://github.com/thomthom/vscode-cmake-libfuzzer/commit/d7553fe01f88c71c19ff8f833b4235b8a3d17f99

Другие вопросы по тегам