forked from Archive/PX4-Autopilot
uorb: enure message definitions don't exceed buffer lengths & increase test buffer
There were already checks at runtime, but this ensures the format is not too long at built-time.
This commit is contained in:
parent
df46ad7774
commit
c5101c70b3
|
@ -146,6 +146,7 @@ def write_fields_to_hpp_file(file_name: str, definitions: dict, window_length: i
|
||||||
format_list: [str]):
|
format_list: [str]):
|
||||||
max_tokenized_field_length, max_tokenized_field_length_msg = max(
|
max_tokenized_field_length, max_tokenized_field_length_msg = max(
|
||||||
((len(definitions[k]['fields']), k) for k in definitions), key=itemgetter(0))
|
((len(definitions[k]['fields']), k) for k in definitions), key=itemgetter(0))
|
||||||
|
max_untokenized_field_length = max(definitions[k]['fields_total_length'] for k in definitions)
|
||||||
max_num_orb_ids = max(len(definitions[k]['orb_ids']) for k in definitions)
|
max_num_orb_ids = max(len(definitions[k]['orb_ids']) for k in definitions)
|
||||||
max_num_orb_id_dependencies = max(len(definitions[k]['dependencies']) for k in definitions)
|
max_num_orb_id_dependencies = max(len(definitions[k]['dependencies']) for k in definitions)
|
||||||
|
|
||||||
|
@ -167,6 +168,7 @@ const uint8_t* orb_compressed_message_formats();
|
||||||
unsigned orb_compressed_message_formats_size();
|
unsigned orb_compressed_message_formats_size();
|
||||||
|
|
||||||
static constexpr unsigned orb_tokenized_fields_max_length = {MAX_TOKENIZED_FIELD_LENGTH}; // {MAX_TOKENIZED_FIELD_LENGTH_MSG}
|
static constexpr unsigned orb_tokenized_fields_max_length = {MAX_TOKENIZED_FIELD_LENGTH}; // {MAX_TOKENIZED_FIELD_LENGTH_MSG}
|
||||||
|
static constexpr unsigned orb_untokenized_fields_max_length = {MAX_UNTOKENIZED_FIELD_LENGTH};
|
||||||
static constexpr unsigned orb_compressed_max_num_orb_ids = {MAX_NUM_ORB_IDS};
|
static constexpr unsigned orb_compressed_max_num_orb_ids = {MAX_NUM_ORB_IDS};
|
||||||
static constexpr unsigned orb_compressed_max_num_orb_id_dependencies = {MAX_NUM_ORB_ID_DEPENDENCIES};
|
static constexpr unsigned orb_compressed_max_num_orb_id_dependencies = {MAX_NUM_ORB_ID_DEPENDENCIES};
|
||||||
|
|
||||||
|
@ -179,6 +181,7 @@ static constexpr unsigned orb_compressed_heatshrink_lookahead_length = {LOOKAHEA
|
||||||
'''
|
'''
|
||||||
.replace('{MAX_TOKENIZED_FIELD_LENGTH}', str(max_tokenized_field_length))
|
.replace('{MAX_TOKENIZED_FIELD_LENGTH}', str(max_tokenized_field_length))
|
||||||
.replace('{MAX_TOKENIZED_FIELD_LENGTH_MSG}', max_tokenized_field_length_msg)
|
.replace('{MAX_TOKENIZED_FIELD_LENGTH_MSG}', max_tokenized_field_length_msg)
|
||||||
|
.replace('{MAX_UNTOKENIZED_FIELD_LENGTH}', str(max_untokenized_field_length))
|
||||||
.replace('{MAX_NUM_ORB_IDS}', str(max_num_orb_ids))
|
.replace('{MAX_NUM_ORB_IDS}', str(max_num_orb_ids))
|
||||||
.replace('{MAX_NUM_ORB_ID_DEPENDENCIES}', str(max_num_orb_id_dependencies))
|
.replace('{MAX_NUM_ORB_ID_DEPENDENCIES}', str(max_num_orb_id_dependencies))
|
||||||
.replace('{WINDOW_LENGTH}', str(window_length))
|
.replace('{WINDOW_LENGTH}', str(window_length))
|
||||||
|
|
|
@ -42,6 +42,7 @@ for field in spec.parsed_fields():
|
||||||
{
|
{
|
||||||
@# join all msg files in one line e.g: "float[3] position;float[3] velocity;bool armed;"
|
@# join all msg files in one line e.g: "float[3] position;float[3] velocity;bool armed;"
|
||||||
"fields": @( json.dumps(bytearray(";".join(topic_fields)+";", 'utf-8').decode('unicode_escape')) ),
|
"fields": @( json.dumps(bytearray(";".join(topic_fields)+";", 'utf-8').decode('unicode_escape')) ),
|
||||||
|
"fields_total_length": @(sum([len(convert_type(field.type))+1+len(field.name)+1 for field in sorted_fields])),
|
||||||
"orb_ids": @( json.dumps([ all_topics.index(topic) for topic in topics]) ),
|
"orb_ids": @( json.dumps([ all_topics.index(topic) for topic in topics]) ),
|
||||||
"main_orb_id": @( all_topics.index(name_snake_case) if name_snake_case in all_topics else -1 ),
|
"main_orb_id": @( all_topics.index(name_snake_case) if name_snake_case in all_topics else -1 ),
|
||||||
"dependencies": @( json.dumps(list(set(dependencies))) ),
|
"dependencies": @( json.dumps(list(set(dependencies))) ),
|
||||||
|
|
|
@ -53,7 +53,10 @@ public:
|
||||||
|
|
||||||
TEST_F(uORBMessageFieldsTest, decompressed_formats_match)
|
TEST_F(uORBMessageFieldsTest, decompressed_formats_match)
|
||||||
{
|
{
|
||||||
char buffer[1500];
|
char buffer[1600];
|
||||||
|
static_assert(uORB::orb_untokenized_fields_max_length < sizeof(buffer) - HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(_),
|
||||||
|
"msg definition too long / buffer too short");
|
||||||
|
|
||||||
uORB::MessageFormatReader format_reader(buffer, sizeof(buffer));
|
uORB::MessageFormatReader format_reader(buffer, sizeof(buffer));
|
||||||
|
|
||||||
px4::Bitset<ORB_TOPICS_COUNT> formats_found;
|
px4::Bitset<ORB_TOPICS_COUNT> formats_found;
|
||||||
|
|
|
@ -69,6 +69,10 @@
|
||||||
|
|
||||||
//#define DBGPRINT //write status output every few seconds
|
//#define DBGPRINT //write status output every few seconds
|
||||||
|
|
||||||
|
static_assert(uORB::orb_untokenized_fields_max_length < sizeof(ulog_message_format_s::format) -
|
||||||
|
HEATSHRINK_DECODER_INPUT_BUFFER_SIZE(_),
|
||||||
|
"msg definition too long / buffer too short");
|
||||||
|
|
||||||
#if defined(DBGPRINT)
|
#if defined(DBGPRINT)
|
||||||
// needed for mallinfo
|
// needed for mallinfo
|
||||||
#if defined(__PX4_POSIX) && !defined(__PX4_DARWIN)
|
#if defined(__PX4_POSIX) && !defined(__PX4_DARWIN)
|
||||||
|
|
Loading…
Reference in New Issue