Skip to content

Commit 86af79d

Browse files
Update CFLAGS and fix all warnings for stricter compiler flags
Co-authored-by: Michal-Pogorzelec <80826463+Michal-Pogorzelec@users.noreply.github.com>
1 parent 9b37617 commit 86af79d

4 files changed

Lines changed: 72 additions & 52 deletions

File tree

Makefile

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
CC = gcc
2-
CFLAGS = -Wall -Wextra -Werror -std=c99 -pedantic -I./include
2+
CFLAGS ?= -O2 -Iinclude -Wall -Wextra -Wpedantic -Wconversion -Wshadow \
3+
-Wcast-align -Wcast-qual -Wpointer-arith -Wformat=2 \
4+
-Wmissing-prototypes -Wstrict-prototypes -Wredundant-decls -Wundef \
5+
-std=c11
36
LDFLAGS =
47

58
SRC_DIR = src

examples/tm_example.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ int main(void) {
2121

2222
result = sdlp_tm_create_frame(&frame, spacecraft_id, virtual_channel,
2323
(const uint8_t *)telemetry_data,
24-
strlen(telemetry_data));
24+
(uint16_t)strlen(telemetry_data));
2525

2626
if (result != SDLP_SUCCESS) {
2727
printf("Error creating frame: %d\n", result);

src/sdlp_tc.c

Lines changed: 45 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,12 @@ int sdlp_tc_create_frame(sdlp_tc_frame_t *frame, uint16_t spacecraft_id,
1414
frame->header.bypass_flag = 0;
1515
frame->header.control_command_flag = 0;
1616
frame->header.reserved = 0;
17-
frame->header.spacecraft_id = spacecraft_id & 0x3FF;
18-
frame->header.virtual_channel_id = virtual_channel_id & 0x3F;
19-
frame->header.frame_length = data_length - 1;
17+
frame->header.spacecraft_id = (uint16_t)(spacecraft_id & 0x3FFU);
18+
frame->header.virtual_channel_id = (uint8_t)(virtual_channel_id & 0x3FU);
19+
#pragma GCC diagnostic push
20+
#pragma GCC diagnostic ignored "-Wconversion"
21+
frame->header.frame_length = (uint16_t)(data_length - 1U);
22+
#pragma GCC diagnostic pop
2023
frame->header.frame_sequence_number = frame_seq_num;
2124

2225
memcpy(frame->data, data, data_length);
@@ -46,29 +49,29 @@ int sdlp_tc_encode_frame(const sdlp_tc_frame_t *frame, uint8_t *buffer,
4649

4750
size_t offset = 0;
4851

49-
buffer[offset++] = (frame->header.transfer_frame_version << 6) |
50-
((frame->header.bypass_flag & 0x01) << 5) |
51-
((frame->header.control_command_flag & 0x01) << 4) |
52-
((frame->header.reserved & 0x03) << 2) |
53-
((frame->header.spacecraft_id >> 8) & 0x03);
54-
buffer[offset++] = frame->header.spacecraft_id & 0xFF;
55-
buffer[offset++] = ((frame->header.virtual_channel_id & 0x3F) << 2) | 0x00;
56-
buffer[offset++] = (frame->header.frame_length >> 8) & 0xFF;
57-
buffer[offset++] = frame->header.frame_length & 0xFF;
52+
buffer[offset++] = (uint8_t)((frame->header.transfer_frame_version << 6) |
53+
((frame->header.bypass_flag & 0x01U) << 5) |
54+
((frame->header.control_command_flag & 0x01U) << 4) |
55+
((frame->header.reserved & 0x03U) << 2) |
56+
((frame->header.spacecraft_id >> 8) & 0x03U));
57+
buffer[offset++] = (uint8_t)(frame->header.spacecraft_id & 0xFFU);
58+
buffer[offset++] = (uint8_t)(((frame->header.virtual_channel_id & 0x3FU) << 2) | 0x00U);
59+
buffer[offset++] = (uint8_t)((frame->header.frame_length >> 8) & 0xFFU);
60+
buffer[offset++] = (uint8_t)(frame->header.frame_length & 0xFFU);
5861

5962
#ifdef TC_SEGMENT_HEADER_ENABLED
6063
if (!frame->header.control_command_flag) {
61-
buffer[offset++] = ((frame->segment_header.sequence_flags & 0x03) << 6) |
62-
(frame->segment_header.map_id & 0x3F);
64+
buffer[offset++] = (uint8_t)(((frame->segment_header.sequence_flags & 0x03U) << 6) |
65+
(frame->segment_header.map_id & 0x3FU));
6366
}
6467
#endif
6568

6669
memcpy(&buffer[offset], frame->data, frame->data_length);
6770
offset += frame->data_length;
6871

6972
uint16_t crc = sdlp_crc16(buffer, offset);
70-
buffer[offset++] = (crc >> 8) & 0xFF;
71-
buffer[offset++] = crc & 0xFF;
73+
buffer[offset++] = (uint8_t)((crc >> 8) & 0xFFU);
74+
buffer[offset++] = (uint8_t)(crc & 0xFFU);
7275

7376
*encoded_size = offset;
7477

@@ -85,34 +88,41 @@ int sdlp_tc_decode_frame(const uint8_t *buffer, size_t buffer_size,
8588

8689
size_t offset = 0;
8790

88-
frame->header.transfer_frame_version = (buffer[offset] >> 6) & 0x03;
89-
frame->header.bypass_flag = (buffer[offset] >> 5) & 0x01;
90-
frame->header.control_command_flag = (buffer[offset] >> 4) & 0x01;
91-
frame->header.reserved = (buffer[offset] >> 2) & 0x03;
92-
frame->header.spacecraft_id = ((buffer[offset] & 0x03) << 8) | buffer[offset + 1];
91+
/* Suppress -Wconversion: assigning masked values to bitfields is intentional. */
92+
#pragma GCC diagnostic push
93+
#pragma GCC diagnostic ignored "-Wconversion"
94+
frame->header.transfer_frame_version = (uint8_t)((buffer[offset] >> 6) & 0x03U);
95+
frame->header.bypass_flag = (uint8_t)((buffer[offset] >> 5) & 0x01U);
96+
frame->header.control_command_flag = (uint8_t)((buffer[offset] >> 4) & 0x01U);
97+
frame->header.reserved = (uint8_t)((buffer[offset] >> 2) & 0x03U);
98+
frame->header.spacecraft_id = (uint16_t)(((uint16_t)(buffer[offset] & 0x03U) << 8) | buffer[offset + 1]);
9399
offset += 2;
94100

95-
frame->header.virtual_channel_id = (buffer[offset] >> 2) & 0x3F;
101+
frame->header.virtual_channel_id = (uint8_t)((buffer[offset] >> 2) & 0x3FU);
96102
offset++;
97103

98-
frame->header.frame_length = (buffer[offset] << 8) | buffer[offset + 1];
104+
frame->header.frame_length = (uint16_t)(((uint16_t)buffer[offset] << 8) | buffer[offset + 1]);
105+
#pragma GCC diagnostic pop
99106
offset += 2;
100107

101108
#ifdef TC_SEGMENT_HEADER_ENABLED
102109
if (!frame->header.control_command_flag) {
103110
if (buffer_size < TC_PRIMARY_HEADER_SIZE + TC_SEGMENT_HEADER_SIZE + TC_FRAME_ERROR_CONTROL_SIZE) {
104111
return SDLP_ERROR_INVALID_FRAME;
105112
}
106-
frame->segment_header.sequence_flags = (buffer[offset] >> 6) & 0x03;
107-
frame->segment_header.map_id = buffer[offset] & 0x3F;
113+
#pragma GCC diagnostic push
114+
#pragma GCC diagnostic ignored "-Wconversion"
115+
frame->segment_header.sequence_flags = (uint8_t)((buffer[offset] >> 6) & 0x03U);
116+
frame->segment_header.map_id = (uint8_t)(buffer[offset] & 0x3FU);
117+
#pragma GCC diagnostic pop
108118
offset++;
109-
frame->data_length = buffer_size - TC_PRIMARY_HEADER_SIZE - TC_SEGMENT_HEADER_SIZE -
110-
TC_FRAME_ERROR_CONTROL_SIZE;
119+
frame->data_length = (uint16_t)(buffer_size - TC_PRIMARY_HEADER_SIZE - TC_SEGMENT_HEADER_SIZE -
120+
TC_FRAME_ERROR_CONTROL_SIZE);
111121
} else {
112-
frame->data_length = buffer_size - TC_PRIMARY_HEADER_SIZE - TC_FRAME_ERROR_CONTROL_SIZE;
122+
frame->data_length = (uint16_t)(buffer_size - TC_PRIMARY_HEADER_SIZE - TC_FRAME_ERROR_CONTROL_SIZE);
113123
}
114124
#else
115-
frame->data_length = buffer_size - TC_PRIMARY_HEADER_SIZE - TC_FRAME_ERROR_CONTROL_SIZE;
125+
frame->data_length = (uint16_t)(buffer_size - TC_PRIMARY_HEADER_SIZE - TC_FRAME_ERROR_CONTROL_SIZE);
116126
#endif
117127

118128
if (frame->data_length > TC_MAX_DATA_SIZE) {
@@ -122,7 +132,7 @@ int sdlp_tc_decode_frame(const uint8_t *buffer, size_t buffer_size,
122132
memcpy(frame->data, &buffer[offset], frame->data_length);
123133
offset += frame->data_length;
124134

125-
frame->fecf = (buffer[offset] << 8) | buffer[offset + 1];
135+
frame->fecf = (uint16_t)(((uint16_t)buffer[offset] << 8) | buffer[offset + 1]);
126136

127137
uint16_t calculated_crc = sdlp_crc16(buffer, buffer_size - TC_FRAME_ERROR_CONTROL_SIZE);
128138

@@ -138,8 +148,11 @@ int sdlp_tc_set_segment_header(sdlp_tc_frame_t *frame, sdlp_tc_seq_flag_t sequen
138148
if (!frame) {
139149
return SDLP_ERROR_INVALID_PARAM;
140150
}
141-
frame->segment_header.sequence_flags = sequence_flags & 0x03;
142-
frame->segment_header.map_id = map_id & 0x3F;
151+
#pragma GCC diagnostic push
152+
#pragma GCC diagnostic ignored "-Wconversion"
153+
frame->segment_header.sequence_flags = (uint8_t)(sequence_flags & 0x03U);
154+
frame->segment_header.map_id = (uint8_t)(map_id & 0x3FU);
155+
#pragma GCC diagnostic pop
143156
return SDLP_SUCCESS;
144157
}
145158
#endif

src/sdlp_tm.c

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ int sdlp_tm_create_frame(sdlp_tm_frame_t *frame, uint16_t spacecraft_id,
1414
memset(frame, 0, sizeof(sdlp_tm_frame_t));
1515

1616
frame->header.transfer_frame_version = SDLP_VERSION;
17-
frame->header.spacecraft_id = spacecraft_id & 0x3FF;
18-
frame->header.virtual_channel_id = virtual_channel_id & 0x07;
17+
frame->header.spacecraft_id = (uint16_t)(spacecraft_id & 0x3FFU);
18+
frame->header.virtual_channel_id = (uint8_t)(virtual_channel_id & 0x07U);
1919
frame->header.ocf_flag = 0;
2020
frame->header.master_channel_frame_count = tm_frame_counter++;
2121
frame->header.virtual_channel_frame_count = 0;
@@ -42,24 +42,24 @@ int sdlp_tm_encode_frame(const sdlp_tm_frame_t *frame, uint8_t *buffer,
4242

4343
size_t offset = 0;
4444

45-
buffer[offset++] = (frame->header.transfer_frame_version << 6) |
46-
((frame->header.spacecraft_id >> 4) & 0x3F);
47-
buffer[offset++] = ((frame->header.spacecraft_id & 0x0F) << 4) |
48-
((frame->header.virtual_channel_id & 0x07) << 1) |
49-
(frame->header.ocf_flag & 0x01);
45+
buffer[offset++] = (uint8_t)((frame->header.transfer_frame_version << 6) |
46+
((frame->header.spacecraft_id >> 4) & 0x3FU));
47+
buffer[offset++] = (uint8_t)(((frame->header.spacecraft_id & 0x0FU) << 4) |
48+
((frame->header.virtual_channel_id & 0x07U) << 1) |
49+
(frame->header.ocf_flag & 0x01U));
5050
buffer[offset++] = frame->header.master_channel_frame_count;
5151
buffer[offset++] = frame->header.virtual_channel_frame_count;
5252

5353
uint16_t data_field_status = frame->header.transfer_frame_data_field_status;
54-
buffer[offset++] = (data_field_status >> 8) & 0xFF;
55-
buffer[offset++] = data_field_status & 0xFF;
54+
buffer[offset++] = (uint8_t)((data_field_status >> 8) & 0xFFU);
55+
buffer[offset++] = (uint8_t)(data_field_status & 0xFFU);
5656

5757
memcpy(&buffer[offset], frame->data, frame->data_length);
5858
offset += frame->data_length;
5959

6060
uint16_t crc = sdlp_crc16(buffer, offset);
61-
buffer[offset++] = (crc >> 8) & 0xFF;
62-
buffer[offset++] = crc & 0xFF;
61+
buffer[offset++] = (uint8_t)((crc >> 8) & 0xFFU);
62+
buffer[offset++] = (uint8_t)(crc & 0xFFU);
6363

6464
*encoded_size = offset;
6565

@@ -76,22 +76,26 @@ int sdlp_tm_decode_frame(const uint8_t *buffer, size_t buffer_size,
7676

7777
size_t offset = 0;
7878

79-
frame->header.transfer_frame_version = (buffer[offset] >> 6) & 0x03;
80-
frame->header.spacecraft_id = ((buffer[offset] & 0x3F) << 4) | ((buffer[offset + 1] >> 4) & 0x0F);
79+
/* Suppress -Wconversion: assigning masked values to bitfields is intentional. */
80+
#pragma GCC diagnostic push
81+
#pragma GCC diagnostic ignored "-Wconversion"
82+
frame->header.transfer_frame_version = (uint8_t)((buffer[offset] >> 6) & 0x03U);
83+
frame->header.spacecraft_id = (uint16_t)(((buffer[offset] & 0x3FU) << 4) | ((buffer[offset + 1] >> 4) & 0x0FU));
8184
offset++;
8285

83-
frame->header.virtual_channel_id = (buffer[offset] >> 1) & 0x07;
84-
frame->header.ocf_flag = buffer[offset] & 0x01;
86+
frame->header.virtual_channel_id = (uint8_t)((buffer[offset] >> 1) & 0x07U);
87+
frame->header.ocf_flag = (uint8_t)(buffer[offset] & 0x01U);
88+
#pragma GCC diagnostic pop
8589
offset++;
8690

8791
frame->header.master_channel_frame_count = buffer[offset++];
8892
frame->header.virtual_channel_frame_count = buffer[offset++];
8993

90-
uint16_t data_field_status = (buffer[offset] << 8) | buffer[offset + 1];
94+
uint16_t data_field_status = (uint16_t)(((uint16_t)buffer[offset] << 8) | buffer[offset + 1]);
9195
frame->header.transfer_frame_data_field_status = data_field_status;
9296
offset += 2;
9397

94-
frame->data_length = buffer_size - TM_PRIMARY_HEADER_SIZE - TM_FRAME_ERROR_CONTROL_SIZE;
98+
frame->data_length = (uint16_t)(buffer_size - TM_PRIMARY_HEADER_SIZE - TM_FRAME_ERROR_CONTROL_SIZE);
9599

96100
if (frame->data_length > TM_MAX_DATA_SIZE) {
97101
return SDLP_ERROR_INVALID_FRAME;
@@ -100,7 +104,7 @@ int sdlp_tm_decode_frame(const uint8_t *buffer, size_t buffer_size,
100104
memcpy(frame->data, &buffer[offset], frame->data_length);
101105
offset += frame->data_length;
102106

103-
frame->fecf = (buffer[offset] << 8) | buffer[offset + 1];
107+
frame->fecf = (uint16_t)(((uint16_t)buffer[offset] << 8) | buffer[offset + 1]);
104108

105109
uint16_t calculated_crc = sdlp_crc16(buffer, buffer_size - TM_FRAME_ERROR_CONTROL_SIZE);
106110

0 commit comments

Comments
 (0)