memcpy UB при src == dst
От: Кузнец Россия  
Дата: 10.07.17 14:05
Оценка: -1
Рассмотрим следующую конструкцию:

int foo(int* a, int* b, int n)
{
    memcpy(a, b, n);
}

int main()
{
...
    int* ptr = new int[n];
...
    foo(ptr, ptr, n);
...
    return 0;
}


По стандарту это UB (перекрывающиеся участки памяти). Вопрос — существует ли платформа/компилятор (и т. п.), где выполнив этот код, я получу некорректное поведение? То есть после выполнения foo данные в ptr окажутся испорчены.

Здесь важен тот момент, что идёт попытка сделать memcpy из указателя в самого себя, есть ли реализации, которые в такой ситуации работают некорректно?

Проверял на gcc, данные запорчены не были. Версия: gcc version 4.9.2 (Debian 4.9.2-10). Компилировался с флагом -O0, на всякий случай, чтобы компилятор не соптимизировал этот код.

В принципе, никто не запрещает реализаторам memcpy перед началом копирования сделать memset(dst, 0), это не противоречит стандарту, но скорее всего так никто делать не будет, но может есть какие-то действия, которые осмысленны, и при этом нахимичат и в такой ситуации (копирование данные в себя, как в примере).

PS. Знаю, что так писать нельзя, вопрос скорее научный.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.