<table border="1" cellspacing="0" cellpadding="8">
<tr>
<th>Issue</th>
<td>
<a href=https://github.com/llvm/llvm-project/issues/61910>61910</a>
</td>
</tr>
<tr>
<th>Summary</th>
<td>
bugprone-unchecked-optional-access yields false-positives involving ternary operator and pointer or iterator
</td>
</tr>
<tr>
<th>Labels</th>
<td>
new issue
</td>
</tr>
<tr>
<th>Assignees</th>
<td>
</td>
</tr>
<tr>
<th>Reporter</th>
<td>
sapi33
</td>
</tr>
</table>
<pre>
We encountered false-positive warnings of the check bugprone-unchecked-optional-access involving a ternary operator and an access either via a (shared) pointer or an iterator.
The following example demonstrates these cases, it is also available here: https://godbolt.org/z/4zo3xn6Tx
```c++
#include <iterator>
#include <list>
#include <memory>
#include <optional>
struct A
{
A(const unsigned int p_value) :
m_value(p_value)
{}
const std::optional<unsigned int> m_value;
};
int main()
{
const A a1(1U);
// correctly identified as checked access
const unsigned int value1 = a1.m_value.has_value() ? a1.m_value.value() : 0U;
const std::shared_ptr<A> a2 = std::make_shared<A>(2U);
// wrongly identified as unchecked access
const unsigned int value2 = a2 && a2->m_value.has_value() ? a2->m_value.value() : 0U;
const std::list<A> a3{ A(3U) };
const std::list<A>::const_iterator itA3 = a3.begin();
// wrongly identified as unchecked access
const unsigned int value3 = itA3 != a3.end() && itA3->m_value.has_value() ? itA3->m_value.value() : 0U;
return EXIT_SUCCESS;
}
```
The warnings are:
```
<source>:23:65: warning: unchecked access to optional value [bugprone-unchecked-optional-access]]
const unsigned int value2 = a2 && a2->m_value.has_value() ? a2->m_value.value() : 0U;
^
<source>:28:81: warning: unchecked access to optional value [bugprone-unchecked-optional-access]
const unsigned int value3 = itA3 != a3.end() && itA3->m_value.has_value() ? itA3->m_value.value() : 0U;
^
```
</pre>
<img width="1px" height="1px" alt="" src="http://email.email.llvm.org/o/eJzMVk2PozgQ_TXOpZQI7CRNDhzofEh77m7t3iIDRfCOsZFt0p359StjyNemZ1orjXYk5CBXueq9l3JR3FpxUIgpWTyTxWbCO1drk1reCsYmuS5P6Z8IqArdKYcGS6i4tDhttRVOHBHeuVFCHSzoClyNUNRYfIO8O7RGK5x2qt_AcqpbJ7TicsqLAq0FoY5aHoU6AAeHRnFzAt2i4U4b4KoErmBwReFqNHAUHDgQmtiaGywJXUGrhYcF_REQLhyfkWhDouy1Rqi0lPrdZ8EP3rQSocRGK-sMd2g9YotQcIuW0DUIB8ICl1YDP3IheS4RajRIWAa1c60lLCN0R-juoMtcSzfT5kDo7juhu_l3zT7U8vUjZB_WZRSegtBn_4RdyoQqZFciELYeYRO2fWSWwrpPTA022pw-MY6CX8z9ap3pCgcjvqcBEgBARmhSeHGgU31ZlCCUg3Z_5LJDr7enH9ybcTO5mC-RfNinzXVavxtiW1f6MCy7AFxf5yNse47ORsGeNpf3fvXAGi4Uock58w2ZkCwDHhOaxG_eiV2Zw78IhTYGCydPIEpUTlQCS-AWhqodKvA-6o08PdIYCNsAj2cD8lnN7VmhoNzu2nxryiB6u-P3QK9Q9vvWGcLWmZeJ0z7t2aPh33A_3I7gQmhCP-P-brQ6_Iv5-cZ-mXsA4bHQJaFL4HRK2PaHQtx4_BctwqUYVGDk6bkvXvbWx7gqlh8fDRu9fT_eQhAuY4ERm-V4OJfYL1Qw5AuJaTzkRlWOogRdvf1nyt77fElbg64zCrZ__fG6f3lbr7cvLzc377aTXZrruffzvkM-9CNsbXVnCgxyU0ZYtlx4KMNp_3qvGDgNY3cICgFZPP_8o0IWG__8nxULZLF9zDwhLEviX8g85P-tauxKjbEsJmXKyhVb8Qmm8TKJFnGyosmkTgvGqyReVXEVUVqUCZvPK7aInuK8wlVVJBOR0oiyaB6xOJon82SW5AxpjDhnbMmWPCbzCBsu5EzKY-O_zBNhbYfpMl7F0UTyHKXtBx1KFb5DbySU-rnHpP7MNO8Olswj3yLsJYoTTmL6hZnmJFCW9m5Euh51Hg46V0PM2IQmnZHp3cAhXN3ls0I3hO48tOFn2hr9NxaO0F1PyBK66wn_EwAA___Rh_8U">