Во-вторых, strncat копирует <=n символов, до первого нулевого символа, а memmove -- ровно n. В нашем случае от такой замены ничего плохого нет, т.к. n всегда равно длине строки до первого \0.
В-третьих, strncat добавляет к строке завершающий ноль помимо <=n скопированных символов, а memmove этого не делает. Во подавляющем числе случаев использования strncat после выделения память она не зануляется, таким образом нет гарантии, что после таких замен останется нулевой символ в конце строки.
Как отмечено в https://github.com/AndrewCrewKuznetsov/xneur-devel/commit/06d3a6cc6d85fa0251e044a951bf8f28dc4b2f2c#comments, замена
strncat
наmemmove
не является корректной:memmove
может заменятьstrncpy
, а неstrncat
strncat
копирует<=n
символов, до первого нулевого символа, аmemmove
-- ровноn
. В нашем случае от такой замены ничего плохого нет, т.к.n
всегда равно длине строки до первого\0
.strncat
добавляет к строке завершающий ноль помимо<=n
скопированных символов, аmemmove
этого не делает. Во подавляющем числе случаев использованияstrncat
после выделения память она не зануляется, таким образом нет гарантии, что после таких замен останется нулевой символ в конце строки.