【问题标题】:Is it legal to alias "const restrict" pointer arguments?别名“const restrict”指针参数是否合法?
【发布时间】:2013-12-18 09:16:02
【问题描述】:

如果dot_product 被声明为

float dot_product(const float* restrict a, const float* restrict b, unsigned n);

会调用它

dot_product(x, x, x_len)

根据 C99 标准是“未定义”吗?

编辑

x是指针,当然是指向sizeof(float) * x_len字节的内存,x_len就是unsigned。这个问题是关于别名的。

【问题讨论】:

  • 我没有引用的标准,但我不得不想象它是未定义的行为。您明确告诉编译器没有其他指针引用相同的内存位置,然后违反了该提示。我认为constness 不会对此产生影响。
  • 自相矛盾:如果dot_product 是点积的常用定义,那么我认为它重要。也就是说,如果您只对指针执行读取操作,那么违反restrict 应该无关紧要。只有当你写的时候,我才会预料到问题会发生。
  • 我应该删除“编辑”吗?似乎是多余的。 两个人误解了我的问题,我感到很震惊。
  • @ChrisHayes 我的问题是关于 C99 标准而不是“你友好的本地编译器”,但我同意。
  • 要清楚,因为dot_product 似乎是一个非常具体的示例函数,这个问题是关于别名restrict 指针的只读使用吗?我认为是这样,因为读写用法显然是未定义的。

标签: c pointers c99 pointer-aliasing restrict-qualifier


【解决方案1】:

我没有原来的C99(即ISO9899:1999)文本;我只有ISO9899:2007:TC3 的副本。我希望这段取自该文档第 111 页的文本与 C99 标准中的文本非常相似。

6.7.3.1 Formal definition of restrict

...

10. EXAMPLE 3

The function parameter declarations

    void h(int n, int * restrict p, int * restrict q, int * restrict r)
    {
        int i;
        for (i = 0; i < n; i++)
            p[i] = q[i] + r[i];
    }

illustrate how an unmodified object can be aliased through two restricted
pointers. In particular, if a and b are disjoint arrays, a call of the form
h(100, a, b, b) has defined behavior, because array b is not modified within
function h.

这似乎清楚地调用了您询问的具有已定义行为的形式的函数,前提是别名指针用于只读访问。通过任何一个别名指针写入都会调用未定义的行为。

【讨论】:

    【解决方案2】:

    首先我不认为调用本身是UB,UB只能发生在函数内部,如果作为参数传递的指针的使用方式与restrict的规范冲突。 (UB 对调用没有多大意义,如果(w/sh)应该被禁止,这应该是违反约束而不是 UB。)

    那么,与restrict 相关的UB 只能出现,如果指向的对象被“以任何方式”修改。所以只要你的向量没有被修改,一切都很好。由于const 资格,在您的函数内部不应该发生这种情况。如果外部的某些东西(比如不同的线程或信号处理程序)修改了你的向量,无论如何,你就完蛋了。

    【讨论】:

      【解决方案3】:

      是的。它将调用未定义的行为。

      如果使用restrict关键字并且函数声明为:

      float dot_product(const float* restrict a, const float* restrict b, unsigned n);
      

      然后允许编译器假设ab 指向不同的位置并且更新一个指针不会影响其他指针。程序员而不是编译器负责确保指针不指向相同的位置

      因为你的函数调用是

      dot_product(x, x, x_len)  
      

      将相同的指针x 传递给函数,更新ab 中的任何一个都会影响其他导致未定义的行为。

      【讨论】:

      • 这根本没有解决restrict 指针别名问题。
      • 我投了反对票,因为这与问题没有任何关系。
      • @ChrisHayes;现已编辑。
      • dot_product 独立更新指针没有问题(它有自己的函数参数副本)。问题是指向的数据。由于两个参数都是const 指针,问题是这是否仍然是一个问题,因为函数在任何情况下都不应该通过任何一个指针更新数据。
      猜你喜欢
      • 1970-01-01
      • 2016-12-16
      • 2023-03-20
      • 2014-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-10
      • 2011-01-14
      相关资源
      最近更新 更多