C- DO GCC函数属性会影响功能指针



GCC的函数属性扩展是否在函数指针的类型上使用?

在声明函数指针的类型时,可以使用函数属性,但至少其中一些似乎没有效果。

https://stackoverflow.com/a/28740576/1128289

GCC文档本身没有解决此问题。

非常普遍,C标准基本上说,在指针上处理一个对象,该指针与对象本身的类型不符,该指针会产生不确定的行为 - 此一般规则有很多例外,但是显然,它们似乎都不适用于您的案件。

这意味着我们首先要在这里非常不安全的地面上。

首先,您需要将函数属性区分为两个类:

  1. 函数属性实际上在函数本身(例如alignedinterrupt)的行为或位置中实际更改某些内容的函数属性 - 一旦您声明指向其指针interrupt(例如)(例如,为该函数生成的代码需要动态更改 - 例如,"从中断"指令替换为"返回正常"的代码 - 取决于沿哪种类型的指针,它将被调用)。这显然是不可能的。
  2. 函数属性有关该函数可以预期的某些东西 - 例如noreturnmalloc。这些属性有时可能不会修改功能代码本身(但是,您永远不会知道...),而是告诉呼叫代码有关它可以做出的假设以进行优化。这些假设将仅影响调用功能,因此可以通过调整指针来触发(您甚至不需要指针来执行此操作,修改的函数原型应该足够 - 对于语言,这将是实际证明具有相同的效果)。如果您告诉编译器,它可以做出这样的假设,而这些假设并非如此,但是,这将导致各种各样的事情出错。毕竟,C使程序员负责确保指针指向正确类型的事情。

但是,函数属性实际上限制允许呼叫函数的假设量(最明显的是malloc,它告诉呼叫代码,它返回但未返回的内存,)。这些应该相对安全地使用(但是,我确实没有提出用例AMT)

在上面的(1)或(2)中属于的内容以及函数属性可能会影响什么和调用代码中的究竟是什么(这将很难实现)曾经看到过详细记录的),因此您将无法决定该指针的实际调整是否可能是可能的,以及它可能会产生什么副作用。

我认为,调整指针的指针与使用(故意)错误的原型调用外部功能之间没有太大区别。这可能会使您了解您实际要做的事情...

最新更新