<div dir="ltr"><div class="gmail_default" style=""><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">I see nothing in the C standard specification of qsort() that says sorting an array with zero members leads to undefined behaviour.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><blockquote style="font-family:Arial,Helvetica,sans-serif;margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><a href="http://port70.net/~nsz/c/c11/n1570.html#7.22.5.2">http://port70.net/~nsz/c/c11/n1570.html#7.22.5.2</a></div></blockquote><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">The POSIX specification for qsort() is quite clear that sorting zero elements is safe.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><blockquote style="font-family:Arial,Helvetica,sans-serif;margin:0px 0px 0px 40px;border:none;padding:0px"><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><a href="https://pubs.opengroup.org/onlinepubs/9699919799/functions/qsort.html">https://pubs.opengroup.org/onlinepubs/9699919799/functions/qsort.html</a></div></blockquote><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">The manual pages for Linux and macOS (BSD) do not specify that sorting zero elements leads to undefined behaviour.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif">Is there a platform where there is a known problem?  If so, it would be worth documenting which platform/version explicitly so that the change can be undone in future if the recalcitrant platform(s) change their behaviour.</div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div><div class="gmail_default" style=""><font face="arial, helvetica, sans-serif">With all that said, the change is trivial — but could be improved by using the test </font><font face="monospace">if (nlinks > 1)</font><font face="arial, helvetica, sans-serif"> so that the code doesn't call qsort for a single-element array either; that is already in sorted order, of course.</font></div><div class="gmail_default" style="font-family:arial,helvetica,sans-serif"><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Oct 25, 2022 at 10:10 PM Paul Eggert via tz <<a href="mailto:tz@iana.org">tz@iana.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">* zic.c (make_links): Don't call qsort(NULL, 0, ...) as this has<br>
undefined behavior in C.  This fixes a bug introduced five days ago.<br>
---<br>
 zic.c | 3 ++-<br>
 1 file changed, 2 insertions(+), 1 deletion(-)<br>
<br>
diff --git a/zic.c b/zic.c<br>
index 78afa67..a699285 100644<br>
--- a/zic.c<br>
+++ b/zic.c<br>
@@ -683,7 +683,8 @@ static void<br>
 make_links(void)<br>
 {<br>
   ptrdiff_t i, j, nalinks;<br>
-  qsort(links, nlinks, sizeof *links, qsort_linkcmp);<br>
+  if (nlinks)<br>
+    qsort(links, nlinks, sizeof *links, qsort_linkcmp);<br>
<br>
   /* Ignore each link superseded by a later link with the same name.  */<br>
   j = 0;<br>
-- <br>
2.37.3<br>
<br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr"><div><div dir="ltr">Jonathan Leffler <<a href="mailto:jonathan.leffler@gmail.com" target="_blank">jonathan.leffler@gmail.com</a>>  #include <disclaimer.h><br>Guardian of DBD::Informix - v2018.1031 - <a href="http://dbi.perl.org" target="_blank">http://dbi.perl.org</a><br>"Blessed are we who can laugh at ourselves, for we shall never cease to be amused."</div></div></div></div></div></div></div></div></div></div>