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

    <tr>
        <th>Summary</th>
        <td>
            [clang] False positive clang-analyzer-core.DivideZero with loop over container
        </td>
    </tr>

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

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

    <tr>
      <th>Reporter</th>
      <td>
          chrchr-github
      </td>
    </tr>
</table>

<pre>
    ~~~c++
#include <vector>
int f(const std::vector<int>& v) {
    if (v.empty())
 return 0;
    int h = 0;
    for (auto it = v.begin(); it != v.end(); ++it) {
        h = std::max(h, *it);
    }

    int x = 512;
 if (h < x)
        h = h * (x / h + 1);
    return h;
}
~~~
~~~
<source>:12:20: warning: Division by zero [clang-analyzer-core.DivideZero]
   12 |         h = h * (x / h + 1);
 |                  ~~^~~
<source>:3:9: note: Assuming the condition is false]
    3 |     if (v.empty())
      | ^~~~~~~~~
<source>:3:5: note: Taking false branch]
    3 |     if (v.empty())
      |     ^
<source>:5:5: note: 'h' initialized to 0
 5 |     int h = 0;
      |     ^~~~~
<source>:6:5: note: Loop condition is false. Execution continues on line 10
    6 |     for (auto it = v.begin(); it != v.end(); ++it) {
      |     ^
<source>:11:9: note: 'h' is < 'x'
   11 |     if (h < x)
      | ^
<source>:11:5: note: Taking true branch
   11 |     if (h < x)
 |     ^
<source>:12:20: note: Division by zero
   12 |         h = h * (x / h + 1);
      |                  ~~^~~
~~~
There could be division by zero if the vector holds only numbers <= 0. However, the diagnostic seems to imply that the vector might be empty, which is impossible.
https://godbolt.org/z/cbKh7axxd
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJy0VkGP4jgT_TXFpdQoqRACBw40NPqkb49z2pvjmNi7jo1sh4Y-8NtXdhhoss3MrkZrRXJil-u9Ktezw7xXrRFiBeUrlNsJ64O0bsWl49K9tCrIvp7UtjmvLpcLB3qNT7aFbA1UKMN13wiEYnMUPFgHxdswqUzAPdCCW-MD-tBAsYZi_d1qo0yItjTHI9ASobo6RURUewRaHKeiO4Qz0AJoGZ9h3onQO4MZFJ9XmIASodiOxvfWRVesDxZVSAbHaS1aZa5ui9c0TvkwJUxznxhiVeFv_GIb0G5xdewEtJBAGwRapzUPRKDaXpP2wPmUvJQ53Y2H4KP7DZ7uYT_AyggSzU4ItEufr5iPMa-ZkrfBG4nL5TJ6gWLjbe-4iJtSrCOhNWVQrPGdOaNMG1-36qi8sgbrM34IZxHKV66ZaV-YYfr8IdwLt05Mo10jfhfOQrm98ckJodrgv47k86Jbu1ygfHtCvoBivYx8jQ0i9mvv-06ZFoMUyK1pVIhRKI97pr34TBKLG94PqxCHTd1gojG0p2TKz2S-sT8jlYSMtWOGy18ikPry7UvwcgwOVEmgCpVRQTGtPkSDwWJ2dVresZ8I6gHzadDzMe5v1h6-yPwU306C92mMWxOU6YVHa1ArIzDP7rjzG-5_Jemf5TLPx2V1S6ZPYgWqTkDVvd7z0U5-relrET3H_Kp6gutvxfPP8X4a4l313_HGkv9lNT_k-rmkb5X1TQoXRdvrBmuBzfgIUvuk6uFeQWl1EwtIn9H0XS1c2ppUxlP8n30XR-HiGR2XNIq1xvqgOHohOh-FoLqDPmOQLHz22qlWhoh-VeIG36XiMm686g7We1VrMR34yhAOPt4JtAPatbaprQ5T61qg3QfQjtf_lxU7nZpJsyqaZbFkE7HKq6xa5tWiqCZyRfNFXXNRzkrK8zqvM1aWWbMkXs1pzyuaqBVlNMson-VFUeXVdFGxnLJ5tp-zRTPjBLNMdEzpqdbHLmJPlPe9WC3yqphNNKuF9um6J0rHNxDFm9-tov1L3bceZplWPvi7h6CCTv8Iw4pyi7t0gh2sV0EdBf74IsB3FSTqeAzYo3BJ7UwZ4Sa906tR0tI_x5TbDmgXCVy7l4OzfwgegHYpHg-0SyH9FQAA__99Ymjd">