История изменений
Исправление
kvpfs,
(текущая версия)
:
struct Column_properties
{
color_e clr; // enum
alignment_e alignment; // enum
cursor_pos_t cursor_pos; // typedef
};
template <std::size_t column_number>
bool Highlevel_rendering<column_number>::f_draw_body()
{
...
int beg_col = m_context->m_draw_start.m_column;
int end_col = m_render->f_calc_end_column(
m_context->m_draw_start.m_column, m_row_image);
...
std::array<Column_properties, column_number> props;
auto set_props = [this, &props, beg_col, end_col](ssize_t i) {
bool selected = m_context->m_selected.contains(i);
for (ssize_t ppos = beg_col; ppos < end_col; ++ppos) {
bool cursor_field = i == m_context->m_pointer_pos.m_row &&
ppos == m_context->m_pointer_pos.m_column;
if (selected) {
if (cursor_field)
props[ppos].clr = e_text_select_cusor;
else
props[ppos].clr = e_text_select;
}
else if (cursor_field)
props[ppos].clr = e_text_cusor;
else
props[ppos].clr = e_text;
props[ppos].alignment = m_alignment;
props[ppos].cursor_pos =
(m_cursor_loc == cursor_location_e::active_field && cursor_field)
? m_cursor_pos : no_cursor_pos;
}
};
for (ssize_t i = m_context->m_draw_start.m_row;
i != end_row; i += add) {
...
set_props(i);
...
}
...
}
Я через PVS не смотрел, может он чего бы и нашёл. На мой взгляд пожаловаться можно на то что дефолтно инициализированный props из trivial constructable типа получает значение в цикле for (ssize_t ppos = beg_col; ppos < end_col; ++ppos), в котором beg_col и end_col приходят из рантайма, т.е. не проверишь границы.
Исходная версия
kvpfs,
:
struct Column_properties
{
color_e clr; // enum
alignment_e alignment; // enum
cursor_pos_t cursor_pos; // typedef
};
template <std::size_t column_number>
bool Highlevel_rendering<column_number>::f_draw_body()
{
...
int beg_col = m_context->m_draw_start.m_column;
int end_col = m_render->f_calc_end_column(
m_context->m_draw_start.m_column, m_row_image);
...
std::array<Column_properties, column_number> props;
auto set_props = [this, &props, beg_col, end_col](ssize_t i) {
bool selected = m_context->m_selected.contains(i);
for (ssize_t ppos = beg_col; ppos < end_col; ++ppos) {
bool cursor_field = i == m_context->m_pointer_pos.m_row &&
ppos == m_context->m_pointer_pos.m_column;
if (selected) {
if (cursor_field)
props[ppos].clr = e_text_select_cusor;
else
props[ppos].clr = e_text_select;
}
else if (cursor_field)
props[ppos].clr = e_text_cusor;
else
props[ppos].clr = e_text;
props[ppos].alignment = m_alignment;
props[ppos].cursor_pos =
(m_cursor_loc == cursor_location_e::active_field && cursor_field)
? m_cursor_pos : no_cursor_pos;
}
};
for (ssize_t i = m_context->m_draw_start.m_row;
i != end_row; i += add) {
...
set_props(i);
...
}
...
}
Я через PVS не смотрел, может он чего бы и нашёл. На мой взгляд пожаловаться можно на то что дефолтно инициализированный props из default constructable типа получает значение в цикле for (ssize_t ppos = beg_col; ppos < end_col; ++ppos), в котором beg_col и end_col приходят из рантайма, т.е. не проверишь границы.