LINUX.ORG.RU

История изменений

Исправление 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 приходят из рантайма, т.е. не проверишь границы.