Tighten valptridx::ptridx range checking for pointer_type constructor
Previously, the supplied pointer was converted to an array index, then passed to valptridx::idx for validation. If the index_type is smaller than std::size_t, this would truncate the value before validation. Certain out-of-range indexes would be in-range after truncation, and incorrectly not be reported. Reorder the check to validate the index against the array size before truncation.
This commit is contained in:
parent
67705bdd7a
commit
e154d37e5e
|
@ -409,6 +409,10 @@ protected:
|
|||
m_idx(i)
|
||||
{
|
||||
}
|
||||
idx(DXX_VALPTRIDX_REPORT_STANDARD_LEADER_COMMA_R_DEFN_VARS typename policy::pointer_type p, array_managed_type &a) :
|
||||
m_idx(check_index_range_size<index_range_error_type<array_managed_type>>(DXX_VALPTRIDX_REPORT_STANDARD_LEADER_COMMA_R_PASS_VARS p - &a.front(), &a))
|
||||
{
|
||||
}
|
||||
public:
|
||||
template <integral_type v>
|
||||
constexpr idx(const magic_constant<v> &) :
|
||||
|
@ -769,7 +773,7 @@ public:
|
|||
* vptr_type to avoid checking again.
|
||||
*/
|
||||
vptr_type(DXX_VALPTRIDX_REPORT_STANDARD_LEADER_COMMA_R_PASS_VARS (check_null_pointer<null_pointer_error_type<array_managed_type>>(DXX_VALPTRIDX_REPORT_STANDARD_LEADER_COMMA_R_PASS_VARS p, a), *p), a),
|
||||
vidx_type(DXX_VALPTRIDX_REPORT_STANDARD_LEADER_COMMA_R_PASS_VARS p - static_cast<pointer_type>(&a.front()), a)
|
||||
vidx_type(DXX_VALPTRIDX_REPORT_STANDARD_LEADER_COMMA_R_PASS_VARS p, a)
|
||||
{
|
||||
}
|
||||
ptridx(DXX_VALPTRIDX_REPORT_STANDARD_LEADER_COMMA_R_DEFN_VARS pointer_type p, index_type i, array_managed_type &a) :
|
||||
|
|
Loading…
Reference in a new issue