我正在开发一个我不久前编写的程序,并且遇到了一些我不明白为什么要这样做的事情。
__fortify_function void DoLog(const char* format,...)
如名称所示,该函数根据某些状态变量输出一条日志消息,其中包含目的地。
我不明白“__fortify_function”的用途。在线搜索清楚地表明它与“FORTIFY_SOURCE”定义有关(此代码不使用该定义),但我无法在线或离线找到任何说明 __fortify_function 用途的内容。无论我在哪里找到它,它就在那里,没有任何解释。当我写 DoLog 时,我可能正在烹饪,所以将其包含在内只是因为我正在使用的示例就是这样做的。
那么“__fortify_function”具体是做什么的呢?
Arkadiusz Drabczyk(请参阅我原来问题的评论)实际上回答了我的问题。这个答案虽然让我得出了一个不明显的结论,所以我想我会把它发布在这里,以防它对其他人有用。
存在 __fortify_function 的原因是 DoLog 使用 __va_arg_pack ,根据文档解析为 __builtin_va_arg_pack :
-- 内置函数:__builtin_va_arg_pack() 这个内置函数代表了一个的所有匿名参数 内联函数。 它只能用于内联函数 总是内联,从不编译为单独的函数,例如 那些使用 'attribute ((always_inline))' 或 'attribute ((gnu_inline))' 外部内联函数。 一定是只有 作为最后一个参数传递给其他带有变量的函数 论据。 这对于编写小包装内联很有用 变量参数函数,当使用预处理器宏时是 不受欢迎。
因此 __fortify_function 设置正确的属性以使用 __va_arg_pack。