[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Better alternative to strncpy in QEMU.
From: |
Peter Maydell |
Subject: |
Re: Better alternative to strncpy in QEMU. |
Date: |
Mon, 12 Apr 2021 14:19:58 +0100 |
On Sun, 11 Apr 2021 at 14:52, Chetan <chetan4windows@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