我想知道前边缘CFI与后边缘CFI 之间的区别
前向边缘CFI在函数调用前检查,后向边缘CFI在函数调用后检查?
我很好奇前边缘CFI和后边缘CFI是什么意思。
您在问题中定义前边缘和后边缘的方式不太正确。乍一看,区别并不是很清楚,但在考虑实现时,它实际上非常重要!
由于后边缘更容易定义,让我们从这里开始:后边缘是在语义上类似于返回指令的东西。在x86和ARMv8中,我们有一条ret
指令可以做到这一点,但在RISCV等其他ISA中,我们只有一条jr lr
指令(实际上只是将链接寄存器传递给间接分支指令!(。然而,不管细节如何,语义上类似于返回的东西会将控制流发送回我们以前的任何地方。
前边缘基本上只是";所有不是后沿的东西";。这包括函数调用、直接分支和某些类型的间接分支(例如vtables和分支表,但值得注意的是,不是充当返回的间接分支!(都属于这一类。