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:
		
							parent
							
								
									04e50c9f89
								
							
						
					
					
						commit
						e8913f2e33
					
				| @ -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); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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); | ||||||
|  | |||||||
| @ -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); | ||||||
|  | |||||||
| @ -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); | ||||||
|  | |||||||
| @ -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 { | ||||||
|  | |||||||
| @ -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 { | ||||||
|  | |||||||
| @ -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(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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); | ||||||
|  | |||||||
| @ -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)); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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; | ||||||
|  | |||||||
| @ -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; | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -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) { | ||||||
|  | |||||||
| @ -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( | ||||||
|  | |||||||
| @ -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); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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; | ||||||
|  | |||||||
| @ -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); | ||||||
|  | |||||||
| @ -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); | ||||||
|  | |||||||
| @ -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)) { | ||||||
|  | |||||||
| @ -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; | ||||||
|  | |||||||
| @ -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
 | ||||||
|  | |||||||
| @ -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; | ||||||
|  | |||||||
| @ -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) | ||||||
|  | |||||||
| @ -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); | ||||||
|  | |||||||
| @ -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--; | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -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); | ||||||
|  | |||||||
| @ -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); | ||||||
|  | |||||||
| @ -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); | ||||||
|  | |||||||
| @ -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; | ||||||
| } | } | ||||||
|  | |||||||
| @ -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; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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, " "); | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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; | ||||||
|  | |||||||
| @ -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
 | ||||||
|  | |||||||
| @ -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
 | ||||||
|  | |||||||
| @ -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; | ||||||
|  | |||||||
| @ -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); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -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", | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 あく
						あく