Это не так сложно продемонстрировать, что strcpy
на перекрывающихся адресах источника и назначения происходит сбой на некоторых платформах, что приводит к неверным результатам или перехвату (последний с некоторыми отрицательными случайными смещениями в Linux / amd64).
Я бы инструктировал strcpy
функция-обертка для нашей кодовой базы с утверждениями отладочной сборки, которые проверяют наличие таких перекрывающихся копий, и получили ряд внутренних запросов на разработку, чтобы ослабить эту проверку утверждений, чтобы она вызывала прерывание только для ненулевых перекрытий.
Я не решался сделать это, основываясь на моем прочтении документация strcpy поскольку я предполагаю, что равный источник и пункты назначения будут считаться перекрытыми. Определено ли перекрытие явно в стандарте C ++ (или C), и включает ли оно также равенство?
Я подозреваю, что многие продавцы strcpy
Это частный случай реализации, несмотря на свободу, которую стандарт допускает для неопределенного поведения. Существуют ли комбинации платформ и аппаратных средств, в которых такое равное копирование не работает?
Поскольку вы используете C ++, вопрос на самом деле, почему вы не используете std::string
, strcpy
общеизвестно небезопасно (как и его кузены strcpy_s
а также strncpy
хотя они немного безопаснее, чем strcpy
).
Если вы попытаетесь скопировать из источника в место назначения, которые совпадают, в лучшем случае вы не получите никаких изменений.
Если вы нашли себя лучший сайт документации для функций C вы увидите эту подпись:
char *strcpy(char *restrict s1, const char *restrict s2);
restrict
в этом случае указывает, что вызывающая сторона обещает, что два рассматриваемых буфера не перекрываются.
Мы можем продолжить поиск значения ограничения с C99 и найти эта страница википедии:
Это говорит о том, что за время жизни указатель, только он или значение
непосредственно полученные из него (такие как указатель + 1) будут использоваться для доступа
объект, на который он указывает.
довольно ясно, что идентичные указатели не допускаются. Если это работает в вашей системе, у вас нет причин думать, что это сработает на следующей итерации компилятора, библиотеки или на новом оборудовании.