Search code examples
cpointersc99pointer-aliasingrestrict-qualifier

Is it legal to alias "const restrict" pointer arguments?


If dot_product is declared as

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

would calling it with

dot_product(x, x, x_len)

be "undefined", according to the C99 standard?

Edit

x is a pointer, of course, pointing to sizeof(float) * x_len bytes of memory, x_len is unsigned. This question is about aliasing.


Solution

  • I do not have the original C99 (that is, ISO9899:1999) text; I only have a copy of ISO9899:2007:TC3. I expect this text, taken from page 111 of that document, is very similar to the text in the C99 standard.

    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.
    

    This seems to clearly call out functions of the form you asked about as having defined behavior, provided the aliased pointers are used for read-only access. Writing through either of the aliased pointers would invoke undefined behavior.