Giter Club home page Giter Club logo

futag's People

Contributors

aslepykh avatar dependabot[bot] avatar satyrestr avatar thientc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

futag's Issues

Утеря profraw

Хотелось бы иметь .profraw файлы после работы FUTAG. Как я увидел - флаги для компиляции достаточны для генерации покрытия через llvm-cov. Однако при сборке инструмента и генерации цели даже для дополнительного выставленных флагов .profraw файлы не появляются (либо удаляются).

Сделать режим многопоточной генерации драйверов

Запускаю futag на процессоре с 32 ядрами.

Хотелось бы иметь возможность распараллеливания процесса порождения драйверов. Иначе процесс генерации выполняется долго, но при этом задействуется только одно ядро - соответственно генерация растягивается надолго.

Это не критический функционал - futag в целом не предназначен для постоянных перезапусков на одной и той же кодовой базе, так что скорее это инструмент однократного применения, и его можно оставить и на ночь.

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

Улучшение проекта futag-tests

  1. Добавить ссылку на проект futag-tests в readme.md текущего проекта Futag, и краткий комментарий, что это за проект.
  2. Сделать в futag-tests скрипт, который запустит по очереди все скрипты сборки целей для подпроектов и выведет ошибку, если что-то где-то отработало некорректно. Такое регрессионное тестирование futag у конечных пользователей.

Ошибка в requirements

Collecting docutils==0.17.1
Using cached docutils-0.17.1-py2.py3-none-any.whl (575 kB)
Collecting flake8==5.0.4
Using cached flake8-5.0.4-py2.py3-none-any.whl (61 kB)
ERROR: Exception:
Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/pkg_resources/init.py", line 3103, in init
super(Requirement, self).init(requirement_string)
File "/usr/lib/python3/dist-packages/pkg_resources/_vendor/packaging/requirements.py", line 101, in init
raise InvalidRequirement("Invalid URL given")
pkg_resources.extern.packaging.requirements.InvalidRequirement: Invalid URL given

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "/usr/lib/python3/dist-packages/pip/_internal/cli/base_command.py", line 186, in _main
status = self.run(options, args)
File "/usr/lib/python3/dist-packages/pip/_internal/commands/install.py", line 357, in run
resolver.resolve(requirement_set)
File "/usr/lib/python3/dist-packages/pip/_internal/legacy_resolve.py", line 177, in resolve
discovered_reqs.extend(self._resolve_one(requirement_set, req))
File "/usr/lib/python3/dist-packages/pip/_internal/legacy_resolve.py", line 333, in _resolve_one
abstract_dist = self._get_abstract_dist_for(req_to_install)
File "/usr/lib/python3/dist-packages/pip/_internal/legacy_resolve.py", line 270, in _get_abstract_dist_for
skip_reason = self._check_skip_installed(req)
File "/usr/lib/python3/dist-packages/pip/_internal/legacy_resolve.py", line 228, in _check_skip_installed
req_to_install.check_if_exists(self.use_user_site)
File "/usr/lib/python3/dist-packages/pip/_internal/req/req_install.py", line 443, in check_if_exists
self.satisfied_by = pkg_resources.get_distribution(str(no_marker))
File "/usr/lib/python3/dist-packages/pkg_resources/init.py", line 480, in get_distribution
dist = Requirement.parse(dist)
File "/usr/lib/python3/dist-packages/pkg_resources/init.py", line 3150, in parse
req, = parse_requirements(s)
File "/usr/lib/python3/dist-packages/pkg_resources/init.py", line 3096, in parse_requirements
yield Requirement(line)
File "/usr/lib/python3/dist-packages/pkg_resources/init.py", line 3105, in init
raise RequirementParseError(str(e))
pkg_resources.RequirementParseError: Invalid URL given

root@fuzzing:/Futag/src/python# cat requirements.txt
alabaster==0.7.12
attrs==22.1.0
Babel==2.10.3
beautifulsoup4==4.10.0
build==0.8.0
certifi==2022.6.15.1
charset-normalizer==2.1.1
configparser==5.3.0
coverage==6.4.4
cxxfilt==0.3.0
cycler==0.11.0
docutils==0.17.1
flake8==5.0.4

futag @ file:///home/thientc/futag-tests/Futag/src/python/futag-package/dist/futag-1.1.tar.gz

Ошибка при старте фаззинга готовых целей

-- [Futag] FUZZING driver: PQconnectdb1... 

-- [Futag] FUZZING command:.../futag-fuzz-drivers/PQconnectdb/PQconnectdb1/PQconnectdb1.out -timeout=1000 -rss_limit_mb=30 -max_total_time=1000 -artifact_prefix=.../futag-fuzz-drivers/PQconnectdb/PQconnectdb1/

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

==990319==ERROR: AddressSanitizer failed to allocate 0x0 (0) bytes of SetAlternateSignalStack (error code: 22)
==990319==Process memory map follows:
	0x000000400000-0x000000421000	.../futag-fuzz-drivers/pg_b64_enc_len/pg_b64_enc_len1/pg_b64_enc_len1.out
	0x000000421000-0x000000548000	.../futag-fuzz-drivers/pg_b64_enc_len/pg_b64_enc_len1/pg_b64_enc_len1.out
	0x000000548000-0x000000584000	.../futag-fuzz-drivers/pg_b64_enc_len/pg_b64_enc_len1/pg_b64_enc_len1.out
	0x000000584000-0x000000586000	.../futag-fuzz-drivers/pg_b64_enc_len/pg_b64_enc_len1/pg_b64_enc_len1.out
	0x000000586000-0x000000590000	.../futag-fuzz-drivers/pg_b64_enc_len/pg_b64_enc_len1/pg_b64_enc_len1.out
	0x000000590000-0x000000e6c000	[heap]
	0x00007fff7000-0x00008fff7000	
	0x00008fff7000-0x02008fff7000	
	0x02008fff7000-0x10007fff8000	
	0x7ffff76e1000-0x7ffff7a48000	
	0x7ffff7a48000-0x7ffff7a70000	/usr/lib/x86_64-linux-gnu/libc.so.6
	0x7ffff7a70000-0x7ffff7c05000	/usr/lib/x86_64-linux-gnu/libc.so.6
	0x7ffff7c05000-0x7ffff7c5d000	/usr/lib/x86_64-linux-gnu/libc.so.6
	0x7ffff7c5d000-0x7ffff7c61000	/usr/lib/x86_64-linux-gnu/libc.so.6
	0x7ffff7c61000-0x7ffff7c63000	/usr/lib/x86_64-linux-gnu/libc.so.6
	0x7ffff7c63000-0x7ffff7c70000	
	0x7ffff7c70000-0x7ffff7c73000	/usr/lib/x86_64-linux-gnu/libgcc_s.so.1
	0x7ffff7c73000-0x7ffff7c8a000	/usr/lib/x86_64-linux-gnu/libgcc_s.so.1
	0x7ffff7c8a000-0x7ffff7c8e000	/usr/lib/x86_64-linux-gnu/libgcc_s.so.1
	0x7ffff7c8e000-0x7ffff7c8f000	/usr/lib/x86_64-linux-gnu/libgcc_s.so.1
	0x7ffff7c8f000-0x7ffff7c90000	/usr/lib/x86_64-linux-gnu/libgcc_s.so.1
	0x7ffff7c90000-0x7ffff7c9e000	/usr/lib/x86_64-linux-gnu/libm.so.6
	0x7ffff7c9e000-0x7ffff7d1a000	/usr/lib/x86_64-linux-gnu/libm.so.6
	0x7ffff7d1a000-0x7ffff7d75000	/usr/lib/x86_64-linux-gnu/libm.so.6
	0x7ffff7d75000-0x7ffff7d76000	/usr/lib/x86_64-linux-gnu/libm.so.6
	0x7ffff7d76000-0x7ffff7d77000	/usr/lib/x86_64-linux-gnu/libm.so.6
	0x7ffff7d77000-0x7ffff7e11000	/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
	0x7ffff7e11000-0x7ffff7f22000	/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
	0x7ffff7f22000-0x7ffff7f92000	/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
	0x7ffff7f92000-0x7ffff7f9d000	/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
	0x7ffff7f9d000-0x7ffff7fa0000	/usr/lib/x86_64-linux-gnu/libstdc++.so.6.0.30
	0x7ffff7fa0000-0x7ffff7fa3000	
	0x7ffff7fb1000-0x7ffff7fbd000	
	0x7ffff7fbd000-0x7ffff7fc1000	[vvar]
	0x7ffff7fc1000-0x7ffff7fc3000	[vdso]
	0x7ffff7fc3000-0x7ffff7fc5000	/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
	0x7ffff7fc5000-0x7ffff7fef000	/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
	0x7ffff7fef000-0x7ffff7ffa000	/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
	0x7ffff7ffa000-0x7ffff7ffb000	
	0x7ffff7ffb000-0x7ffff7ffd000	/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
	0x7ffff7ffd000-0x7ffff7fff000	/usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
	0x7ffffffde000-0x7ffffffff000	[stack]
	0xffffffffff600000-0xffffffffff601000	[vsyscall]
==990319==End of process memory map.
==990319==AddressSanitizer CHECK failed: .../Futag/custom-llvm/compiler-rt/lib/sanitizer_common/sanitizer_common.cpp:54 "((0 && "unable to mmap")) != (0)" (0x0, 0x0)
    <empty stack>

Ошибка при генерации обёртки в парадигме AFL

При компиляции обёртки в парадигме AFL возникает такая ошибка. В парадигме libFuzzer данная обёртка собирается без ошибок.

user@futag-vm:~/pugixml/futag-fuzz-drivers/failed/pugi::as_wide/pugi::as_wide1$ /home/user/futag-llvm/AFLplusplus/usr/local/bin/afl-clang-fast++ -fsanitize=address -g -O0 -fPIE  -I/home/user/pugixml/src/  /home/user/pugixml/futag-fuzz-drivers/failed/pugi::as_wide/pugi::as_wide1/pugi::as_wide1.cpp -o /home/user/pugixml/futag-fuzz-drivers/failed/pugi::as_wide/pugi::as_wide1/pugi::as_wide1.out -Wl,--start-group /home/user/pugixml/.futag-install/lib/libpugixml.a /home/user/pugixml/.futag-build/libpugixml.a -Wl,--end-group

afl-cc++4.02c by Michal Zalewski, Laszlo Szekeres, Marc Heuse - mode: LLVM-PCGUARD

/home/user/pugixml/futag-fuzz-drivers/failed/pugi::as_wide/pugi::as_wide1/pugi::as_wide1.cpp:13:1: error: C++ requires a type specifier for all declarations

main() {

^

/home/user/pugixml/futag-fuzz-drivers/failed/pugi::as_wide/pugi::as_wide1/pugi::as_wide1.cpp:23:21: error: use of undeclared identifier 'read'; did you mean '_IO_cookie_io_functions_t::read'?

    int Fuzz_Size = __AFL_FUZZ_TESTCASE_LEN;  // don't use the macro directly in a call!

                    ^

<command line>:12:88: note: expanded from here

#define __AFL_FUZZ_TESTCASE_LEN (__afl_fuzz_ptr ? *__afl_fuzz_len : (*__afl_fuzz_len = read(0, __afl_fuzz_alt_ptr, 1048576)) == 0xffffffff ? 0 : *__afl_fuzz_len)

                                                                                       ^

/usr/include/x86_64-linux-gnu/bits/types/cookie_io_functions_t.h:57:27: note: '_IO_cookie_io_functions_t::read' declared here

  cookie_read_function_t *read;         /* Read bytes.  */

                          ^

/home/user/pugixml/futag-fuzz-drivers/failed/pugi::as_wide/pugi::as_wide1/pugi::as_wide1.cpp:23:21: error: invalid use of non-static data member 'read'

    int Fuzz_Size = __AFL_FUZZ_TESTCASE_LEN;  // don't use the macro directly in a call!

                    ^~~~~~~~~~~~~~~~~~~~~~~

<command line>:12:88: note: expanded from here

#define __AFL_FUZZ_TESTCASE_LEN (__afl_fuzz_ptr ? *__afl_fuzz_len : (*__afl_fuzz_len = read(0, __afl_fuzz_alt_ptr, 1048576)) == 0xffffffff ? 0 : *__afl_fuzz_len)

                                                                                       ^~~~

/home/user/pugixml/futag-fuzz-drivers/failed/pugi::as_wide/pugi::as_wide1/pugi::as_wide1.cpp:75:41: warning: '/*' within block comment [-Wcomment]

  cookie_read_function_t *read;         /* Read bytes.  */

                                        ^

/home/user/pugixml/futag-fuzz-drivers/failed/pugi::as_wide/pugi::as_wide1/pugi::as_wide1.cpp:77:1: error: expected unqualified-id

/home/user/pugixml/.futag-fuzz-drivers/pugi::as_wide/pugi::as_wide1/pugi::as_wide1.cpp:23:21: error: invalid use of non-static data member 'read'

^

/home/user/pugixml/futag-fuzz-drivers/failed/pugi::as_wide/pugi::as_wide1/pugi::as_wide1.cpp:79:23: error: expected a class name after '~' to name a destructor

                    ^~~~~~~~~~~~~~~~~~~~~~~

                      ^

1 warning and 5 errors generated.

Ошибка сборки php

Пытаюсь собрать пакет php (контейнер на базе Ubuntu20).
Без Futag всё собирается нормально.
Команды:

git clone --depth=1 --single-branch --branch=PHP-7.2.34 https://github.com/php/php-src cd php-src ./buildconf ./configure make

Компилятор:

root@fuzzing:/Futag# cc --version
Ubuntu clang version 12.0.1-++20211029101322+fed41342a82f-1~exp1~20211029221816.4
Target: x86_64-pc-linux-gnu

Дополнительно установлены пакеты по рекомендациям php:

apt install -y pkg-config build-essential autoconf bison re2c libxml2-dev libsqlite3-dev

Скачиваю проект и пытаюсь собрать его Futag.

Если не запустить ./buildconf, то предупреждение следующее:

root@fuzzing:/Futag# python3 py1.py
-- [Futag]: Futag is finding for configure or cmake in you library root
-- [Futag]: Futag is unable to automatically build your library. Please do it yourself!
Total functions:  0
Total enums:  0
Total structs:  0
Total typedefs:  0
Analysis result:  /Futag/php-src/futag-analysis/futag-analysis-result.json

Если же запустить, то ошибка!

root@fuzzing:/Futag# python3 py1.py
-- [Futag]: Futag is finding for configure or cmake in you library root
-- [Futag]: File configure found, trying to build library with configure...
-- [Futag]: Library was configured successfully!
-- [Futag]: Build command:  /Futag/futag-llvm-package/bin/scan-build -enable-checker futag.FutagFunctionAnalyzer -analyzer-config futag.FutagFunctionAnalyzer:report_dir=/Futag/php-src/futag-analysis make -j16
libtool: compile: specify a tag with `--tag'
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:820: ext/opcache/zend_accelerator_blacklist.lo] Error 1
make: *** Waiting for unfinished jobs....
make: *** [Makefile:832: ext/opcache/zend_file_cache.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:826: ext/opcache/zend_accelerator_module.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:824: ext/opcache/zend_accelerator_hash.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:834: ext/opcache/zend_shared_alloc.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:818: ext/opcache/ZendAccelerator.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:840: ext/opcache/shared_alloc_mmap.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:822: ext/opcache/zend_accelerator_debug.lo] Error 1
libtool: compile: specify a tag with `--tag'
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:828: ext/opcache/zend_persist.lo] Error 1
make: *** [Makefile:848: ext/opcache/Optimizer/pass2.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:846: ext/opcache/Optimizer/pass1_5.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:836: ext/opcache/zend_accelerator_util_funcs.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:842: ext/opcache/shared_alloc_posix.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:830: ext/opcache/zend_persist_calc.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:838: ext/opcache/shared_alloc_shm.lo] Error 1
libtool: compile: specify a tag with `--tag'
make: *** [Makefile:844: ext/opcache/Optimizer/zend_optimizer.lo] Error 1

Traceback (most recent call last):
  File "py1.py", line 8, in <module>
    json0_13.auto_build()
  File "/usr/local/lib/python3.8/dist-packages/futag/preprocessor.py", line 120, in auto_build
    self.build_configure()
  File "/usr/local/lib/python3.8/dist-packages/futag/preprocessor.py", line 245, in build_configure
    raise ValueError(LIB_BUILD_FAILED)
ValueError: -- [Futag]: Build library failed, please build it your own!

Содержимое файла p1.py:

root@fuzzing:/Futag# cat py1.py
\# package futag must be already installed
from futag.preprocessor import *

json0_13 = Builder(
    "/Futag/futag-llvm-package/", # path to the futag-llvm-package
    "/Futag/php-src" # library root
)
json0_13.auto_build()
json0_13.analyze()

Запуск сборок проектов futag-tests в контейнерах

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

Предлагается проработать вопрос реализации запуска сборки и анализа каждого пакета в отдельном контейнере. Тогда в скрипте prepare.sh можно будет минимально настраивать окружение под каждый конкретный пакет.

Эта задача, даже если будет принята, в любом случае ФОНОВОГО приоритета, поскольку не связана с основной бизнес-логикой Futag.

Совместимость с afl-clang-fast

Хотелось бы попробовать получить бинари для afl-fuzz, но для цели afl-clang-fast потребовал -fPIE, а с этим флагом вся сборка цели падает. Как бы с этим справиться?

Ошибки санитайзера при сборке пакета

Предлагаю убрать из обязательных параметров компилятора санитайзеры.
В процессе тестирования пакета пакета luajit (https://github.com/tarantool/luajit), столкнулся с ошибками санитайзера на этапе сборки. Использовав метод народного тыка, было обнаружено что сборка без сайнитайзера проходит успешно, после чего был отредактирован файл preprocessor.py, в части "self.flags = "-fsanitize=address -g -O0" и далее процесс прошел без ошибок.

На сколько необходимо осуществлять сборку именно с санитайзерами?

New information to issues #42

По пути Futag/src/python/futag-package/dist/futag-1.2.2.tar.gz лежит не тот generation.py. При установке с помощью pip install Futag/src/python/futag-package/dist/futag-1.2.2.tar.gz возникает проблема:

Traceback (most recent call last):
  File "analyze.py", line 22, in <module>
    generator.compile_targets(
  File "/home/negoro/.local/lib/python3.8/site-packages/futag/generator.py", line 2703, in compile_targets
    compiler_flags_aflplusplus += " -fPIE"
UnboundLocalError: local variable 'compiler_flags_aflplusplus' referenced before assignment

Исправляется заменой инсталлированного generation.py на generation.py который лежит в исходниках (Futag/src/python/futag-package/src/futag)


При генерации обвязок под AFLPLUSPLUS все равно возникает ошибка (пробовал с PAM, так и с json-c)

-- [Futag] ERROR on target  json_object_array_add126 :
 gcc: error: : No such file or directory
gcc: error: : No such file or directory

В качестве workaroud попробовал сделать символическую ссылку на компилятор afl-clang-lto, установленный в систему, проблема аналогичная.
Система и скрипты сборки аналогичные issues #42.

С генерацией для libfuzzer все ок:

-- [Futag] collecting result ...
-- [Futag] Result of compiling: 1157 fuzz-driver(s)

Ошибка сборки

Добрый день!
Действую по п.4 (Сборка из исходного кода), при выполнении build.sh получаю ошибку

[ 22%] Linking CXX static library ../libLLVMSupport.a
[ 22%] Built target LLVMSupport
make: *** [Makefile:156: all] Ошибка 2

======== End of install script for FUTAG - a fuzzing target automated generator ========

Пролистывая чуть назад лог, нахожу красные ошибки:

In file included from /home/user/Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.cc:15:
/home/user/Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.h: In function ‘void AddRange(std::vector<T>*, T, T, int)’:
/home/user/Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.h:17:30: error: ‘numeric_limits’ is not a member of ‘std’
   17 |   static const T kmax = std::numeric_limits<T>::max();
      |                              ^~~~~~~~~~~~~~
/home/user/Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.h:17:46: error: expected primary-expression before ‘>’ token
   17 |   static const T kmax = std::numeric_limits<T>::max();
      |                                              ^
/home/user/Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.h:17:49: error: ‘::max’ has not been declared; did you mean ‘std::max’?
   17 |   static const T kmax = std::numeric_limits<T>::max();
      |                                                 ^~~
      |                                                 std::max

Система Ubuntu 22.04
По тем пакетам, что в требованиях:
cmake version 3.22.1
gcc (Ubuntu 11.2.0-19ubuntu1) 11.2.0
Python 3.10.4
pip 22.2.2
zlib 1.2.11
make 4.3

Ошибка при сборке цели с CMakeLists.txt

Скрипт для сборки успешно завершился, а при компиляции целей получается ошибка, что бы это могло быть?

-- [Futag] Try to generate fuzz-driver for function:  <имя_функции>
Traceback (most recent call last):
  File "/build//run_futag.py", line 13, in <module>
    g.compile_targets()
  File "/home/имя_пользователя/.local/lib/python3.10/site-packages/futag/generator.py", line 2752, in compile_targets
    current_include.append("-I" + i + "/")
TypeError: can only concatenate str (not "PosixPath") to str

Предложения по улучшению readme

На основе сообщения https://t.me/sdl_dynamic/3172

Начал тестировать futag, возникло несколько вопросов/предложений по документации и собственно по инструменту:

  1. Добавить в 2.1 явно установку python3-pip. Он потребуется для установки futag.

  2. Опечатки - цифры 1-2-3 в наименованиях библиотек в 2.1.

  3. В строке pip install /path/to/python/futag-package/dist/futag-0.1.tar.gz путь не сразу понятен - ../Futag/src/python/futag-package/dist/futag-0.1.tar.gz было бы читабельнее.

  4. В 3 в "Запуск сборки..." предлагается чуть подробнее расписать два параметра Builder (хотя бы в том объеме, в котором они собственно в compiler.py закомментированы). В частности, первый параметр должен указывать конкретно на каталог build, полученный на прошлом шаге.

  5. В 3, в "Генерация..." путь "/path/to/futag/package/" для единообразия предлагается заменить на упомянутый чуть выше "../../futag-llvm-package".

  6. Мелочь, но всё таки - от фразы "Успешно скомпилированные цели находятся в каталоге futag-fuzz-drivers. Каждый драйвер находится внутри своей поддиректории." ожидаешь, что в поддиректориях будут лежать именно что бинарники. А не исходные тексты, которые успешно скомпилировал futag, но все равно нужно компилировать самому. Предлагаю фразу уточнить. Кстати, опционально, почему бы рядом не прикладывать именно бинарники собранные? Например с address, undefined? И аналогично - coverage?

  7. После сборки json-c у меня получилось около 50ти драйверов. Большинство из них представлены как каталог с именем драйвера, в котором лежит один единственный файл исходных текстов драйвера с расширением .c. Однако:

7.1. В некоторых каталогах (процентов 15 от общего числа) дополнительно лежит большой файл .out (3-4 мегабайта), в котором похоже лежат пострипанные символы. Это зачем? Это баг (НДВ :)) или фича? Опишите, пожалуйста, в readme, если это фича.

7.2. Для ряда драйверов файлов-исходников получилось сильно больше чем 1 (в частности для json-c для драйвера json_object_to_fd их больше 10ти). Я понимаю, что это видимо завязано на перегрузки конструкторов, в т. ч. конструкторов объектов параметров. Но можно ли чуть подробнее раскрыть данный вопрос в документации (в частности глубина перебора вариантов конструкторов)? В том числе фраза "Каждый драйвер находится внутри своей поддиректории." получается частично неверной - в одной поддиректории может быть 1-N драйверов.

Добавить тестовый скрипты

В каталог Futag помещать сразу шаблоны двух простых скриптов анализа и генерации. Чтобы нужно было только подставить каталог к исходникам и можно было запускать.

Проблема сборки

100%] Building CXX object utils/benchmark/src/CMakeFiles/benchmark.dir/benchmark_register.cc.o
In file included from .../Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.cc:15:
.../Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.h: In function ‘void AddRange(std::vector<T>*, T, T, int)’:
.../Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.h:17:30: error: ‘numeric_limits’ is not a member of ‘std’
17 | static const T kmax = std::numeric_limits<T>::max();
| ^~~~~~~~~~~~~~
.../Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.h:17:46: error: expected primary-expression before ‘>’ token
17 | static const T kmax = std::numeric_limits<T>::max();
| ^
.../Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.h:17:49: error: ‘::max’ has not been declared; did you mean 'std::max'?
17 | static const T kmax = std::numeric_limits<T>::max();
| ^~~
| std::max
In file included from /usr/include/c++/11/algorithm:62,
from .../Futag/custom-llvm/llvm/utils/benchmark/include/benchmark/benchmark.h:175,
from .../Futag/custom-llvm/llvm/utils/benchmark/src/internal_macros.h:4,
from ...//Futag/custom-llvm/llvm/utils/benchmark/src/check.h:8,
from .../Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.h:6,
from .../Futag/custom-llvm/llvm/utils/benchmark/src/benchmark_register.cc:15:
/usr/include/c++/11/bits/stl_algo.h:3467:5: note: ‘std::max’ declared here
3467 | max(initializer_list<_Tp> __l, _Compare __comp)
| ^~~
make[2]: *** [utils/benchmark/src/CMakeFiles/benchmark.dir/build.make:90: utils/benchmark/src/CMakeFiles/benchmark.dir/benchmark_register.cc.o] Error 1
make[1]: *** [CMakeFiles/Makefile2:163662: utils/benchmark/src/CMakeFiles/benchmark.dir/all] Error 2
make: *** [Makefile:156: all] Error 2

Ошибка сборки. Ubuntu 22.04 x86_64

FUTAG, glibc и Debian

Из-за того, что в FUTAG используется готовый llvm, на системах Debian из-за более старой версии glibc clang не работает.

Возникла потребность научить FUTAG работать с системным clang'ом..

Хотелось бы получить инструкцию по работе FUTAG с системным llvm'ом, и возможной доработки FUTAGA'а в случае если это проблематично или невозможно...

В идеале хотелось бы получить поддержку LLVM_CONFIG или какого-то ее аналога. А сам FUTAG чтобы дальше у него всю информацию об LLVM получал. 

При выборе типа цели AFLPLUSPLUS получаю ошибки компиляции

/home/sedley/Work/Fuzzing/futag-llvm.2.0.2/futag-llvm/AFLplusplus/usr/local/bin/afl-clang-fast -fsanitize=address -g -O0 -fPIE  
-I/home/sedley/Work/Development/libpq-standalone/libpq/pg/src/interfaces/libpq/ -I/home/sedley/Work/Development/libpq-
standalone/libpq/pg/src/include/ -I/home/sedley/Work/Development/libpq-standalone/.futag-build/libpq/  /home/sedley
/Work/Development/libpq-standalone/.futag-fuzz-drivers/PQputnbytes/PQputnbytes2/PQputnbytes2.c -o /home/sedley
/Work/Development/libpq-standalone/.futag-fuzz-drivers/PQputnbytes/PQputnbytes2/PQputnbytes2.out -Wl,--start-group 
/home/sedley/Work/Development/libpq-standalone/.futag-build/libpq/libpq.a /home/sedley/Work/Development/libpq-standalone
/libpq/pg/pgsql/lib/libpgtypes.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/pgsql/lib/libecpg.a /home/sedley
/Work/Development/libpq-standalone/libpq/pg/pgsql/lib/libpgfeutils.a /home/sedley/Work/Development/libpq-standalone/libpq
/pg/pgsql/lib/libpgcommon_shlib.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/pgsql/lib/libpgport_shlib.a 
/home/sedley/Work/Development/libpq-standalone/libpq/pg/pgsql/lib/libpq.a /home/sedley/Work/Development/libpq-standalone
/libpq/pg/pgsql/lib/libpgport.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/pgsql/lib/libecpg_compat.a 
/home/sedley/Work/Development/libpq-standalone/libpq/pg/pgsql/lib/libpgcommon.a /home/sedley/Work/Development/libpq-
standalone/libpq/pg/install/lib/libpgtypes.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/install/lib/libecpg.a 
/home/sedley/Work/Development/libpq-standalone/libpq/pg/install/lib/libpgfeutils.a /home/sedley/Work/Development/libpq-
standalone/libpq/pg/install/lib/libpgcommon_shlib.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/install
/lib/libpgport_shlib.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/install/lib/libpq.a /home/sedley
/Work/Development/libpq-standalone/libpq/pg/install/lib/libpgport.a /home/sedley/Work/Development/libpq-standalone/libpq
/pg/install/lib/libecpg_compat.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/install/lib/libpgcommon.a 
/home/sedley/Work/Development/libpq-standalone/libpq/pg/src/interfaces/ecpg/compatlib/libecpg_compat.a /home/sedley
/Work/Development/libpq-standalone/libpq/pg/src/interfaces/ecpg/pgtypeslib/libpgtypes.a /home/sedley/Work/Development/libpq-
standalone/libpq/pg/src/interfaces/ecpg/ecpglib/libecpg.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/src
/interfaces/libpq/libpq.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/src/fe_utils/libpgfeutils.a /home/sedley
/Work/Development/libpq-standalone/libpq/pg/src/port/libpgport_shlib.a /home/sedley/Work/Development/libpq-standalone/libpq
/pg/src/port/libpgport.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/src/port/libpgport_srv.a /home/sedley
/Work/Development/libpq-standalone/libpq/pg/src/common/libpgcommon_shlib.a /home/sedley/Work/Development/libpq-
standalone/libpq/pg/src/common/libpgcommon_srv.a /home/sedley/Work/Development/libpq-standalone/libpq/pg/src/common
/libpgcommon.a -Wl,--end-group 

-- [Futag] ERROR on target  PQputnbytes2 

-- [Futag] collecting result ...
-- [Futag] Result of compiling: 0 fuzz-driver(s)

При генерации целей их получается 590, при компиляции в виде libFuzzer их выходит >600, а для AFL++ - 0.

Предположительно ошибочная работа futag с С++-библиотекой pugixml

На основе сообщения https://t.me/sdl_dynamic/3172

Futag корректно не отрабатывает на "модельной" С++-библиотеке pugixml (https://github.com/zeux/pugixml), модельная она поскольку порождает ровно один бинарник после сборки, использовалась нами в курсах по фаззингу и ряде документации.

Порядок сборки pugixml - как и у json-c из примера:

  • подготовил futag;
  • загитклонил pugixm;
  • попробовал сделать make - все собирается корректно - сделал make clean (также пробовал сразу после гитклона);
  • указал вместо json0_13 = Builder("/futag/futag-llvm-package", "/futag/json-c") строку json0_13 = Builder("/futag/futag-llvm-package", "/futag/pugixml"), запустил futag-скрипт сборки и анализа (пути к проектам точно корректные).

Futag говорит, что ноль объектов определено. При этом аналогичные действия для json-c приводят к успешному порождению. В препринте статьи C++ упоминается в качестве поддерживаемого ЯП - вроде тут проблем быть не должно. Протестируйте, пожалуйста.

Генерация обёрток для функций содержащих char*&

В пилотном примере pugixml часто встречается тип данных char*&.
const char*& передает в функцию ссылку на указатель,а const char*, сейчас Futag не умеет генерировать обёртки для подобных функций, предлагаю добавить функционал позволяющий инициализировать этот тип.

Сделать возможность сборки целей для функций из анонимных пространств имен

  1. Данный параметр назвать например "AnonymousBuild", по умолчанию он имеет значение "false"
  2. Параметр со значением по умолчанию обязательно включить в README. Также сделать комментарий "Использовать, только если уверены, что вам это нужно"
  3. В каждой успешно сгенерированной цели, между кодом цели и командой сборки помещать комментарий вида:

"Данная цель сформирована для анонимной функции, в нормальном режиме работы не доступной для прямого вызова пользователем. Подача мутированных данных в данную функцию без дополнительной валидации и коррекции данных в обертке скорее всего приведёт к False Positive падениям цели".

Флаги libFuzzer

Если возникла потребность запустить цель с такими флагами:

./target.out Corpus/ -detect_leaks=1 -print_final_stats=1 -use_counters=1 -reload=1 -print_coverage=1

Можно ли их как-то отправить внутрь Fuzzer() как строку флагов или можно использовать только опции, указаннные в параметрах?

gcc: error: unrecognized command line option ‘-ferror-limit=1’

Ошибка

При генерации фаззинг-оберток для AFL++ автоматически подставляется флаг -ferror-limit=1, компилятор afl-clang-fast его не поддерживает и из-за этого фаззинг-обертки не генерируются.

Команда для генерации:

/home/negoro/Fuzzing/Futag/futag-llvm/AFLplusplus/usr/local/bin/afl-clang-fast -fsanitize=address -g -O0 -ferror-limit=1 -I/home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/libpam/ -I/home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/libpam/ -I/home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/libpam/../ -I/home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/libpam/include/ /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-fuzz-drivers/_pam_strdup/_pam_strdup1/_pam_strdup1.c -o /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-fuzz-drivers/_pam_strdup/_pam_strdup1/_pam_strdup1.out -Wl,--start-group /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/libpam_misc.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/libpam.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/libpamc.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_warn.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_namespace.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_deny.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_listfile.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_limits.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_echo.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_group.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_exec.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_access.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_permit.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_xauth.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_setquota.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_time.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_umask.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_mkhomedir.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_localuser.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_faildelay.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_keyinit.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_stress.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_filter.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_sepermit.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_motd.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_faillock.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_env.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_unix.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_succeed_if.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_mail.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_securetty.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_usertype.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_shells.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_rhosts.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_timestamp.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_ftp.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_rootok.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_nologin.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_lastlog.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_debug.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_issue.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_selinux.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_pwhistory.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_wheel.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-install/lib/security/pam_loginuid.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/libpam_misc/.libs/libpam_misc.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/libpamc/.libs/libpamc.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/libpam/.libs/libpam.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_ftp/.libs/pam_ftp.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_sepermit/.libs/pam_sepermit.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_loginuid/.libs/pam_loginuid.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_listfile/.libs/pam_listfile.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_pwhistory/.libs/pam_pwhistory.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_exec/.libs/pam_exec.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_securetty/.libs/pam_securetty.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_issue/.libs/pam_issue.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_succeed_if/.libs/pam_succeed_if.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_usertype/.libs/pam_usertype.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_localuser/.libs/pam_localuser.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_keyinit/.libs/pam_keyinit.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_nologin/.libs/pam_nologin.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_lastlog/.libs/pam_lastlog.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_limits/.libs/pam_limits.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_warn/.libs/pam_warn.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_env/.libs/pam_env.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_faildelay/.libs/pam_faildelay.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_filter/.libs/pam_filter.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_permit/.libs/pam_permit.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_setquota/.libs/pam_setquota.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_namespace/.libs/pam_namespace.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_time/.libs/pam_time.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_selinux/.libs/pam_selinux.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_debug/.libs/pam_debug.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_rhosts/.libs/pam_rhosts.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_rootok/.libs/pam_rootok.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_mail/.libs/pam_mail.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_mkhomedir/.libs/pam_mkhomedir.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_timestamp/.libs/pam_timestamp.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_xauth/.libs/pam_xauth.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_group/.libs/pam_group.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_shells/.libs/pam_shells.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_deny/.libs/pam_deny.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_faillock/.libs/pam_faillock.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_echo/.libs/pam_echo.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_unix/.libs/pam_unix.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_umask/.libs/pam_umask.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_stress/.libs/pam_stress.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_wheel/.libs/pam_wheel.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_access/.libs/pam_access.a /home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-build/modules/pam_motd/.libs/pam_motd.a -Wl,--end-group

Лог ошибки

-- [Futag] ERROR on target  _pam_strdup1 :
 gcc: error: : No such file or directory
gcc: error: : No such file or directory
gcc: error: unrecognized command line option ‘-ferror-limit=1’

Сопутствующая информация

OS:

Distributor ID: Ubuntu
Description: Ubuntu 20.04.5 LTS
Release: 20.04
Codename: focal
uname -a: Linux negoro 5.4.0-132-generic #148-Ubuntu SMP Mon Oct 17 16:02:06 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux.

Project:

linux-pam-1.5.2.

Build script:

from futag.preprocessor import *

FUTAG_PATH = "/home/negoro/Fuzzing/Futag/futag-llvm/"
lib_path = "/home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2"

build_test = Builder(
    FUTAG_PATH,
    lib_path,
    clean=True,
    processes=1,
    build_ex_params="--disable-doc --disable-shared", 
    flags="-fPIE -fsanitize=address -g -O0 -fprofile-instr-generate -fcoverage-mapping" #flags for compiling
)
build_test.auto_build()
build_test.analyze()

Generation script:

from futag.generator import *

FUTAG_PATH = "/home/negoro/Fuzzing/Futag/futag-llvm/"
lib_path = "/home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2"
lib_json_file="/home/negoro/Garbage/comp_fuzzing/linux-pam-1.5.2/.futag-analysis/futag-analysis-result.json"
flags_afl="-fsanitize=address -g -O0"
flags_libfuzz="-fsanitize=address,fuzzer -g -O0"

generator = Generator(
    FUTAG_PATH, # путь к директории "futag-llvm"
    lib_path, #path to source
    target_type=AFLPLUSPLUS, #select fuzzers
    json_file=lib_json_file #path to json file
)

generator.gen_targets(
  anonymous=False
)
# Compile fuzz drivers
generator.compile_targets(
  4, # количество задач при сборке
  flags=flags_afl
)

Version LLVM:

clang version 14.0.6 (https://github.com/ispras/Futag 4373a71)
Собирали все из репозитория самостоятельно 13.12.2022.
git clone репозитория выполнялся 12.12.2022.
Сборка из исходников произошла успешно.

Version python package:

futag 1.2.1

Также вопрос, будет ли добавлен afl-clang-lto?

Разделение успешно собранных целей, и целей, которые не удалось собрать

  1. Сделать параметр генератора, например "SaveOnlySuccessful"
  2. По умолчанию он должен иметь значение False
  3. То, что удалось собрать, помещать в "success". То что не удалось - в "error" (если SaveOnlySuccessful == false)
  4. Для целей, которые не удалось собрать, помещать рядом лог ошибки сборки, чтобы аналитик мог сразу посмотреть в чем причина ошибки сборки
  5. Добавить этот параметр "SaveOnlySuccessful" сразу в примерный типовой скрипт, который приведён в README

Генерация обёрток для анонимных функций

Исходя из подтверждения работоспособности такой конструкции (на скринах), предлагаю сделать ещё один подход к генерации анонимных функций.
3
4

Алгоритм такой:

  1. Генерируем обертки для анонимной функции (уже реализовано);
  2. Смотрим в каком файле эта функция находится;
  3. Копируем файл обертки;
  4. Изменяем заголовочные файлы;
  5. Добавляем сгенерированную обертку [1] в конце файла [2]

Создать параметр выходного каталога

  1. Сделать параметр, который говорит, куда сохранять обертки и результаты сборки целей генератором.
  2. Данный параметр сразу по умолчанию вставить в (README)[https://github.com/#3-%D0%B8%D1%81%D0%BF%D0%BE%D0%BB%D1%8C%D0%B7%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8e. Значение по умолчанию - текущий каталог.
  3. Мне как пользователю в первую и основную очередь интересен именно каталог результатов билда ( а в него помещать в соответствии с #33 ). Каталоги futag-analysis и прочие служебные мне, как конечному пользователю, не интересны.

Автоматическое создание целей в AFL-парадигме

Многие пользователи выстроили фаззинг-процессы в парадигме AFL++ - оформление фаззинг-целей в ней отличается от парадигмы libfuzzer.

Хотелось бы, чтобы Futag умел порождать фаззинг-цели в одном из двух режимов, по выбору пользователя.

Простейший вариант обертки цели под AFL-парадигму приведён в частности в руководстве Андрея Федотова (https://github.com/ispras/oss-sydr-fuzz/wiki/Fuzzzing-FreeImage-project-with-Sydr-and-AFLplusplus).

В качестве эталонной версии компилятора для проверки сборки предлагается рассматривать текущий компилятор afl-clang-lto (afl-clang-lto++) версии 4.01.

undefined reference при сборке цели

Futag'ом была сгенерированна фаззинг-цель:

#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

int LLVMFuzzerTestOneInput(uint8_t * Fuzz_Data, size_t Fuzz_Size)
{
    if (Fuzz_Size < sizeof(int)) return 0;
    uint8_t * pos = Fuzz_Data;
    //GEN_VAR_FUNCTION
    lua_State * L = luaL_newstate();
    //GEN_BUILTIN
    int firstline;
    memcpy(&firstline, pos, sizeof(int));
    pos += sizeof(int);
    //FUNCTION_CALL
    pushline(L ,firstline );
    //FREE
    return 0;
}

В процессе штатной работы Futag цель не собирается. При попытке сбора цели, с помощью команды приведённой в файле, компилятор выдаёт ошибку:

/home/user/luajit/futag-fuzz-drivers/pushline/pushline1/pushline1.c:12:5: error: use of undeclared identifier 'lua_State'
    lua_State * L = luaL_newstate();
    ^
/home/user/luajit/futag-fuzz-drivers/pushline/pushline1/pushline1.c:12:17: error: use of undeclared identifier 'L'
    lua_State * L = luaL_newstate();
                ^
/home/user/luajit/futag-fuzz-drivers/pushline/pushline1/pushline1.c:12:21: warning: implicit declaration of function 'luaL_newstate' is invalid in C99 [-Wimplicit-function-declaration]
    lua_State * L = luaL_newstate();
                    ^
/home/user/luajit/futag-fuzz-drivers/pushline/pushline1/pushline1.c:18:5: warning: implicit declaration of function 'pushline' is invalid in C99 [-Wimplicit-function-declaration]
    pushline(L ,firstline );
    ^
/home/user/luajit/futag-fuzz-drivers/pushline/pushline1/pushline1.c:18:14: error: use of undeclared identifier 'L'
    pushline(L ,firstline );

Поиск в коде исследуемого ПО показал, что "lua_State" объявляется в нескольких заголовочных файлах: lj_obj.h, lua.h, lj_memprof.h. Если вручную добавить заголовочный файл к сгененированной цели, то эта ошибка исчезнет. Однако появится другая:

/usr/bin/ld: /tmp/pushline1-efaeca.o: in function `LLVMFuzzerTestOneInput':
/home/user/luajit/futag-fuzz-drivers/pushline/pushline1/pushline1.c:18: undefined reference to `pushline'
/usr/bin/ld: /home/user/luajit/futag-fuzz-drivers/pushline/pushline1/pushline1.c:18: undefined reference to `pushline'
clang-11: error: linker command failed with exit code 1 (use -v to see invocation)

Функция pushline, та самая для которой эта цель и генеририровалась объявляется и используется в файле "luajit.c".

Таким образом получается что Futag некорректно сформировал цель и не может задействовать её про фаззинге.

Ошибка сборки nDPI

Добрый день!
Пытаюсь экспериментировать с библиотекой nDPI:

-- [Futag]: Futag is finding for configure or cmake in you library root
-- [Futag]: File configure found, trying to build library with configure...
-- [Futag]: Starting analyzing:
-- [Futag]: Configure command:  /home/user/Futag/futag-llvm-package/bin/scan-build -disable-checker core -disable-checker security -disable-checker unix -disable-checker deadcode -disable-checker nullability -disable-checker cplusplus /home/user/nDPI/configure --prefix=/home/user/nDPI/futag-install
-- [Futag]: Analyzing command:  /home/user/Futag/futag-llvm-package/bin/scan-build -disable-checker core -disable-checker security -disable-checker unix -disable-checker deadcode -disable-checker nullability -disable-checker cplusplus -enable-checker futag.FutagFunctionAnalyzer -analyzer-config futag.FutagFunctionAnalyzer:report_dir=/home/user/nDPI/futag-analysis make -j16
-- [Futag]: Analyzing succeeded
-- [Futag]: Configure command:  /home/user/nDPI/configure --prefix=/home/user/nDPI/futag-install
configure: error: in `/home/user/nDPI/futag-build':
configure: error: cannot run C compiled programs.
If you meant to cross compile, use `--host'.
See `config.log' for more details

Traceback (most recent call last):
  File "/home/user/Futag_test/ftest.py", line 7, in <module>
    json0_13.auto_build()
  File "/home/user/.local/lib/python3.10/site-packages/futag/preprocessor.py", line 117, in auto_build
    self.build_configure()
  File "/home/user/.local/lib/python3.10/site-packages/futag/preprocessor.py", line 356, in build_configure
    raise ValueError(LIB_CONFIGURE_FAILED)
ValueError: --Configure library failed, please build it your own!

Фрагмент из лога в каталоге futag-build:

configure:4508: $? = 0
configure:4497: /home/user/Futag/futag-llvm-package/bin/clang -V >&5
clang-11: error: argument to '-V' is missing (expected 1 value)
clang-11: error: no input files
configure:4508: $? = 1
configure:4497: /home/user/Futag/futag-llvm-package/bin/clang -qversion >&5
clang-11: error: unknown argument '-qversion'; did you mean '--version'?
clang-11: error: no input files
configure:4508: $? = 1
configure:4497: /home/user/Futag/futag-llvm-package/bin/clang -version >&5
clang-11: error: unknown argument '-version'; did you mean '--version'?
clang-11: error: no input files
configure:4508: $? = 1
configure:4528: checking whether the C compiler works
configure:4550: /home/user/Futag/futag-llvm-package/bin/clang -fsanitize=address -g -O0 -fprofile-instr-generate -fcoverage-mapping -fsanitize=address -g -O0 -fprofile-instr-generate -fcoverage-mapping -fsanitize=address -g -O0 -fprofile
-instr-generate -fcoverage-mapping conftest.c  >&5
configure:4554: $? = 0
configure:4604: result: yes
configure:4607: checking for C compiler default output file name
configure:4609: result: a.out
configure:4615: checking for suffix of executables
configure:4622: /home/user/Futag/futag-llvm-package/bin/clang -o conftest -fsanitize=address -g -O0 -fprofile-instr-generate -fcoverage-mapping -fsanitize=address -g -O0 -fprofile-instr-generate -fcoverage-mapping -fsanitize=address -g -
O0 -fprofile-instr-generate -fcoverage-mapping conftest.c  >&5
configure:4626: $? = 0
configure:4649: result:
configure:4671: checking whether we are cross compiling
configure:4679: /home/user/Futag/futag-llvm-package/bin/clang -o conftest -fsanitize=address -g -O0 -fprofile-instr-generate -fcoverage-mapping -fsanitize=address -g -O0 -fprofile-instr-generate -fcoverage-mapping -fsanitize=address -g -
O0 -fprofile-instr-generate -fcoverage-mapping conftest.c  >&5
configure:4683: $? = 0
configure:4690: ./conftest
==3092119==ERROR: AddressSanitizer failed to allocate 0x0 (0) bytes of SetAlternateSignalStack (error code: 22)
==3092119==Process memory map follows:
        0x000000400000-0x00000041f000   /home/user/nDPI/futag-build/conftest
        0x00000041f000-0x000000500000   /home/user/nDPI/futag-build/conftest
        0x000000500000-0x000000532000   /home/user/nDPI/futag-build/conftest
        0x000000533000-0x000000534000   /home/user/nDPI/futag-build/conftest
        0x000000534000-0x00000053d000   /home/user/nDPI/futag-build/conftest
        0x00000053d000-0x000000de5000
        0x00007fff7000-0x00008fff7000
        0x00008fff7000-0x02008fff7000
        0x02008fff7000-0x10007fff8000
        0x7ff4b1c9a000-0x7ff4b1fff000
        0x7ff4b1fff000-0x7ff4b2027000   /usr/lib/x86_64-linux-gnu/libc.so.6
        0x7ff4b2027000-0x7ff4b21bc000   /usr/lib/x86_64-linux-gnu/libc.so.6
        0x7ff4b21bc000-0x7ff4b2214000   /usr/lib/x86_64-linux-gnu/libc.so.6
        0x7ff4b2214000-0x7ff4b2218000   /usr/lib/x86_64-linux-gnu/libc.so.6
        0x7ff4b2218000-0x7ff4b221a000   /usr/lib/x86_64-linux-gnu/libc.so.6
 

Ошибка в preprocessor.py

Компилятор Python 3.11.2
Ошибка возникает при попытке сгенерировать фаззинг-обертку
image

в Futag/src/python/futag-package/src/futag/preprocessor.py строка 80:
sys.exit(INVALID_FUTAG_PATH, futag_llvm_package)

Согласно документации https://docs.python.org/3.11/library/sys.html туда можно передать только 1 аргумент, а не 2.

Предлагаемые варианты решения: описаны здесь https://stackoverflow.com/questions/44515386/typeerror-exit-expected-at-most-1-arguments-got-3

Уменьшение объема Futag-дистрибутива

Развертывание Futag по readme-инструкции в настоящий момент требует скачивания около 2х ГБ исходников (в основном LLVM). Даже в достаточно быстрой сети это процесс не моментальный, особенно если CI будет выстроен в парадигме сборки каждого окружения "с нуля" (такие примеры нам известны). Можно ли как-то уменьшить объём скачиваемого дистрибутива?

Также, как вариант, дополнительно подготовить и выложить публично пресобранный контейнер, который явно должен быть меньше по размеру?

Отсутствует объявление переменной dyn_size

В процессе работы Futag сгенерировалась такая цель:

#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

int LLVMFuzzerTestOneInput(uint8_t * Fuzz_Data, size_t Fuzz_Size)
{
    if (Fuzz_Size < sizeof(int)) return 0;
    uint8_t * pos = Fuzz_Data;
    //GEN_VAR_FUNCTION
    lua_State * L = luaL_newstate();
    //GEN_BUILTIN
    int narg;
    memcpy(&narg, pos, sizeof(int));
    pos += sizeof(int);
    //GEN_SIZE
    int clear = (int) dyn_size;
    //FUNCTION_CALL
    docall(L ,narg ,clear );
    //FREE
    return 0;
}

Переменная dyn_size, используемая в "int clear = (int) dyn_size;", не объявлена.

/home/user/luajit/futag-fuzz-drivers/docall/docall1/docall1.c:18:23: error: use of undeclared identifier 'dyn_size'
    int clear = (int) dyn_size;

Вопросы по запуску Futag

  1. Провел подготовку:
    myprog.auto_build()
    myprog.analyze()

  2. Сгенерил таргеты:
    g.gen_targets()

-- [Futag] Fuzz-driver has been compiled successfully
-- [Futag] Result of compiling: 42 of 703 fuzz-driver(s)

Что означает 42, что собрались 42 из 703 ?
В каталоге futag-fuzz-drivers 695 подкаталогов и 1 файл.
В части каталогов есть файлы с расширением .out, из запуск приводит к одному из результатов:

  • выводу сообщения об утечки памяти и прерыванию работы
  • выводу сообщения о падении процесса
  • нормальной работе libfuzzer и выводу статистики его работы на экран
  1. Фаззинг
    f.fuzz()
    В обычном случае приводит к сообщению:
    ============ FINISH ============

Если пробовать издеваться над содержимым каталога futag-fuzz-drivers, оставив в нем несколько подкаталогов с содержимым в котором есть файл с расширением .out , то какое то время выдается, что осуществляется фаззинг и сохраняются его результаты в формате svres

Применимо ли использование вашего проекта не для библиотеки, а для приложения ? На сколько я понимаю обертка создается для конкретной функции и Futag собирает все зависимости для неё. Т.е. нет особых противоречий и всё должно работать. Я прав ?

Возможно ошибка размещения llvm после последнего коммита

Не получается запустить тестовый срипт сборки и анализа.

  1. Скрипт выглядит так:
from futag.preprocessor import *

json0_13 = Builder(
    "/Futag/futag-llvm-package/", # path to the futag-llvm-package
    "/Futag/json-c" # library root
)
json0_13.auto_build()
json0_13.analyze()
  1. Вот так выглядит структура каталогов после сборки llvm и установки futag посредством pip:
root@2bf92881f9c9:/Futag# pwd
/Futag
root@2bf92881f9c9:/Futag# tree -L 2 -d
.
|-- build
|   |-- CMakeFiles
|   |-- benchmarks
|   |-- bin
|   |-- cmake
|   |-- docs
|   |-- examples
|   |-- include
|   |-- lib
|   |-- libexec
|   |-- projects
|   |-- runtimes
|   |-- share
|   |-- test
|   |-- tools
|   |-- unittests
|   `-- utils
|-- custom-llvm
|   |-- clang
|   |-- compiler-rt
|   `-- llvm
|-- futag-llvm-package
|   |-- python
|   `-- svres-tmpl
|-- json-c
|   |-- apps
|   |-- bench
|   |-- cmake
|   |-- doc
|   |-- fuzz
|   `-- tests
|-- src
|   |-- Checkers
|   |-- clang
|   |-- python
|   `-- svres-tmpl
`-- vendors
    |-- deb-rdepend-downloader
    `-- json-3.10.5

39 directories
root@2bf92881f9c9:/Futag# ll
total 108
drwxr-xr-x  9 root root  4096 Jul 28 11:04 ./
drwxr-xr-x  1 root root  4096 Jul 28 10:45 ../
-rw-r--r--  1 root root 12288 Jul 28 11:04 .build.py.swp
drwxr-xr-x  8 root root  4096 Jul 28 10:45 .git/
-rw-r--r--  1 root root   203 Jul 28 10:45 .gitignore
-rw-r--r--  1 root root   417 Jul 28 10:45 CHANGELOG.md
-rw-r--r--  1 root root 35149 Jul 28 10:45 LICENSE
-rw-r--r--  1 root root  3718 Jul 28 10:45 README.en.md
-rw-r--r--  1 root root  6236 Jul 28 10:45 README.md
drwxr-xr-x 18 root root  4096 Jul 28 10:47 build/
-rw-r--r--  1 root root   199 Jul 28 11:04 build.py
drwxr-xr-x  5 root root  4096 Jul 28 10:46 custom-llvm/
drwxr-xr-x  4 root root  4096 Jul 28 10:51 futag-llvm-package/
drwxr-xr-x 10 root root  4096 Jul 28 10:52 json-c/
drwxr-xr-x  6 root root  4096 Jul 28 10:45 src/
drwxr-xr-x  4 root root  4096 Jul 28 10:45 vendors/
  1. При попытке запуска тестового скрипта (я назвал его build.py) выводится вот такая ошибка:
root@2bf92881f9c9:/Futag# python3 build.py
Traceback (most recent call last):
  File "build.py", line 3, in <module>
    json0_13 = Builder(
  File "/usr/local/lib/python3.8/dist-packages/futag/preprocessor.py", line 81, in __init__
    raise ValueError(INVALID_FUTAG_PATH, futag_llvm_package)
ValueError: ('-- [Futag]: Incorrect path to FUTAG llvm package', '/Futag/futag-llvm-package/')
  1. Пробовал "поиграть" путями - не смог подобрать пути, чтобы скрипт запустился.

Проблема установки модуля Futag с помощью pip

При попытке установки модуля Futag на системе Debian столкнулся с подобной ошибкой.

ian@mn4-fuzz-dev:~ pip install ./futag-llvm/python-package/futag-1.3.tar.gz 
ERROR: Exception:
Traceback (most recent call last):
  File "/usr/lib/python3/dist-packages/pip/_internal/cli/base_command.py", line 223, in _main
    status = self.run(options, args)
  File "/usr/lib/python3/dist-packages/pip/_internal/cli/req_command.py", line 180, in wrapper
    return func(self, options, args)
  File "/usr/lib/python3/dist-packages/pip/_internal/commands/install.py", line 317, in run
    reqs = self.get_requirements(args, options, finder, session)
  File "/usr/lib/python3/dist-packages/pip/_internal/cli/req_command.py", line 368, in get_requirements
    for parsed_req in parse_requirements(
  File "/usr/lib/python3/dist-packages/pip/_internal/req/req_file.py", line 151, in parse_requirements
    for parsed_line in parser.parse(filename, constraint):
  File "/usr/lib/python3/dist-packages/pip/_internal/req/req_file.py", line 341, in parse
    for line in self._parse_and_recurse(filename, constraint):
  File "/usr/lib/python3/dist-packages/pip/_internal/req/req_file.py", line 346, in _parse_and_recurse
    for line in self._parse_file(filename, constraint):
  File "/usr/lib/python3/dist-packages/pip/_internal/req/req_file.py", line 379, in _parse_file
    _, content = get_file_content(filename, self._session)
  File "/usr/lib/python3/dist-packages/pip/_internal/req/req_file.py", line 569, in get_file_content
    content = auto_decode(f.read())
  File "/usr/lib/python3/dist-packages/pip/_internal/utils/encoding.py", line 39, in auto_decode
    return data.decode(
UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte

Генерация фаззинг-оберток в различных форматах

В настоящий момент отсутствует единый формат фаззинг-обертки (собственно и едины стандарт фаззера также отсутствует). Нужно добавить в Futag возможность порождать фаззинг-обертки под различные системы фаззинга.

Технические требования

  1. Выбор вида генерации обертки должен осуществляться параметром в классе Generator. Параметр - одно из значений Enum. В настоящий момент следует предусмотреть четыре вида оберток:

1.а. Стандартная обертка libfuzzer / Sydr. Данная обертка является значением по умолчанию.

1.b. Стандартная обертка AFL++ / Crusher.

Входной буффер передаётся в main() через stdin и далее, после преобразования, в тестируемую функцию.

1.c. Стандартная обертка AFL++ / Crusher Persistence Mode. Пример здесь:

Входной буффер передаётся в main() через stdin и далее, после преобразования, в тестируемую функцию, которая обернута в макрос AFL_LOOP.
https://github.com/AFLplusplus/AFLplusplus/blob/stable/instrumentation/README.persistent_mode.md#4-persistent-mode

1.d. Стандартная обертка AFL++ Persistence Mode with Shared Buffer. Пример здесь: https://github.com/AFLplusplus/AFLplusplus/blob/stable/instrumentation/README.persistent_mode.md#2-tldr с учётом https://github.com/AFLplusplus/AFLplusplus/blob/stable/instrumentation/README.persistent_mode.md#5-shared-memory-fuzzing

  1. В качестве основной версии AFL++ рассматриваем текущую (ver. 4.02с). В качестве основного компилятора для AFL-режима - afl-clang-fast (желательно afl-clang-lto).

Сборка из исходников llvm-12(13,14)

При выборе сборки из исходников для llvm-12 (13, 14), т.е. любой версии, получаю ошибку вида:

CMake Error at /path/Futag/custom-llvm/llvm-project/llvm/cmake/modules/LLVMProcessSources.cmake:114 (message):
  Found unknown source file FutagCatchInfo.cpp

  Please update
 /path/Futag/custom-llvm/llvm-project/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt


Call Stack (most recent call first):
   /path/Futag/custom-llvm/llvm-project/llvm/cmake/modules/LLVMProcessSources.cmake:63 (llvm_check_source_file_list)
   /path/Futag/custom-llvm/llvm-project/llvm/cmake/modules/AddLLVM.cmake:426 (llvm_process_sources)
   /path/Futag/custom-llvm/llvm-project/clang/cmake/modules/AddClang.cmake:103 (llvm_add_library)
   /path/Futag/custom-llvm/llvm-project/clang/lib/StaticAnalyzer/Checkers/CMakeLists.txt:6 (add_clang_library)


-- Configuring incomplete, errors occurred!

Ошибка при установке Futag

Возникает ошибка при установке зависимостей Futag в ОС Ubuntu 20.04 :
pip install -r futag-llvm-package/python-package/requirements.txt
изображение

redefinition of 'var_name' with a different type

В сгенерированной Futag`ом цели, 2 раза происходит инициализация переменной с одинаковым именем но разного типа.
Библиотека: json-c-0.16-20220414.
Цель: json_object_object_add_ex10.zip

[json_object_object_add_ex10.zip](https://github.com/ispras/Futag/files/9607305/json_object_object_add_ex10.zip)


 /home/user/Futag-tests/json-c/json-c/futag-fuzz-drivers/json_object_object_add_ex/json_object_object_add_ex10/json_object_object_add_ex10.c:26:31: error: redefinition of 'var_name' with a different type: 'struct json_object *const' vs 'const char *const'
    struct json_object *const var_name = uval;

#include <stdio.h>
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>

int LLVMFuzzerTestOneInput(uint8_t * Fuzz_Data, size_t Fuzz_Size)
{
    if (Fuzz_Size < sizeof(int32_t)+sizeof(const char *const)+sizeof(struct json_object *const)+sizeof(unsigned)) return 0;
    uint8_t * pos = Fuzz_Data;
    //GEN_BUILTIN
    int32_t f_i;
    ...
    const char *const var_name = ukey;
    ...
    struct json_object *const var_name = uval;
    ...
    free(uopts);
    return 0;
}

При построении покрытия по цели FUTAG genhtml идёт по несуществующему пути.

Возможно это не связано напрямую с FUTAG, но genhtml после осуществления необходимых шагов пытается найти директорию .futag-fuzz-drivers. Я бы хотел уточнить, она генерируется при работе инструмента и удаляется? Просто grep находит во многих файлах её именно с точкой в сгенерированных исходниках *.c:
Это ошибка, выдаваемая genhtml (она в конце блока появляется)

Executing: llvm-profdata-14 merge -output=/home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/pqEndcopy3/pqEndcopy31/Corpus/profdata /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/pqEndcopy3/pqEndcopy31/Corpus/pqEndcopy31.profraw
Executing: llvm-cov-14 export /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/pqEndcopy3/pqEndcopy31/pqEndcopy31.out -instr-profile=/home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/pqEndcopy3/pqEndcopy31/Corpus//profdata -format=lcov > /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/pqEndcopy3/pqEndcopy31/Corpus/profdata.lcov
Executing: genhtml -o /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/pqEndcopy3/pqEndcopy31/Corpus/pqEndcopy3.html /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/pqEndcopy3/pqEndcopy31/Corpus/profdata.lcov
Reading data file /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/pqEndcopy3/pqEndcopy31/Corpus/profdata.lcov
Found 3 entries.
Found common filename prefix "/home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq"
Writing .css and .png files.
Generating output.
genhtml: ERROR: cannot read /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/pqEndcopy3/pqEndcopy31/pqEndcopy31.c
Processing file .futag-fuzz-drivers/pqEndcopy3/pqEndcopy31/pqEndcopy31.c

Это пример грепа корня репозитория FUTAG.

Futag │ on    main  grep -nrw '\.futag-fuzz-*'     
examples/opus_decode1.c:102:/home/futag/Futag-tests/libopus/opus-1.3.1/.futag-fuzz-drivers/opus_decode/opus_decode1/opus_decode1.c:80:5: warning: ignoring return value of function declared with 'warn_unused_result' attribute [-Wunused-result]

Здесь примеры этой строчки с ".futag-fuzz-drivers" вместо "futag-fuzz-drivers" в сгенерированных исходниках целей:

grep -nrw '.futag-*'
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.c:80:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:7:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.c:89:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:7:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.c:98:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:7:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.c:106:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:7:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.c:114:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:16:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.c:123:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:16:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.c:132:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:16:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.err:1:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:7:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.err:10:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:7:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.err:19:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:7:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.err:28:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:7:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.err:37:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:7:
fuzzing.futag.libpq.ent-15.res/libpq/futag-fuzz-drivers/succeeded/PQsocket/PQsocket1/PQsocket1.err:45:In file included from /home/sedley/Work/Development/alabamian-trakt/fuzzing.futag.libpq.ent-15.res/libpq/.futag-fuzz-drivers/PQsocket/PQsocket1/PQsocket1.c:7:

При попытке направить FUTAG на расширение для Postgres получаю следующие ошибки

cc1: error: ‘-Werror=unguarded-availability-new’: no option ‘-Wunguarded-availability-new’
cc1: error: ‘-Werror=unguarded-availability-new’: no option ‘-Wunguarded-availability-new’
cc1: note: unrecognized command-line option ‘-Wno-compound-token-split-by-macro’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-unused-command-line-argument’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-compound-token-split-by-macro’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-unused-command-line-argument’ may have been intended to silence earlier diagnostics
cc1: error: ‘-Werror=unguarded-availability-new’: no option ‘-Wunguarded-availability-new’
cc1: note: unrecognized command-line option ‘-Wno-compound-token-split-by-macro’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-unused-command-line-argument’ may have been intended to silence earlier diagnostics
make: *** [<builtin>: src/utils/logger.o] Error 1
make: *** Waiting for unfinished jobs....
make: *** [<builtin>: src/utils/pgut.o] Error 1
cc1: error: ‘-Werror=unguarded-availability-new’: no option ‘-Wunguarded-availability-new’
cc1: note: unrecognized command-line option ‘-Wno-compound-token-split-by-macro’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-unused-command-line-argument’ may have been intended to silence earlier diagnostics
make: *** [<builtin>: src/utils/parray.o] Error 1
make: *** [<builtin>: src/utils/thread.o] Error 1
cc1: error: ‘-Werror=unguarded-availability-new’: no option ‘-Wunguarded-availability-new’
cc1: error: ‘-Werror=unguarded-availability-new’: no option ‘-Wunguarded-availability-new’
cc1: note: unrecognized command-line option ‘-Wno-compound-token-split-by-macro’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-unused-command-line-argument’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-compound-token-split-by-macro’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-unused-command-line-argument’ may have been intended to silence earlier diagnostics
make: *** [<builtin>: src/utils/json.o] Error 1
make: *** [<builtin>: src/utils/configuration.o] Error 1
cc1: error: ‘-Werror=unguarded-availability-new’: no option ‘-Wunguarded-availability-new’
cc1: note: unrecognized command-line option ‘-Wno-compound-token-split-by-macro’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-unused-command-line-argument’ may have been intended to silence earlier diagnostics
make: *** [<builtin>: src/utils/remote.o] Error 1
cc1: error: ‘-Werror=unguarded-availability-new’: no option ‘-Wunguarded-availability-new’
cc1: note: unrecognized command-line option ‘-Wno-compound-token-split-by-macro’ may have been intended to silence earlier diagnostics
cc1: note: unrecognized command-line option ‘-Wno-unused-command-line-argument’ may have been intended to silence earlier diagnostics
make: *** [<builtin>: src/utils/file.o] Error 1

Проблема с генерацией цели.

При попытке начать компиляцию целей с помощью FUTAG получил ошибку вида:

-- [Futag] Fuzz-driver for function:  pg_strip_crlf  generated!
-- [Futag] Fuzz-driver for function:  pg_clean_ascii  generated!
Traceback (most recent call last):
  File "generate.py", line 14, in <module>
    g.compile_targets()
  File "/home/ian/.local/lib/python3.8/site-packages/futag/generator.py", line 615, in compile_targets
    [x for x in (self.install_path / "include" ).iterdir() if x.is_dir()]
  File "/home/ian/.local/lib/python3.8/site-packages/futag/generator.py", line 615, in <listcomp>
    [x for x in (self.install_path / "include" ).iterdir() if x.is_dir()]
  File "/usr/lib/python3.8/pathlib.py", line 1122, in iterdir
    for name in self._accessor.listdir(self):
FileNotFoundError: [Errno 2] No such file or directory: '/home/ian/Work/FUZ-48/libpq-standalone/futag-install/include'

Хотел бы уточнить, с чем это может быть связано (сборка была успешно произведена)?

  1. Python скрипты были использованы те же, что в doc файле "https://github.com/ispras/Futag/tree/main/src/python/futag-package". То есть сначала auto_build() или build_cmake(), далее analyze(), а затем gen_targets() и compile_targets().

  2. Проект был взят открытый с GitLab (собирается через CMake): "https://gitlab.com/sabelka/libpq-standalone/-/tree/main/"

  3. Ошибка появлялась на этапе компиляции. Сборка проходила успешно.

Ошибка при сборке тестового примера json-c

Traceback (most recent call last):
  File "/home/futag-llvm.2.0.2/make_targs.py", line 13, in <module>
    test_build.analyze()
  File "/home/.local/lib/python3.10/site-packages/futag/preprocessor.py", line 739, in analyze
    "return_type_pointer": function_list[func]["return_type_pointer"],
KeyError: 'return_type_pointer'

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.