“const restrict”指针参数的别名是否合法?

6
如果dot_product被声明为:
float dot_product(const float* restrict a, const float* restrict b, unsigned n);

如果使用以下方式调用它:

dot_product(x, x, x_len)

根据C99标准,什么情况下会出现"undefined"的结果? 编辑 x 是一个指针,它指向 sizeof(float) * x_len 字节的内存,其中 x_len 是无符号整数。这个问题涉及到别名。

我没有标准可以引用,但我想象它是未定义的行为。你明确告诉编译器没有其他指针引用相同的内存位置,然后违反了这个提示。我不认为const会影响这一点。 - Chris Hayes
自相矛盾地说:如果dot_product是点积的常规定义,那么我认为这不会有影响。也就是说,如果您只对指针执行读操作,则违反restrict不应该有影响。只有在写入时,我才会预期出现问题。 - Chris Hayes
我应该删除“编辑”吗?它似乎是多余的。我很震惊有两个人误解了我的问题。 - MWB
@ChrisHayes 我的问题是关于C99标准而不是“你友好的本地编译器”,但我同意。 - MWB
需要澄清的是,由于“dot_product”似乎是一个非常具体的示例函数,因此这个问题是否涉及别名“restrict”指针的只读使用?我认为是的,因为读写用法明显是未定义的。 - Chris Hayes
3个回答

6

我没有原始的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.

这似乎明确指出所问函数具有定义的行为,前提是使用别名指针进行只读访问。通过任何一个别名指针进行写入会引发未定义的行为。

1
首先,我不认为函数调用本身是未定义行为(UB),如果作为参数传递的指针在使用中与restrict的规定相冲突,则可能会发生UB。(如果禁止这种情况的话,这应该被视为约束违规而不是UB,因此对于函数调用来说UB意义不大。)
其次,与restrict有关的UB只有在指向的对象“以任何方式”被修改时才会出现。因此,只要您的向量没有被修改,就一切都没问题。在函数内部,由于有const限定符,不应该发生这种情况。如果外部某些东西(例如不同的线程或信号处理程序)修改了您的向量,那么无论如何都会遇到问题。

-1

是的。这将引发未定义行为。

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

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

那么编译器可以假定ab指向不同的位置,并且更新一个指针不会影响其他指针。程序员而非编译器应该确保指针不指向相同的位置

由于您的函数调用是

dot_product(x, x, x_len)  

这个程序涉及指针,如果将相同的指针x传递给函数,并更新任何一个ab,会影响到另一个变量,导致未定义的行为。


2
这根本没有解决restrict指针别名问题。 - CB Bailey
2
我点了踩,因为这与问题毫无关系。 - Chris Hayes
@ChrisHayes;现在已经编辑过了。 - haccks
3
dot_product更新指针的独立性没有问题(它有函数参数的自己拷贝)。问题出在所指向的数据上。由于两个参数都是“const”指针,问题是即使函数不应该通过任一指针更新数据,这是否仍然是一个问题。 - CB Bailey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接