Code cleanup: srand, PVS warnings (#1974)

* Remove srand invocation

* PVS High priority fixes

* PVS High errors part 2

* Furi: heap tracing inheritance

* Furi add __builtin_unreachable to furi_thread_catch
This commit is contained in:
あく 2022-11-06 00:07:24 +09:00 committed by GitHub
parent 04e50c9f89
commit e8913f2e33
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
37 changed files with 76 additions and 85 deletions

View file

@ -338,10 +338,6 @@ static int32_t
furi_hal_hid_kb_release(key); furi_hal_hid_kb_release(key);
return (0); return (0);
} }
if(error != NULL) {
strncpy(error, "Unknown error", error_len);
}
return SCRIPT_STATE_ERROR;
} }
static bool ducky_set_usb_id(BadUsbScript* bad_usb, const char* line) { static bool ducky_set_usb_id(BadUsbScript* bad_usb, const char* line) {
@ -656,7 +652,7 @@ static int32_t bad_usb_worker(void* context) {
BadUsbScript* bad_usb_script_open(FuriString* file_path) { BadUsbScript* bad_usb_script_open(FuriString* file_path) {
furi_assert(file_path); furi_assert(file_path);
BadUsbScript* bad_usb = malloc(sizeof(BadUsbScript)); BadUsbScript* bad_usb = malloc(sizeof(BadUsbScript)); //-V773
bad_usb->file_path = furi_string_alloc(); bad_usb->file_path = furi_string_alloc();
furi_string_set(bad_usb->file_path, file_path); furi_string_set(bad_usb->file_path, file_path);

View file

@ -155,7 +155,7 @@ static bool fap_loader_select_app(FapLoader* loader) {
} }
static FapLoader* fap_loader_alloc(const char* path) { static FapLoader* fap_loader_alloc(const char* path) {
FapLoader* loader = malloc(sizeof(FapLoader)); FapLoader* loader = malloc(sizeof(FapLoader)); //-V773
loader->fap_path = furi_string_alloc_set(path); loader->fap_path = furi_string_alloc_set(path);
loader->storage = furi_record_open(RECORD_STORAGE); loader->storage = furi_record_open(RECORD_STORAGE);
loader->dialogs = furi_record_open(RECORD_DIALOGS); loader->dialogs = furi_record_open(RECORD_DIALOGS);

View file

@ -184,7 +184,7 @@ static int32_t usb_uart_worker(void* context) {
while(1) { while(1) {
uint32_t events = uint32_t events =
furi_thread_flags_wait(WORKER_ALL_RX_EVENTS, FuriFlagWaitAny, FuriWaitForever); furi_thread_flags_wait(WORKER_ALL_RX_EVENTS, FuriFlagWaitAny, FuriWaitForever);
furi_check((events & FuriFlagError) == 0); furi_check(!(events & FuriFlagError));
if(events & WorkerEvtStop) break; if(events & WorkerEvtStop) break;
if(events & WorkerEvtRxDone) { if(events & WorkerEvtRxDone) {
size_t len = furi_stream_buffer_receive( size_t len = furi_stream_buffer_receive(
@ -288,7 +288,7 @@ static int32_t usb_uart_tx_thread(void* context) {
while(1) { while(1) {
uint32_t events = uint32_t events =
furi_thread_flags_wait(WORKER_ALL_TX_EVENTS, FuriFlagWaitAny, FuriWaitForever); furi_thread_flags_wait(WORKER_ALL_TX_EVENTS, FuriFlagWaitAny, FuriWaitForever);
furi_check((events & FuriFlagError) == 0); furi_check(!(events & FuriFlagError));
if(events & WorkerEvtTxStop) break; if(events & WorkerEvtTxStop) break;
if(events & WorkerEvtCdcRx) { if(events & WorkerEvtCdcRx) {
furi_check(furi_mutex_acquire(usb_uart->usb_mutex, FuriWaitForever) == FuriStatusOk); furi_check(furi_mutex_acquire(usb_uart->usb_mutex, FuriWaitForever) == FuriStatusOk);

View file

@ -32,7 +32,7 @@ static void rpc_command_callback(RpcAppSystemEvent rpc_event, void* context) {
} }
static LfRfid* lfrfid_alloc() { static LfRfid* lfrfid_alloc() {
LfRfid* lfrfid = malloc(sizeof(LfRfid)); LfRfid* lfrfid = malloc(sizeof(LfRfid)); //-V773
lfrfid->storage = furi_record_open(RECORD_STORAGE); lfrfid->storage = furi_record_open(RECORD_STORAGE);
lfrfid->dialogs = furi_record_open(RECORD_DIALOGS); lfrfid->dialogs = furi_record_open(RECORD_DIALOGS);

View file

@ -24,7 +24,7 @@ void nfc_scene_mf_classic_read_success_on_enter(void* context) {
widget_add_button_element( widget_add_button_element(
widget, GuiButtonTypeRight, "More", nfc_scene_mf_classic_read_success_widget_callback, nfc); widget, GuiButtonTypeRight, "More", nfc_scene_mf_classic_read_success_widget_callback, nfc);
FuriString* temp_str; FuriString* temp_str = NULL;
if(furi_string_size(nfc->dev->dev_data.parsed_data)) { if(furi_string_size(nfc->dev->dev_data.parsed_data)) {
temp_str = furi_string_alloc_set(nfc->dev->dev_data.parsed_data); temp_str = furi_string_alloc_set(nfc->dev->dev_data.parsed_data);
} else { } else {

View file

@ -31,7 +31,7 @@ void nfc_scene_mf_ultralight_read_success_on_enter(void* context) {
nfc_scene_mf_ultralight_read_success_widget_callback, nfc_scene_mf_ultralight_read_success_widget_callback,
nfc); nfc);
FuriString* temp_str; FuriString* temp_str = NULL;
if(furi_string_size(nfc->dev->dev_data.parsed_data)) { if(furi_string_size(nfc->dev->dev_data.parsed_data)) {
temp_str = furi_string_alloc_set(nfc->dev->dev_data.parsed_data); temp_str = furi_string_alloc_set(nfc->dev->dev_data.parsed_data);
} else { } else {

View file

@ -513,12 +513,6 @@ bool subghz_path_is_file(FuriString* path) {
} }
uint32_t subghz_random_serial(void) { uint32_t subghz_random_serial(void) {
static bool rand_generator_inited = false;
if(!rand_generator_inited) {
srand(DWT->CYCCNT);
rand_generator_inited = true;
}
return (uint32_t)rand(); return (uint32_t)rand();
} }

View file

@ -203,7 +203,7 @@ static int32_t u2f_hid_worker(void* context) {
WorkerEvtStop | WorkerEvtConnect | WorkerEvtDisconnect | WorkerEvtRequest, WorkerEvtStop | WorkerEvtConnect | WorkerEvtDisconnect | WorkerEvtRequest,
FuriFlagWaitAny, FuriFlagWaitAny,
FuriWaitForever); FuriWaitForever);
furi_check((flags & FuriFlagError) == 0); furi_check(!(flags & FuriFlagError));
if(flags & WorkerEvtStop) break; if(flags & WorkerEvtStop) break;
if(flags & WorkerEvtConnect) { if(flags & WorkerEvtConnect) {
u2f_set_state(u2f_hid->u2f_instance, 1); u2f_set_state(u2f_hid->u2f_instance, 1);

View file

@ -318,7 +318,6 @@ static void
int32_t snake_game_app(void* p) { int32_t snake_game_app(void* p) {
UNUSED(p); UNUSED(p);
srand(DWT->CYCCNT);
FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(SnakeEvent)); FuriMessageQueue* event_queue = furi_message_queue_alloc(8, sizeof(SnakeEvent));

View file

@ -200,7 +200,6 @@ void ws_protocol_decoder_ambient_weather_feed(void* context, bool level, uint32_
((instance->decoder.decode_data & AMBIENT_WEATHER_PACKET_HEADER_MASK) == ((instance->decoder.decode_data & AMBIENT_WEATHER_PACKET_HEADER_MASK) ==
AMBIENT_WEATHER_PACKET_HEADER_2)) { AMBIENT_WEATHER_PACKET_HEADER_2)) {
if(ws_protocol_ambient_weather_check_crc(instance)) { if(ws_protocol_ambient_weather_check_crc(instance)) {
instance->decoder.decode_data = instance->decoder.decode_data;
instance->generic.data = instance->decoder.decode_data; instance->generic.data = instance->decoder.decode_data;
instance->generic.data_count_bit = instance->generic.data_count_bit =
ws_protocol_ambient_weather_const.min_count_bit_for_found; ws_protocol_ambient_weather_const.min_count_bit_for_found;

View file

@ -61,15 +61,20 @@ static void gpio_print_pins(void) {
} }
} }
typedef enum { OK, ERR_CMD_SYNTAX, ERR_PIN, ERR_VALUE } GpioParseError; typedef enum {
GpioParseReturnOk,
GpioParseReturnCmdSyntaxError,
GpioParseReturnPinError,
GpioParseReturnValueError
} GpioParseReturn;
static GpioParseError gpio_command_parse(FuriString* args, size_t* pin_num, uint8_t* value) { static GpioParseReturn gpio_command_parse(FuriString* args, size_t* pin_num, uint8_t* value) {
FuriString* pin_name; FuriString* pin_name;
pin_name = furi_string_alloc(); pin_name = furi_string_alloc();
size_t ws = furi_string_search_char(args, ' '); size_t ws = furi_string_search_char(args, ' ');
if(ws == FURI_STRING_FAILURE) { if(ws == FURI_STRING_FAILURE) {
return ERR_CMD_SYNTAX; return GpioParseReturnCmdSyntaxError;
} }
furi_string_set_n(pin_name, args, 0, ws); furi_string_set_n(pin_name, args, 0, ws);
@ -78,7 +83,7 @@ static GpioParseError gpio_command_parse(FuriString* args, size_t* pin_num, uint
if(!pin_name_to_int(pin_name, pin_num)) { if(!pin_name_to_int(pin_name, pin_num)) {
furi_string_free(pin_name); furi_string_free(pin_name);
return ERR_PIN; return GpioParseReturnPinError;
} }
furi_string_free(pin_name); furi_string_free(pin_name);
@ -88,10 +93,10 @@ static GpioParseError gpio_command_parse(FuriString* args, size_t* pin_num, uint
} else if(!furi_string_cmp(args, "1")) { } else if(!furi_string_cmp(args, "1")) {
*value = 1; *value = 1;
} else { } else {
return ERR_VALUE; return GpioParseReturnValueError;
} }
return OK; return GpioParseReturnOk;
} }
void cli_command_gpio_mode(Cli* cli, FuriString* args, void* context) { void cli_command_gpio_mode(Cli* cli, FuriString* args, void* context) {
@ -101,15 +106,15 @@ void cli_command_gpio_mode(Cli* cli, FuriString* args, void* context) {
size_t num = 0; size_t num = 0;
uint8_t value = 255; uint8_t value = 255;
GpioParseError err = gpio_command_parse(args, &num, &value); GpioParseReturn err = gpio_command_parse(args, &num, &value);
if(ERR_CMD_SYNTAX == err) { if(err == GpioParseReturnCmdSyntaxError) {
cli_print_usage("gpio mode", "<pin_name> <0|1>", furi_string_get_cstr(args)); cli_print_usage("gpio mode", "<pin_name> <0|1>", furi_string_get_cstr(args));
return; return;
} else if(ERR_PIN == err) { } else if(err == GpioParseReturnPinError) {
gpio_print_pins(); gpio_print_pins();
return; return;
} else if(ERR_VALUE == err) { } else if(err == GpioParseReturnValueError) {
printf("Value is invalid. Enter 1 for input or 0 for output"); printf("Value is invalid. Enter 1 for input or 0 for output");
return; return;
} }
@ -161,15 +166,15 @@ void cli_command_gpio_set(Cli* cli, FuriString* args, void* context) {
size_t num = 0; size_t num = 0;
uint8_t value = 0; uint8_t value = 0;
GpioParseError err = gpio_command_parse(args, &num, &value); GpioParseReturn err = gpio_command_parse(args, &num, &value);
if(ERR_CMD_SYNTAX == err) { if(err == GpioParseReturnCmdSyntaxError) {
cli_print_usage("gpio set", "<pin_name> <0|1>", furi_string_get_cstr(args)); cli_print_usage("gpio set", "<pin_name> <0|1>", furi_string_get_cstr(args));
return; return;
} else if(ERR_PIN == err) { } else if(err == GpioParseReturnPinError) {
gpio_print_pins(); gpio_print_pins();
return; return;
} else if(ERR_VALUE == err) { } else if(err == GpioParseReturnValueError) {
printf("Value is invalid. Enter 1 for high or 0 for low"); printf("Value is invalid. Enter 1 for high or 0 for low");
return; return;
} }

View file

@ -103,7 +103,7 @@ static int32_t vcp_worker(void* context) {
while(1) { while(1) {
uint32_t flags = uint32_t flags =
furi_thread_flags_wait(VCP_THREAD_FLAG_ALL, FuriFlagWaitAny, FuriWaitForever); furi_thread_flags_wait(VCP_THREAD_FLAG_ALL, FuriFlagWaitAny, FuriWaitForever);
furi_assert((flags & FuriFlagError) == 0); furi_assert(!(flags & FuriFlagError));
// VCP session opened // VCP session opened
if(flags & VcpEvtConnect) { if(flags & VcpEvtConnect) {
@ -303,7 +303,7 @@ static void vcp_on_cdc_control_line(void* context, uint8_t state) {
static void vcp_on_cdc_rx(void* context) { static void vcp_on_cdc_rx(void* context) {
UNUSED(context); UNUSED(context);
uint32_t ret = furi_thread_flags_set(furi_thread_get_id(vcp->thread), VcpEvtRx); uint32_t ret = furi_thread_flags_set(furi_thread_get_id(vcp->thread), VcpEvtRx);
furi_check((ret & FuriFlagError) == 0); furi_check(!(ret & FuriFlagError));
} }
static void vcp_on_cdc_tx_complete(void* context) { static void vcp_on_cdc_tx_complete(void* context) {

View file

@ -167,7 +167,7 @@ void crypto_cli_decrypt(Cli* cli, FuriString* args) {
void crypto_cli_has_key(Cli* cli, FuriString* args) { void crypto_cli_has_key(Cli* cli, FuriString* args) {
UNUSED(cli); UNUSED(cli);
int key_slot = 0; int key_slot = 0;
uint8_t iv[16]; uint8_t iv[16] = {0};
do { do {
if(!args_read_int_and_trim(args, &key_slot) || !(key_slot > 0 && key_slot <= 100)) { if(!args_read_int_and_trim(args, &key_slot) || !(key_slot > 0 && key_slot <= 100)) {
@ -249,7 +249,7 @@ void crypto_cli_store_key(Cli* cli, FuriString* args) {
} }
if(key_slot > 0) { if(key_slot > 0) {
uint8_t iv[16]; uint8_t iv[16] = {0};
if(key_slot > 1) { if(key_slot > 1) {
if(!furi_hal_crypto_store_load_key(key_slot - 1, iv)) { if(!furi_hal_crypto_store_load_key(key_slot - 1, iv)) {
printf( printf(

View file

@ -436,7 +436,7 @@ void gui_add_framebuffer_callback(Gui* gui, GuiCanvasCommitCallback callback, vo
const CanvasCallbackPair p = {callback, context}; const CanvasCallbackPair p = {callback, context};
gui_lock(gui); gui_lock(gui);
furi_assert(CanvasCallbackPairArray_count(gui->canvas_callback_pair, p) == 0); furi_assert(!CanvasCallbackPairArray_count(gui->canvas_callback_pair, p));
CanvasCallbackPairArray_push_back(gui->canvas_callback_pair, p); CanvasCallbackPairArray_push_back(gui->canvas_callback_pair, p);
gui_unlock(gui); gui_unlock(gui);

View file

@ -359,7 +359,7 @@ static int32_t browser_worker(void* context) {
BrowserWorker* BrowserWorker*
file_browser_worker_alloc(FuriString* path, const char* filter_ext, bool skip_assets) { file_browser_worker_alloc(FuriString* path, const char* filter_ext, bool skip_assets) {
BrowserWorker* browser = malloc(sizeof(BrowserWorker)); BrowserWorker* browser = malloc(sizeof(BrowserWorker)); //-V773
idx_last_array_init(browser->idx_last); idx_last_array_init(browser->idx_last);

View file

@ -60,7 +60,7 @@ WidgetElement* widget_element_button_create(
ButtonCallback callback, ButtonCallback callback,
void* context) { void* context) {
// Allocate and init model // Allocate and init model
GuiButtonModel* model = malloc(sizeof(GuiButtonModel)); GuiButtonModel* model = malloc(sizeof(GuiButtonModel)); //-V773
model->button_type = button_type; model->button_type = button_type;
model->callback = callback; model->callback = callback;
model->context = context; model->context = context;

View file

@ -23,7 +23,7 @@ void view_dispatcher_free(ViewDispatcher* view_dispatcher) {
gui_remove_view_port(view_dispatcher->gui, view_dispatcher->view_port); gui_remove_view_port(view_dispatcher->gui, view_dispatcher->view_port);
} }
// Crash if not all views were freed // Crash if not all views were freed
furi_assert(ViewDict_size(view_dispatcher->views) == 0); furi_assert(!ViewDict_size(view_dispatcher->views));
ViewDict_clear(view_dispatcher->views); ViewDict_clear(view_dispatcher->views);
// Free ViewPort // Free ViewPort
@ -157,7 +157,7 @@ void view_dispatcher_remove_view(ViewDispatcher* view_dispatcher, uint32_t view_
view_dispatcher->ongoing_input_view = NULL; view_dispatcher->ongoing_input_view = NULL;
} }
// Remove view // Remove view
ViewDict_erase(view_dispatcher->views, view_id); furi_check(ViewDict_erase(view_dispatcher->views, view_id));
view_set_update_callback(view, NULL); view_set_update_callback(view, NULL);
view_set_update_callback_context(view, NULL); view_set_update_callback_context(view, NULL);

View file

@ -269,7 +269,7 @@ static void loader_thread_state_callback(FuriThreadState thread_state, void* con
event.type = LoaderEventTypeApplicationStarted; event.type = LoaderEventTypeApplicationStarted;
furi_pubsub_publish(loader_instance->pubsub, &event); furi_pubsub_publish(loader_instance->pubsub, &event);
if(!loader_instance->application->flags & FlipperApplicationFlagInsomniaSafe) { if(!(loader_instance->application->flags & FlipperApplicationFlagInsomniaSafe)) {
furi_hal_power_insomnia_enter(); furi_hal_power_insomnia_enter();
} }
} else if(thread_state == FuriThreadStateStopped) { } else if(thread_state == FuriThreadStateStopped) {
@ -284,7 +284,7 @@ static void loader_thread_state_callback(FuriThreadState thread_state, void* con
loader_instance->application_arguments = NULL; loader_instance->application_arguments = NULL;
} }
if(!loader_instance->application->flags & FlipperApplicationFlagInsomniaSafe) { if(!(loader_instance->application->flags & FlipperApplicationFlagInsomniaSafe)) {
furi_hal_power_insomnia_exit(); furi_hal_power_insomnia_exit();
} }
loader_unlock(instance); loader_unlock(instance);

View file

@ -275,7 +275,7 @@ static void storage_cli_read_chunks(Cli* cli, FuriString* path, FuriString* args
uint32_t buffer_size; uint32_t buffer_size;
int parsed_count = sscanf(furi_string_get_cstr(args), "%lu", &buffer_size); int parsed_count = sscanf(furi_string_get_cstr(args), "%lu", &buffer_size);
if(parsed_count == EOF || parsed_count != 1) { if(parsed_count != 1) {
storage_cli_print_usage(); storage_cli_print_usage();
} else if(storage_file_open(file, furi_string_get_cstr(path), FSAM_READ, FSOM_OPEN_EXISTING)) { } else if(storage_file_open(file, furi_string_get_cstr(path), FSAM_READ, FSOM_OPEN_EXISTING)) {
uint64_t file_size = storage_file_size(file); uint64_t file_size = storage_file_size(file);
@ -315,7 +315,7 @@ static void storage_cli_write_chunk(Cli* cli, FuriString* path, FuriString* args
uint32_t buffer_size; uint32_t buffer_size;
int parsed_count = sscanf(furi_string_get_cstr(args), "%lu", &buffer_size); int parsed_count = sscanf(furi_string_get_cstr(args), "%lu", &buffer_size);
if(parsed_count == EOF || parsed_count != 1) { if(parsed_count != 1) {
storage_cli_print_usage(); storage_cli_print_usage();
} else { } else {
if(storage_file_open(file, furi_string_get_cstr(path), FSAM_WRITE, FSOM_OPEN_APPEND)) { if(storage_file_open(file, furi_string_get_cstr(path), FSAM_WRITE, FSOM_OPEN_APPEND)) {

View file

@ -545,8 +545,8 @@ static FS_Error
FS_Error storage_common_merge(Storage* storage, const char* old_path, const char* new_path) { FS_Error storage_common_merge(Storage* storage, const char* old_path, const char* new_path) {
FS_Error error; FS_Error error;
const char* new_path_tmp; const char* new_path_tmp = NULL;
FuriString* new_path_next; FuriString* new_path_next = NULL;
new_path_next = furi_string_alloc(); new_path_next = furi_string_alloc();
FileInfo fileinfo; FileInfo fileinfo;

View file

@ -179,7 +179,7 @@ SVCCTL_UserEvtFlowStatus_t SVCCTL_App_Notification(void* pckt) {
case EVT_BLUE_GAP_PASS_KEY_REQUEST: { case EVT_BLUE_GAP_PASS_KEY_REQUEST: {
// Generate random PIN code // Generate random PIN code
uint32_t pin = rand() % 999999; uint32_t pin = rand() % 999999; //-V1064
aci_gap_pass_key_resp(gap->service.connection_handle, pin); aci_gap_pass_key_resp(gap->service.connection_handle, pin);
if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagLock)) { if(furi_hal_rtc_is_flag_set(FuriHalRtcFlagLock)) {
FURI_LOG_I(TAG, "Pass key request event. Pin: ******"); FURI_LOG_I(TAG, "Pass key request event. Pin: ******");
@ -478,7 +478,6 @@ bool gap_init(GapConfig* config, GapEventCallback on_event_cb, void* context) {
gap = malloc(sizeof(Gap)); gap = malloc(sizeof(Gap));
gap->config = config; gap->config = config;
srand(DWT->CYCCNT);
// Create advertising timer // Create advertising timer
gap->advertise_timer = furi_timer_alloc(gap_advetise_timer_callback, FuriTimerTypeOnce, NULL); gap->advertise_timer = furi_timer_alloc(gap_advetise_timer_callback, FuriTimerTypeOnce, NULL);
// Initialization of GATT & GAP layer // Initialization of GATT & GAP layer

View file

@ -91,7 +91,7 @@ bool furi_hal_crypto_verify_key(uint8_t key_slot) {
uint8_t keys_nb = 0; uint8_t keys_nb = 0;
uint8_t valid_keys_nb = 0; uint8_t valid_keys_nb = 0;
uint8_t last_valid_slot = ENCLAVE_FACTORY_KEY_SLOTS; uint8_t last_valid_slot = ENCLAVE_FACTORY_KEY_SLOTS;
uint8_t empty_iv[16]; uint8_t empty_iv[16] = {0};
furi_hal_crypto_verify_enclave(&keys_nb, &valid_keys_nb); furi_hal_crypto_verify_enclave(&keys_nb, &valid_keys_nb);
if(key_slot <= ENCLAVE_FACTORY_KEY_SLOTS) { // It's a factory key if(key_slot <= ENCLAVE_FACTORY_KEY_SLOTS) { // It's a factory key
if(key_slot > keys_nb) return false; if(key_slot > keys_nb) return false;

View file

@ -46,7 +46,7 @@ FURI_NORETURN void __furi_halt();
/** Check condition and crash if check failed */ /** Check condition and crash if check failed */
#define furi_check(__e) \ #define furi_check(__e) \
do { \ do { \
if((__e) == 0) { \ if(!(__e)) { \
furi_crash("furi_check failed\r\n"); \ furi_crash("furi_check failed\r\n"); \
} \ } \
} while(0) } while(0)
@ -55,7 +55,7 @@ FURI_NORETURN void __furi_halt();
#ifdef FURI_DEBUG #ifdef FURI_DEBUG
#define furi_assert(__e) \ #define furi_assert(__e) \
do { \ do { \
if((__e) == 0) { \ if(!(__e)) { \
furi_crash("furi_assert failed\r\n"); \ furi_crash("furi_assert failed\r\n"); \
} \ } \
} while(0) } while(0)

View file

@ -25,7 +25,7 @@ uint32_t furi_event_flag_set(FuriEventFlag* instance, uint32_t flags) {
uint32_t rflags; uint32_t rflags;
BaseType_t yield; BaseType_t yield;
if(FURI_IS_IRQ_MODE() != 0U) { if(FURI_IS_IRQ_MODE()) {
yield = pdFALSE; yield = pdFALSE;
if(xEventGroupSetBitsFromISR(hEventGroup, (EventBits_t)flags, &yield) == pdFAIL) { if(xEventGroupSetBitsFromISR(hEventGroup, (EventBits_t)flags, &yield) == pdFAIL) {
rflags = (uint32_t)FuriStatusErrorResource; rflags = (uint32_t)FuriStatusErrorResource;
@ -48,7 +48,7 @@ uint32_t furi_event_flag_clear(FuriEventFlag* instance, uint32_t flags) {
EventGroupHandle_t hEventGroup = (EventGroupHandle_t)instance; EventGroupHandle_t hEventGroup = (EventGroupHandle_t)instance;
uint32_t rflags; uint32_t rflags;
if(FURI_IS_IRQ_MODE() != 0U) { if(FURI_IS_IRQ_MODE()) {
rflags = xEventGroupGetBitsFromISR(hEventGroup); rflags = xEventGroupGetBitsFromISR(hEventGroup);
if(xEventGroupClearBitsFromISR(hEventGroup, (EventBits_t)flags) == pdFAIL) { if(xEventGroupClearBitsFromISR(hEventGroup, (EventBits_t)flags) == pdFAIL) {
@ -73,7 +73,7 @@ uint32_t furi_event_flag_get(FuriEventFlag* instance) {
EventGroupHandle_t hEventGroup = (EventGroupHandle_t)instance; EventGroupHandle_t hEventGroup = (EventGroupHandle_t)instance;
uint32_t rflags; uint32_t rflags;
if(FURI_IS_IRQ_MODE() != 0U) { if(FURI_IS_IRQ_MODE()) {
rflags = xEventGroupGetBitsFromISR(hEventGroup); rflags = xEventGroupGetBitsFromISR(hEventGroup);
} else { } else {
rflags = xEventGroupGetBits(hEventGroup); rflags = xEventGroupGetBits(hEventGroup);

View file

@ -150,8 +150,7 @@ void memmgr_heap_disable_thread_trace(FuriThreadId thread_id) {
vTaskSuspendAll(); vTaskSuspendAll();
{ {
memmgr_heap_thread_trace_depth++; memmgr_heap_thread_trace_depth++;
furi_check(MemmgrHeapThreadDict_get(memmgr_heap_thread_dict, (uint32_t)thread_id) != NULL); furi_check(MemmgrHeapThreadDict_erase(memmgr_heap_thread_dict, (uint32_t)thread_id));
MemmgrHeapThreadDict_erase(memmgr_heap_thread_dict, (uint32_t)thread_id);
memmgr_heap_thread_trace_depth--; memmgr_heap_thread_trace_depth--;
} }
(void)xTaskResumeAll(); (void)xTaskResumeAll();
@ -212,7 +211,8 @@ static inline void traceFREE(void* pointer, size_t size) {
MemmgrHeapAllocDict_t* alloc_dict = MemmgrHeapAllocDict_t* alloc_dict =
MemmgrHeapThreadDict_get(memmgr_heap_thread_dict, (uint32_t)thread_id); MemmgrHeapThreadDict_get(memmgr_heap_thread_dict, (uint32_t)thread_id);
if(alloc_dict) { if(alloc_dict) {
MemmgrHeapAllocDict_erase(*alloc_dict, (uint32_t)pointer); // In some cases thread may want to release memory that was not allocated by it
(void)MemmgrHeapAllocDict_erase(*alloc_dict, (uint32_t)pointer);
} }
memmgr_heap_thread_trace_depth--; memmgr_heap_thread_trace_depth--;
} }

View file

@ -45,7 +45,7 @@ FuriStatus furi_mutex_acquire(FuriMutex* instance, uint32_t timeout) {
stat = FuriStatusOk; stat = FuriStatusOk;
if(FURI_IS_IRQ_MODE() != 0U) { if(FURI_IS_IRQ_MODE()) {
stat = FuriStatusErrorISR; stat = FuriStatusErrorISR;
} else if(hMutex == NULL) { } else if(hMutex == NULL) {
stat = FuriStatusErrorParameter; stat = FuriStatusErrorParameter;
@ -85,7 +85,7 @@ FuriStatus furi_mutex_release(FuriMutex* instance) {
stat = FuriStatusOk; stat = FuriStatusOk;
if(FURI_IS_IRQ_MODE() != 0U) { if(FURI_IS_IRQ_MODE()) {
stat = FuriStatusErrorISR; stat = FuriStatusErrorISR;
} else if(hMutex == NULL) { } else if(hMutex == NULL) {
stat = FuriStatusErrorParameter; stat = FuriStatusErrorParameter;
@ -111,7 +111,7 @@ FuriThreadId furi_mutex_get_owner(FuriMutex* instance) {
hMutex = (SemaphoreHandle_t)((uint32_t)instance & ~1U); hMutex = (SemaphoreHandle_t)((uint32_t)instance & ~1U);
if((FURI_IS_IRQ_MODE() != 0U) || (hMutex == NULL)) { if((FURI_IS_IRQ_MODE()) || (hMutex == NULL)) {
owner = 0; owner = 0;
} else { } else {
owner = (FuriThreadId)xSemaphoreGetMutexHolder(hMutex); owner = (FuriThreadId)xSemaphoreGetMutexHolder(hMutex);

View file

@ -45,7 +45,7 @@ FuriStatus furi_semaphore_acquire(FuriSemaphore* instance, uint32_t timeout) {
stat = FuriStatusOk; stat = FuriStatusOk;
if(FURI_IS_IRQ_MODE() != 0U) { if(FURI_IS_IRQ_MODE()) {
if(timeout != 0U) { if(timeout != 0U) {
stat = FuriStatusErrorParameter; stat = FuriStatusErrorParameter;
} else { } else {
@ -80,7 +80,7 @@ FuriStatus furi_semaphore_release(FuriSemaphore* instance) {
stat = FuriStatusOk; stat = FuriStatusOk;
if(FURI_IS_IRQ_MODE() != 0U) { if(FURI_IS_IRQ_MODE()) {
yield = pdFALSE; yield = pdFALSE;
if(xSemaphoreGiveFromISR(hSemaphore, &yield) != pdTRUE) { if(xSemaphoreGiveFromISR(hSemaphore, &yield) != pdTRUE) {
@ -104,7 +104,7 @@ uint32_t furi_semaphore_get_count(FuriSemaphore* instance) {
SemaphoreHandle_t hSemaphore = (SemaphoreHandle_t)instance; SemaphoreHandle_t hSemaphore = (SemaphoreHandle_t)instance;
uint32_t count; uint32_t count;
if(FURI_IS_IRQ_MODE() != 0U) { if(FURI_IS_IRQ_MODE()) {
count = (uint32_t)uxSemaphoreGetCountFromISR(hSemaphore); count = (uint32_t)uxSemaphoreGetCountFromISR(hSemaphore);
} else { } else {
count = (uint32_t)uxSemaphoreGetCount(hSemaphore); count = (uint32_t)uxSemaphoreGetCount(hSemaphore);

View file

@ -23,7 +23,7 @@ size_t furi_stream_buffer_send(
uint32_t timeout) { uint32_t timeout) {
size_t ret; size_t ret;
if(FURI_IS_IRQ_MODE() != 0U) { if(FURI_IS_IRQ_MODE()) {
BaseType_t yield; BaseType_t yield;
ret = xStreamBufferSendFromISR(stream_buffer, data, length, &yield); ret = xStreamBufferSendFromISR(stream_buffer, data, length, &yield);
portYIELD_FROM_ISR(yield); portYIELD_FROM_ISR(yield);
@ -41,7 +41,7 @@ size_t furi_stream_buffer_receive(
uint32_t timeout) { uint32_t timeout) {
size_t ret; size_t ret;
if(FURI_IS_IRQ_MODE() != 0U) { if(FURI_IS_IRQ_MODE()) {
BaseType_t yield; BaseType_t yield;
ret = xStreamBufferReceiveFromISR(stream_buffer, data, length, &yield); ret = xStreamBufferReceiveFromISR(stream_buffer, data, length, &yield);
portYIELD_FROM_ISR(yield); portYIELD_FROM_ISR(yield);

View file

@ -29,13 +29,13 @@ FuriString* furi_string_alloc() {
} }
FuriString* furi_string_alloc_set(const FuriString* s) { FuriString* furi_string_alloc_set(const FuriString* s) {
FuriString* string = malloc(sizeof(FuriString)); FuriString* string = malloc(sizeof(FuriString)); //-V773
string_init_set(string->string, s->string); string_init_set(string->string, s->string);
return string; return string;
} }
FuriString* furi_string_alloc_set_str(const char cstr[]) { FuriString* furi_string_alloc_set_str(const char cstr[]) {
FuriString* string = malloc(sizeof(FuriString)); FuriString* string = malloc(sizeof(FuriString)); //-V773
string_init_set(string->string, cstr); string_init_set(string->string, cstr);
return string; return string;
} }

View file

@ -50,6 +50,7 @@ static int32_t __furi_thread_stdout_flush(FuriThread* thread);
__attribute__((__noreturn__)) void furi_thread_catch() { __attribute__((__noreturn__)) void furi_thread_catch() {
asm volatile("nop"); // extra magic asm volatile("nop"); // extra magic
furi_crash("You are doing it wrong"); furi_crash("You are doing it wrong");
__builtin_unreachable();
} }
static void furi_thread_set_state(FuriThread* thread, FuriThreadState state) { static void furi_thread_set_state(FuriThread* thread, FuriThreadState state) {
@ -112,6 +113,12 @@ FuriThread* furi_thread_alloc() {
FuriThread* thread = malloc(sizeof(FuriThread)); FuriThread* thread = malloc(sizeof(FuriThread));
thread->output.buffer = furi_string_alloc(); thread->output.buffer = furi_string_alloc();
thread->is_service = false; thread->is_service = false;
if(furi_thread_get_current_id()) {
FuriThread* parent = pvTaskGetThreadLocalStoragePointer(NULL, 0);
if(parent) thread->heap_trace_enabled = parent->heap_trace_enabled;
}
return thread; return thread;
} }

View file

@ -313,7 +313,7 @@ bool flipper_format_stream_write_value_line(Stream* stream, FlipperStreamWriteDa
furi_crash("Unknown FF type"); furi_crash("Unknown FF type");
} }
if((size_t)(i + 1) < write_data->data_size) { if(((size_t)i + 1) < write_data->data_size) {
furi_string_cat(value, " "); furi_string_cat(value, " ");
} }

View file

@ -85,8 +85,8 @@ static InfraredStatus infrared_common_decode_bits(InfraredCommonDecoder* decoder
if(timings->min_split_time && !level) { if(timings->min_split_time && !level) {
if(timing > timings->min_split_time) { if(timing > timings->min_split_time) {
/* long low timing - check if we're ready for any of protocol modification */ /* long low timing - check if we're ready for any of protocol modification */
for(size_t i = 0; decoder->protocol->databit_len[i] && for(size_t i = 0; i < COUNT_OF(decoder->protocol->databit_len) &&
(i < COUNT_OF(decoder->protocol->databit_len)); decoder->protocol->databit_len[i];
++i) { ++i) {
if(decoder->protocol->databit_len[i] == decoder->databit_cnt) { if(decoder->protocol->databit_len[i] == decoder->databit_cnt) {
return InfraredStatusReady; return InfraredStatusReady;
@ -199,7 +199,7 @@ InfraredMessage* infrared_common_decoder_check_ready(InfraredCommonDecoder* deco
bool found_length = false; bool found_length = false;
for(size_t i = 0; for(size_t i = 0;
decoder->protocol->databit_len[i] && (i < COUNT_OF(decoder->protocol->databit_len)); i < COUNT_OF(decoder->protocol->databit_len) && decoder->protocol->databit_len[i];
++i) { ++i) {
if(decoder->protocol->databit_len[i] == decoder->databit_cnt) { if(decoder->protocol->databit_len[i] == decoder->databit_cnt) {
found_length = true; found_length = true;

View file

@ -140,9 +140,8 @@ size_t lfrfid_worker_dict_get_data_size(LFRFIDWorker* worker, LFRFIDProtocol pro
static int32_t lfrfid_worker_thread(void* thread_context) { static int32_t lfrfid_worker_thread(void* thread_context) {
LFRFIDWorker* worker = thread_context; LFRFIDWorker* worker = thread_context;
bool running = true;
while(running) { while(true) {
uint32_t flags = furi_thread_flags_wait(LFRFIDEventAll, FuriFlagWaitAny, FuriWaitForever); uint32_t flags = furi_thread_flags_wait(LFRFIDEventAll, FuriFlagWaitAny, FuriWaitForever);
if(flags != FuriFlagErrorTimeout) { if(flags != FuriFlagErrorTimeout) {
// stop thread // stop thread

View file

@ -541,7 +541,7 @@ static size_t _etoa(
exp2 = (int)(expval * 3.321928094887362 + 0.5); exp2 = (int)(expval * 3.321928094887362 + 0.5);
const double z = expval * 2.302585092994046 - exp2 * 0.6931471805599453; const double z = expval * 2.302585092994046 - exp2 * 0.6931471805599453;
const double z2 = z * z; const double z2 = z * z;
conv.U = (uint64_t)(exp2 + 1023) << 52U; conv.U = ((uint64_t)exp2 + 1023) << 52U;
// compute exp(z) using continued fractions, see https://en.wikipedia.org/wiki/Exponential_function#Continued_fractions_for_ex // compute exp(z) using continued fractions, see https://en.wikipedia.org/wiki/Exponential_function#Continued_fractions_for_ex
conv.F *= 1 + 2 * z / (2 - z + (z2 / (6 + (z2 / (10 + z2 / 14))))); conv.F *= 1 + 2 * z / (2 - z + (z2 / (6 + (z2 / (10 + z2 / 14)))));
// correct for rounding errors // correct for rounding errors

View file

@ -312,7 +312,6 @@ void subghz_protocol_decoder_power_smart_feed(
if((instance->decoder.decode_data & POWER_SMART_PACKET_HEADER_MASK) == if((instance->decoder.decode_data & POWER_SMART_PACKET_HEADER_MASK) ==
POWER_SMART_PACKET_HEADER) { POWER_SMART_PACKET_HEADER) {
if(subghz_protocol_power_smart_chek_valid(instance->decoder.decode_data)) { if(subghz_protocol_power_smart_chek_valid(instance->decoder.decode_data)) {
instance->decoder.decode_data = instance->decoder.decode_data;
instance->generic.data = instance->decoder.decode_data; instance->generic.data = instance->decoder.decode_data;
instance->generic.data_count_bit = instance->generic.data_count_bit =
subghz_protocol_power_smart_const.min_count_bit_for_found; subghz_protocol_power_smart_const.min_count_bit_for_found;

View file

@ -464,7 +464,7 @@ bool subghz_keystore_raw_encrypted_save(
} }
stream_write_cstring(output_stream, encrypted_line); stream_write_cstring(output_stream, encrypted_line);
} while(ret > 0 && result); } while(result);
flipper_format_free(output_flipper_format); flipper_format_free(output_flipper_format);

View file

@ -5,12 +5,6 @@
#include <furi.h> #include <furi.h>
void set_random_name(char* name, uint8_t max_name_size) { void set_random_name(char* name, uint8_t max_name_size) {
static bool rand_generator_inited = false;
if(!rand_generator_inited) {
srand(DWT->CYCCNT);
rand_generator_inited = true;
}
const char* prefix[] = { const char* prefix[] = {
"ancient", "hollow", "strange", "disappeared", "unknown", "ancient", "hollow", "strange", "disappeared", "unknown",
"unthinkable", "unnamable", "nameless", "my", "concealed", "unthinkable", "unnamable", "nameless", "my", "concealed",