From: Chetan <chetan4windows@gmail.com>
To: QEMU Developers <qemu-devel@nongnu.org>
Cc: Peter Maydell <peter.maydell@linaro.org>,
Thomas Huth <thuth@redhat.com>,
bruno.larsen@eldorado.org.br
Subject: Re: Better alternative to strncpy in QEMU.
Date: Tue, 13 Apr 2021 08:20:34 +0530 [thread overview]
Message-ID: <CAPPKfOHOb9C+GceJFSKZwnw+1UCPkDYoL_1eGizQ6JH3GpJRiQ@mail.gmail.com> (raw)
In-Reply-To: <CAFEAcA_8ZsHwa+vxz99q52FUP4n7QDTLWpEEh2n_v-Ujiwdu_g@mail.gmail.com>
[-- Attachment #1: Type: text/plain, Size: 2935 bytes --]
Hello All,
> I'm not sure what's the improvement over strncpy() here? Paolo, could you
> elaborate?
> (Note that we also have some functions like strpadcpy() in QEMU already,
> which can be used in similar ways)
Ok Thanks, I'll wait for Paolo to clarify if the functions are needed, if
yes then whether my understanding
is correct. If not, then I'll drop this and pick another one.
> Please use "*destination" and "*source" instead of "destination[]" and
> "source[]" here.
@Thomas Thanks for the input, I'll change it accordingly.
> 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.)
@Peter Thanks for the input, I'll be using a while loop instead, as Bruno
suggested. Also, I will only continue with this task after Paolo's input.
> One other optimization that could be done (but is a bigger headache to
implement correctly) would be to cast the char* into uint64_t* (or
uint32_t* for 32-bit >systems) and copy more bytes at a time. The headache
comes from finding a 0 in this longer variable, but you can probably use a
similar strategy to freebsd's > strlen (
https://github.com/freebsd/freebsd-src/blob/main/lib/libc/string/strlen.c).
@Bruno Thanks I'll check out freebsd code.
Thanks and Regards,
Chetan P.
On Mon, Apr 12, 2021 at 6:50 PM Peter Maydell <peter.maydell@linaro.org>
wrote:
> 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
>
[-- Attachment #2: Type: text/html, Size: 4351 bytes --]
next prev parent reply other threads:[~2021-04-13 2:53 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-04-11 13:50 Better alternative to strncpy in QEMU Chetan
2021-04-12 4:51 ` Thomas Huth
2021-04-13 7:32 ` Paolo Bonzini
2021-04-12 13:19 ` Peter Maydell
2021-04-13 2:50 ` Chetan [this message]
[not found] <mailman.36964.1618210428.30242.qemu-devel@nongnu.org>
2021-04-12 12:48 ` Bruno Piazera Larsen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=CAPPKfOHOb9C+GceJFSKZwnw+1UCPkDYoL_1eGizQ6JH3GpJRiQ@mail.gmail.com \
--to=chetan4windows@gmail.com \
--cc=bruno.larsen@eldorado.org.br \
--cc=peter.maydell@linaro.org \
--cc=qemu-devel@nongnu.org \
--cc=thuth@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).