如何为特定功能禁用堆栈金丝雀?

How to disable stack canaries for specific functions?

使用gcc,是否可以使用-fstack-protector编译,但针对特定功能省略。

例如,假设我有两个函数。

void a() {
  ...
}

void b() {
  ...
}

我能否告诉编译器编译一个程序,该程序将在 a 的已保存 return 地址之前使用金丝雀,但 b 没有金丝雀?

您必须测试它是否有效(在 Godbolt 检查生成的代码)但看起来您可以这样做,例如:

__attribute__ ((no_stack_protector)) void foo () { ... }

no_sanitize 看起来是一个有趣的选项,我想知道谁在使用它。