当在函数指针类型上使用时,gcc的函数属性扩展是否有效?
在声明函数指针的类型时可以使用函数属性,但至少其中一些似乎没有效果。
https://stackoverflow.com/a/28740576/1128289
gcc文档本身并未解决此问题。
答案 0 :(得分:1)
一般来说,C标准基本上说,在类型与对象本身类型不对齐的指针上处理对象会产生未定义的行为 - 这个一般规则有很多例外,但显然,没有一个似乎适用于你的情况。
这意味着我们首先要在非常不安全的地方移动。
首先,您需要将函数属性区分为两个类:
aligned
或interrupt
- 一旦声明指针,不归因于此方式的函数将不会更改其内部代码例如(为函数生成的代码需要动态更改 - 例如,"从中断返回"指令替换为"正常返回&#;#{1}} 34;一个 - 取决于它将被调用的指针类型。这显然是不可能的。interrupt
或noreturn
。这些属性有时可能不会修改功能代码本身(你不会知道,但是......),而是告诉调用代码一些关于它可以做出的优化的假设。这些假设只会影响调用函数,因此可以通过调整指针来触发 (您甚至不需要指针来执行此操作,修改后的函数原型应该足够 - 对于语言,实际上会产生相同的效果)。如果你告诉编译器它可以做出这样的假设而那些结果不是真的,那么这将导致各种各样的事情出错。毕竟,C使程序员负责确保指针指向正确类型的事物。 然而,有一些函数属性实际上限制允许调用函数做出的假设数量(最明显的是malloc
告诉调用它返回的代码无类型和未初始化的内存)。那些应该相对安全使用(但是,我没有提出用例atm)
没有关于上面(1)或(2)的内容的非常详细的知识,以及函数属性在调用和调用代码中可能会产生什么影响(这很难实现,因为我不会回想起曾经见过详细记录的内容),你将无法决定这个指针实际上是否可能调整以及它可能产生的副作用。
另外,在我看来,调整指向函数的指针和用(故意)错误的原型调用外部函数之间没有太大的区别。这可能会让您对实际尝试的内容有所了解......