<table border="1" cellspacing="0" cellpadding="8">
    <tr>
        <th>Issue</th>
        <td>
            <a href=https://github.com/llvm/llvm-project/issues/56228>56228</a>
        </td>
    </tr>

    <tr>
        <th>Summary</th>
        <td>
            [LLVM-COV] DEFFUNC callsites result wrong coverage statistics under while-statement
        </td>
    </tr>

    <tr>
      <th>Labels</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Assignees</th>
      <td>
      </td>
    </tr>

    <tr>
      <th>Reporter</th>
      <td>
          NJUocean
      </td>
    </tr>
</table>

<pre>
        1|       |struct ucharp { unsigned char *v, *l, *h; };
    2|     15|#define AREF(var, idx) ((((((((var).v+(idx)) < (var).l) \
    3|     15|                     || (((var).v+(idx)+1) > (var).h))) \
    4|     15|                    && (__builtin_trap (), 0)), \
    5|     15|                   (var).v)[(idx)])
    6|       |
    7|       |struct list
    8|       |{
    9|       |  struct list *next;
   10|       |};
   11|       |
   12|       |struct list *
   13|       |alloc_list (void)
   14|      2|{
   15|      2|  static struct list l;
   16|      2|  return &l;
   17|      2|}
   18|       |
   19|       |int one = 1;
   20|       |
   21|       |void
   22|       |foo (struct ucharp cp, struct ucharp lp, struct list **nextp)
   23|      1|{
   24|      2|  while (1)
   25|      2|    {
   26|      2|      struct list *list;
   27|      2|      while (AREF (lp, 0) && AREF (cp, AREF (lp, 0)))
   28|      2|        ++lp.v;
   29|      2|      list = alloc_list ();
   30|      2|      while (AREF (cp, AREF (lp, 0)))
   31|      2|        ++lp.v;
   32|      2|      if (AREF (lp, 0) == one)
   33|      2|  do
   34|      2|    ++lp.v;
   35|      2|  while (AREF (lp, 0) && AREF (cp, AREF (lp, 0)));
   36|      2|      *nextp = list;
   37|      2|      nextp = &list->next;
   38|      2|      if (!*lp.v)
   39|      1|  break;
   40|      2|    }
   41|      1|}
   42|       |
   43|       |extern void exit (int);
   44|       |
   45|       |int
   46|       |main (void)
   47|      1|{
   48|      1|  static unsigned char cp0[] = "\0\0\0\0";
   49|      1|  struct ucharp cp = { cp0, cp0, cp0 + sizeof (cp0) };
   50|      1|  static unsigned char lp0[] = "\1\1\0\0";
   51|      1|  struct ucharp lp = { lp0, lp0, lp0 + sizeof (lp0) };
   52|      1|  struct list list;
   53|      1|  struct list *nextp = &list;
   54|      1|  foo (cp, lp, &nextp);
   55|      1|  exit (0);
   56|      1|}

Line 28 and 31 were not executed in fact.

</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJytVkuPozgQ_jXkgjryg-eBQyfpHFY9s9JIM9eWA07iXTcgMOme_fVTxgnYbjLbKy0hMXG9q74qc2iqn0UIFw7SbWgueOpVN5QqHMoz61rY2IRD3YtTzatQb4UBebwEZKtXeV3PAd0A5w6WAO0C9KhVkZtWHMNTQGjFj6Lm4eO3p31AsgvrtLSo3gOSg5Js8R658jUY3MA_wzzyU234RpbjVrydjVPXOMrNbSLUtH-xsMHGypNl5Wxsf7AV3bMVkARureHl5TAIqUT9ojrWGuO5Dh_ddG5dnfEdnY7DeRBbPsc7_TtpSJyizvvpUrGl6NXMkrmiqVXU3CGFoSWvgVDzd2WDACNPlQMRjJd9xOSej9rGzEYdNiZlU75cubJLIyo7H3iq0ghMOygcOyQdFFOidGKTjt-JJ9BxNXS1rrfLl3o2dzMpuxO6m2BRq7CBngnoDrrUUk3QsjxxUzpmYaK5aT02jU6U2-5lq6Ho7kl7b6qCKXZr55jMBcFejknkpeztLCTX9rGjwS-F9tTS4ideX55jI5TtTKULMpN1PYz0amJEZhSNXXujmIx85Lvek5lswYweAdChG9lCu9o-5QvMJgAotAtkbcQSpegz4XzSaYr_g9OULDCL470s0p2OBcDrGKRuR6C8amZi5BPvuhL7nP9fQW0zS3C7AX8slQ82ugS2mV0PCJB4gHPFn5R0CT8muwE0NeC6NSN_EsjdZkP5oePsb1tn9BEr9gyKsKvBJrmjYt53Ry7EwGHu6SkT8ncx4hVGlpfGKLqjLHb2teBEck-vVybqpaEepV4EltHMIU1D3X2XKVukz9B4dy0PgUMYOV_YskPJP2h1p6fRA-9MWjMAa140lMNe_MObo0GhwaZ7IsboM17LBa_x9bvkdYx_67WcvZbG3XnxvJbLXpNl_ebk9Fokpr9hdprr2i2OcOQJXw8x09Oml0FsOpls0dgTvQEW-YzJcluY32f9CkuykNUVjM_wjXc8rBsF2ng5KKgQIPXISrU27KuqoFVOc7ZSQkleQN2en398edj--UPXb_e033__CviAmd8LxXt4legHqcK3rqlPYdlceMdO3MCgByT0AIWKd2biP-ht_sprtRo6WZyVavuAwtEM79f7k1Dn4bAum1f4I-Xltjy0XfMXL6FJ96LvB97DQ5wQkq3OBUJlVdKUpCzPk4QdSBYfq7yKyhzTBD4ryQ5c9oVB30oUBBGCEpIgYCB0fSRlWmFUYhzzKj-wIEIceleuteF1051WXTH6cBhOPRB1efuZyPoR5fymnw3q3HTF1z--NyVn9Wr0txid_QW9-BVH">