如何禁用clang的格式安全性错误?

时间:2018-10-07 20:22:03

标签: c++ clang++ diagnostics

我正在尝试编译项目(dhewm 3,doom 3的修改),但由于使用“不安全的代码”而无法这样做,我理解为什么这是安全问题,但我无法修复,其余问题已修复的“错误”,但这是棘手的,并且非常确定它的安全性。 无论如何,即时通讯无法禁用错误格式安全性

如何使用clang 6禁用格式安全性错误?

这是cmd行:

xxx
xox
xxx

这是错误:

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

1 个答案:

答案 0 :(得分:0)

格式就像一种语言,可以被视为类似于可执行代码,这很危险。

想象一下来自文件或变量的格式字符串。如果此文件遭到破坏,则可能会植入任何东西,例如可能会暴露内存的某些部分或至少会使应用程序崩溃的事物。

想象一下,可以植入诸如“%s”之类的东西,例如其中一个参数为null,这就是崩溃(在旧系统上,这里会发生很多问题,例如从该地址转储内存直到找到最接近的null )。

您的解决方案就像编译器所说的那样:

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

例如,如果msg作为变量包含“%s”,并且没有其他参数,则它将尝试在未定义的指针上打印字符串,这是不安全的,并且可能会崩溃(如果您很幸运)。

它会变成这样:

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

%s将尝试转到参数所指向的内存(现在尚未定义,可以是编译器和处理器放在堆栈/寄存器中的任何内容),并逐字符打印,直到找到空值为止。

想象一下,该指针随机指向一些敏感的东西,例如API令牌,密码等。它将被打印在用户的面前。

请更正它,请勿尝试跳过它。如果您想使msg动态,那么如果您想保持代码原样,可以手动对其进行清理。

因此,任何“%s”应为“ %% s”,因此您将手动搜索任何%,然后向其中添加另一个%。

编辑: :如果无法编辑代码,请尝试使用旧版本的LLVM, No format security warnings in Xcode 4.4 这个问题暗示Xcode 4.2是支持禁用格式的最后一件事,这暗示了Apple LLVM Clang 3.0版。

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