On 17/04/2023 22:21, tito wrote:
On Mon, 17 Apr 2023 14:15:40 -0500
Eric Blake <[email protected]> wrote:

Exploit the value of the flag for -n to reduce the size of
readlink_main() (shown here with CONFIG_FEATURE_READLINK_FOLLOW off)
on x86_64.

function                                             old     new   delta
readlink_main                                        121     118      -3

Signed-off-by: Eric Blake <[email protected]>

---

v2: Add 'make bloatcheck' details
---
  coreutils/readlink.c | 2 +-
  1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/coreutils/readlink.c b/coreutils/readlink.c
index 0a9aa957e..83c417e66 100644
--- a/coreutils/readlink.c
+++ b/coreutils/readlink.c
@@ -88,7 +88,7 @@ int readlink_main(int argc UNUSED_PARAM, char **argv)

        if (!buf)
                return EXIT_FAILURE;
-       printf((opt & 1) ? "%s" : "%s\n", buf);
+       printf("%s%s", buf, "\n"[opt & 1]);
        free(buf);

        fflush_stdout_and_exit_SUCCESS();

base-commit: d2b81b3dc2b31d32e1060d3ea8bd998d30a37d8a

Hi,
I was just curious as with my limited C skills I didn't understand how  "\n"[opt 
& 1] works,
so I applied your patch and compiled it,
but it seems to me that something is wrong:

Prepare a link for testing:
tito@devuan:~/Desktop/SourceCode/busybox_new$ ln -s busybox prova

Busybox with your patch applied:
$ ./busybox readlink prova
Segmentation fault
$ ./busybox readlink -n prova
busybox(null)$

Your testing is correct: the patch is wrong and cannot work.

Real readlink;
readlink prova
busybox
$ readlink -n prova
busybox$

Did you intend something like:

printf("%s%c", buf, '\n'*!(opt & 1));

I am assuming it was intended to be

  printf("%s%s", buf, &"\n"[opt & 1]);

As you are trying to understand how this works: the string "\n" is a character array consisting of the characters '\n' and '\0', where '\0' acts as the string terminator. &"\n"[0] is a pointer to the first element of this array and will be printed as the character '\n'. &"\n"[1] is a pointer to the second element of this array, the null character, meaning it is a null string and printing it has no effect.

This is different from the approach you were taking: printing '\0' with %c results in the output of a null byte. You would not see this null byte if you visually inspect the output, but you would if you e.g. view the output with the 'od' utility.

Cheers,
Harald van Dijk

I did not test if this reduces size.

Ciao,
Tito
_______________________________________________
busybox mailing list
[email protected]
http://lists.busybox.net/mailman/listinfo/busybox

Reply via email to