Как я могу отключить формат безопасности ошибки с Clang?

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

Как я могу отключить формат безопасности безопасности, используя 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

Решение

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

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

Представьте себе, что можно внедрить что-то вроде «% 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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]