On Sun, 11 Apr 2021 at 14:52, Chetan <chetan4wind...@gmail.com> wrote: > char *qemu_strncpy(char destination[], char source[], size_t destination_size) > { > /* Looping through the array and copying the characters from > * source to destination. > */ > for (int i = 0; i < strlen(source); i++) { > destination[i] = source[i]; > > /* Check if value of i is equal to the second last index > * of destination array and if condition is true, mark last > * index as NULL and break from the loop. > */ > if (i == (destination_size - 2)) { > destination[destination_size - 1] = '\0'; > break; > } > } > return destination; > }
This implementation is "accidentally quadratic", because it calls strlen(source) every time through the loop, and thus copying an N byte string will read N*N bytes of memory. (The compiler can't pull the "strlen(source)" call up out of the loop because it can't guarantee that source and destination don't overlap.) I think this is a good illustration of why we probably don't want to roll our own string operation functions if we can avoid it (ie without having a clear view of why we are improving on either what libc or glib offer us). thanks -- PMM