2013-12-18 5 views
6

Если dot_product объявленЯвляется ли законным для псевдонима аргументов указателя «const ограничивать»?

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. Этот вопрос касается псевдонимов.

+0

У меня нет стандарта для цитирования, но я должен представить, что это неопределенное поведение. Вы явно говорите компилятору, что никакие другие указатели не ссылаются на одно и то же место памяти, а затем нарушают этот намек. Я не думаю, что это повлияет на это. –

+0

Чтобы противоречить самому себе: если 'dot_product' является обычным определением точечного продукта, то я не думаю, что это будет * важно *. То есть, нарушая 'ограничение', не имеет значения, выполняете ли вы только операции чтения с указателем. Только когда вы пишете, я ожидаю, что возникнут проблемы. –

+0

Должен ли я удалить «редактировать»? Это кажется излишним. Я был потрясен тем, что ** два человека неправильно поняли мой вопрос. – MaxB

ответ

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

Да. Он будет вызывать неопределенное поведение.

Если restrict используется ключевое слово и функция объявлена ​​как:

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

тогда компилятор позволил предположить, что a и b указывают на различные места и обновления одного указателя не будет влиять на другие указатели. Программист, а не компилятор, отвечает за , гарантируя, что указатели не указывают на идентичные местоположения.

Поскольку ваш вызов функции является

dot_product(x, x, x_len) 

который проходит тот же указатель x функции, обновление любого из a или b будет влиять на другие вызывает неопределенное поведение.

+2

Это не относится к вопросу об ограничении на указатель 'ограничение' вообще. –

+0

Вниз избирателя, чтобы объяснить. – haccks

+2

Я проигнорировал это потому, что это никак не связано с вопросом. –

1

Во-первых, я не думаю, что сам вызов UB, UB может возникать только внутри функции, если указатели, переданные как параметры, используются таким образом, что конфликтуют со спецификацией restrict. (UB не имеет большого смысла для вызова, если это запрещено (w/sh) запрещено, это должно было быть нарушением ограничения, а не UB.)

Тогда UB, связанный с restrict, может появиться, если указывающий на объект, изменяется «каким-либо образом». Так что пока ваши векторы не изменены, все в порядке. Внутри вашей функции этого не должно быть, из-за квалификации const. И если что-то снаружи (скажем, другая нить или обработчик сигнала) изменяет ваши векторы, вы все равно ввернуты.