Как я могу отключить формат безопасности ошибки с Clang? - PullRequest
0 голосов
/ 07 октября 2018

Я пытаюсь скомпилировать проект (dhewm 3, модификация doom 3), и я не могу этого сделать, потому что он использует «небезопасный код», я понимаю, почему это конфликт безопасности, но я не могу его исправить, исправил остальныеиз «ошибок», но эта хитрая, и я уверен, что это безопасно.в любом случае, я не могу отключить ошибку format-security

как отключить ошибку format-security ?, используя clang 6

это строка cmd:

clang++  -D__DOOM_DLL__ -I/home/pvd/Devel/root/include -I/home/pvd/Devel/root/include/AL -I/home/pvd/Devel/root/include/SDL2 -I/home/pvd/Devel/dhewm3/neo/build -I/home/pvd/Devel/dhewm3/neo   -Wno-error=format-security -Wno-format-security -g -O2 -ffast-math -fno-unsafe-math-optimizations -fomit-frame-pointer   -pipe -Wall -fno-strict-aliasing -fvisibility=hidden -Wno-sign-compare -Wno-switch -Wno-format-security -Wno-error=format-security -Woverloaded-virtual -o CMakeFiles/dhewm3.dir/framework/Console.cpp.o -c /home/pvd/Devel/dhewm3/neo/framework/Console.cpp

это ошибка:

/home/pvd/Devel/dhewm3/neo/framework/Console.cpp:283:30: error: format string is not a string literal (potentially insecure) [-Werror,-Wformat-security]
                SCR_DrawTextRightAlign( y, msg );
                                           ^~~
/home/pvd/Devel/dhewm3/neo/framework/Console.cpp:283:30: note: treat the string as an argument to avoid this
                SCR_DrawTextRightAlign( y, msg );
                                           ^
                                           "%s", 
1 error generated.

1 Ответ

0 голосов
/ 08 октября 2018

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

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

Представьте, что можно имплантировать что-то вроде «% s», где один изНапример, параметры были равны нулю, это сбой (на старых системах здесь возникало бы много проблем, например, выгрузка памяти с этого адреса до нахождения ближайшего нуля).

Ваше решение похоже на то, что компилятор сказал:

SCR_DrawTextRightAlign( y, "%s", msg );

Потому что, если msg в качестве переменной имеет, например, "% s" внутри, и нет другого параметра, он попытается напечатать строку с неопределенным указателем, это небезопасно и может привести к сбою (падение, если вам повезет).

Это будет выглядеть так:

SCR_DrawTextRightAlign( y, "Someone implanted: %s" );

% s будет пытаться перейти в память, указанную параметром (который теперь не определен, может бытьчто-нибудь, что компилятор и процессор поместили в стек / регистры) и печатали символ за символом, пока не был найден ноль.

Представьте, что этот указатель былслучайное указание на что-то чувствительное, например на токены API, пароли и т. д. Это будет напечатано перед пользователем.

Пожалуйста, исправьте это, не пытайтесь пропустить это.Если бы вы сделали msg динамическим, вы бы очистили его вручную, если хотите сохранить код таким, какой он есть.

Так что любой "% s" должен быть "%% s", так что вы бывручную найдите любой% и добавьте к нему другой%.

РЕДАКТИРОВАТЬ: Если редактирование кода не является вариантом, попробуйте старую версию LLVM, Нет предупреждений о безопасности формата в Xcode 4.4 Этот вопрос намекает на то, что Xcode 4.2 - последнее, что поддерживает отключение форматирования, что намекает на Apple LLVM Clang версии 3.0

https://en.wikipedia.org/wiki/Xcode#Xcode_3.0_-_Xcode_4.x

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...