ataweg wrote:The following code snipplet results in a program crash:
Code: Select all
char *string = NULL;
ESP_LOGD( TAG, "*** crash here %s", string );
Since the ESP_LOG * functions are often used for debugging, it is more than annoying when these functions themselves crash, because the parameters are not well defined.
I would hazard to guess that the the esp_log_write function (used by the ESP_LOG macro) uses the standard vsnprintf and unless they change that any other solution would be non-trivial.
While the NULL string issue is irritating, it has bitten me more than once, it seems to be the standard for printf-like funtions to act like this (How ever annoying).
The C standard from 1999 says:
7.1.4 Use of library functions
1 Each of the following statements applies unless explicitly stated otherwise in the detailed descriptions that follow: If an argument to a function has an invalid value (such as a value outside the domain of the function, or a pointer outside the address space of the program, or a null pointer,or a pointer to non-modifiable storage when the corresponding parameter is not const-qualified) or a type (after promotion) not expected by a function with variable number of arguments, the behavior is undefined.
To wrap it up, it's to save space.
Maybe you can use something like:
Code: Select all
#define SS(s) (s!=NULL?s:"") // Safe strings. Check string for NULL
or if you prefer
Code: Select all
#define SS(s) (s!=NULL?s:"<NULL>") // Safe strings. Check string for NULL
and then wrap strings in ESP_LOGD outputs like so:
Code: Select all
char *string = NULL;
ESP_LOGD( TAG, "*** crash here %s", SS(string) );