Может ли функция вернуть аргумент, который является ограничительным указателем? - PullRequest
3 голосов
/ 13 апреля 2020

Скажем, у меня есть функция, которая принимает 2 не псевдонима int* и копирует один int в другой, а затем возвращает int*, который служил в качестве пункта назначения. Например:

int* copy_int(int* restrict dest, int const* restrict src) {
    *dest = *src;
    return dest;
}

Является ли какой-либо из следующих кодов вызова неопределенным поведением?

void caller(void) {
    int dest;
    int src = 42;

    copy_int(&dest, &src);  // ignored return value aliases &dest
}
void caller(void) {
    int dest;
    int src = 42;

    int* dest_addr = copy_int(&dest, &src);  // dest_addr aliases &dest
}
void caller(void) {
    int dest;
    int src = 42;

    int* dest_addr = &dest;
    int* dest_addr_2 = copy_int(&dest, &src);  // dest_addr_2 aliases dest_addr
}

Или я могу с уверенностью предположить, что restrict применяется только внутри вызываемый, и что я могу псевдоним этих указателей за пределами вызова функции?

1 Ответ

2 голосов
/ 13 апреля 2020

restrict относится к внутреннему значению copy_int(int* restrict dest, int const* restrict src), что может предполагать функция, что приводит к лучшему оптимизированию кода. Вызывающий абонент обязан передать адреса, которые не перекрывают данные.

В этом случае все случаи делают одно и то же: copy_int(&dest, &src);. dest и src не сглаживают друг друга. Примеры псевдонимов, представленные OP, не влияют на dest, src.

Пример плохого кода ниже.

copy_int(&src, &src);  // bad
...