replace sprintf() by snprintf() to avoid compiler warnings

This commit is contained in:
Fabio de Souza Villaca Medeiros 2023-03-20 22:51:43 -03:00
parent b45f48e600
commit 6c80c570c0
4 changed files with 31 additions and 23 deletions

18
cJSON.c
View File

@ -124,7 +124,7 @@ CJSON_PUBLIC(double) cJSON_GetNumberValue(const cJSON * const item)
CJSON_PUBLIC(const char*) cJSON_Version(void) CJSON_PUBLIC(const char*) cJSON_Version(void)
{ {
static char version[15]; static char version[15];
sprintf(version, "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH); snprintf(version, sizeof(version), "%i.%i.%i", CJSON_VERSION_MAJOR, CJSON_VERSION_MINOR, CJSON_VERSION_PATCH);
return version; return version;
} }
@ -560,26 +560,26 @@ static cJSON_bool print_number(const cJSON * const item, printbuffer * const out
/* This checks for NaN and Infinity */ /* This checks for NaN and Infinity */
if (isnan(d) || isinf(d)) if (isnan(d) || isinf(d))
{ {
length = sprintf((char*)number_buffer, "null"); length = snprintf((char*)number_buffer, sizeof(number_buffer), "null");
} }
else if(d == (double)item->valueint) else if(d == (double)item->valueint)
{ {
length = sprintf((char*)number_buffer, "%d", item->valueint); length = snprintf((char*)number_buffer, sizeof(number_buffer), "%d", item->valueint);
} }
else else
{ {
/* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */ /* Try 15 decimal places of precision to avoid nonsignificant nonzero digits */
length = sprintf((char*)number_buffer, "%1.15g", d); length = snprintf((char*)number_buffer, sizeof(number_buffer), "%1.15g", d);
/* Check whether the original double can be recovered */ /* Check whether the original double can be recovered */
if ((sscanf((char*)number_buffer, "%lg", &test) != 1) || !compare_double((double)test, d)) if ((sscanf((char*)number_buffer, "%lg", &test) != 1) || !compare_double((double)test, d))
{ {
/* If not, print with 17 decimal places of precision */ /* If not, print with 17 decimal places of precision */
length = sprintf((char*)number_buffer, "%1.17g", d); length = snprintf((char*)number_buffer, sizeof(number_buffer), "%1.17g", d);
} }
} }
/* sprintf failed or buffer overrun occurred */ /* snprintf failed or buffer overrun occurred */
if ((length < 0) || (length > (int)(sizeof(number_buffer) - 1))) if ((length < 0) || (length > (int)(sizeof(number_buffer) - 1)))
{ {
return false; return false;
@ -952,7 +952,8 @@ static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffe
} }
output_length = (size_t)(input_pointer - input) + escape_characters; output_length = (size_t)(input_pointer - input) + escape_characters;
output = ensure(output_buffer, output_length + sizeof("\"\"")); size_t size = output_length + sizeof("\"\"");
output = ensure(output_buffer, size);
if (output == NULL) if (output == NULL)
{ {
return false; return false;
@ -1008,7 +1009,8 @@ static cJSON_bool print_string_ptr(const unsigned char * const input, printbuffe
break; break;
default: default:
/* escape and print as unicode codepoint */ /* escape and print as unicode codepoint */
sprintf((char*)output_pointer, "u%04x", *input_pointer); snprintf((char*)output_pointer, size - 1, "u%04x", *input_pointer);
output_pointer += 4; output_pointer += 4;
break; break;
} }

View File

@ -221,7 +221,8 @@ CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(const cJSON * const obje
if (cJSON_IsArray(object)) if (cJSON_IsArray(object))
{ {
/* reserve enough memory for a 64 bit integer + '/' and '\0' */ /* reserve enough memory for a 64 bit integer + '/' and '\0' */
unsigned char *full_pointer = (unsigned char*)cJSON_malloc(strlen((char*)target_pointer) + 20 + sizeof("/")); size_t size = strlen((char*)target_pointer) + 20 + sizeof("/");
unsigned char *full_pointer = (unsigned char*)cJSON_malloc(size);
/* check if conversion to unsigned long is valid /* check if conversion to unsigned long is valid
* This should be eliminated at compile time by dead code elimination * This should be eliminated at compile time by dead code elimination
* if size_t is an alias of unsigned long, or if it is bigger */ * if size_t is an alias of unsigned long, or if it is bigger */
@ -231,7 +232,7 @@ CJSON_PUBLIC(char *) cJSONUtils_FindPointerFromObjectTo(const cJSON * const obje
cJSON_free(full_pointer); cJSON_free(full_pointer);
return NULL; return NULL;
} }
sprintf((char*)full_pointer, "/%lu%s", (unsigned long)child_index, target_pointer); /* /<array_index><path> */ snprintf((char*)full_pointer, size, "/%lu%s", (unsigned long)child_index, target_pointer); /* /<array_index><path> */
cJSON_free(target_pointer); cJSON_free(target_pointer);
return (char*)full_pointer; return (char*)full_pointer;
@ -1117,9 +1118,10 @@ static void compose_patch(cJSON * const patches, const unsigned char * const ope
{ {
size_t suffix_length = pointer_encoded_length(suffix); size_t suffix_length = pointer_encoded_length(suffix);
size_t path_length = strlen((const char*)path); size_t path_length = strlen((const char*)path);
unsigned char *full_path = (unsigned char*)cJSON_malloc(path_length + suffix_length + sizeof("/")); size_t size = path_length + suffix_length + sizeof("/");
unsigned char *full_path = (unsigned char*)cJSON_malloc(size);
sprintf((char*)full_path, "%s/", (const char*)path); snprintf((char*)full_path, size, "%s/", (const char*)path);
encode_string_as_pointer(full_path + path_length + 1, suffix); encode_string_as_pointer(full_path + path_length + 1, suffix);
cJSON_AddItemToObject(patch, "path", cJSON_CreateString((const char*)full_path)); cJSON_AddItemToObject(patch, "path", cJSON_CreateString((const char*)full_path));
@ -1172,7 +1174,8 @@ static void create_patches(cJSON * const patches, const unsigned char * const pa
size_t index = 0; size_t index = 0;
cJSON *from_child = from->child; cJSON *from_child = from->child;
cJSON *to_child = to->child; cJSON *to_child = to->child;
unsigned char *new_path = (unsigned char*)cJSON_malloc(strlen((const char*)path) + 20 + sizeof("/")); /* Allow space for 64bit int. log10(2^64) = 20 */ size_t size = strlen((const char*)path) + 20 + sizeof("/"); /* Allow space for 64bit int. log10(2^64) = 20 */
unsigned char *new_path = (unsigned char*)cJSON_malloc(size);
/* generate patches for all array elements that exist in both "from" and "to" */ /* generate patches for all array elements that exist in both "from" and "to" */
for (index = 0; (from_child != NULL) && (to_child != NULL); (void)(from_child = from_child->next), (void)(to_child = to_child->next), index++) for (index = 0; (from_child != NULL) && (to_child != NULL); (void)(from_child = from_child->next), (void)(to_child = to_child->next), index++)
@ -1185,7 +1188,7 @@ static void create_patches(cJSON * const patches, const unsigned char * const pa
cJSON_free(new_path); cJSON_free(new_path);
return; return;
} }
sprintf((char*)new_path, "%s/%lu", path, (unsigned long)index); /* path of the current array element */ snprintf((char*)new_path, size, "%s/%lu", path, (unsigned long)index); /* path of the current array element */
create_patches(patches, new_path, from_child, to_child, case_sensitive); create_patches(patches, new_path, from_child, to_child, case_sensitive);
} }
@ -1200,7 +1203,7 @@ static void create_patches(cJSON * const patches, const unsigned char * const pa
cJSON_free(new_path); cJSON_free(new_path);
return; return;
} }
sprintf((char*)new_path, "%lu", (unsigned long)index); snprintf((char*)new_path, size, "%lu", (unsigned long)index);
compose_patch(patches, (const unsigned char*)"remove", path, new_path, NULL); compose_patch(patches, (const unsigned char*)"remove", path, new_path, NULL);
} }
/* add new elements in 'to' that were not in 'from' */ /* add new elements in 'to' that were not in 'from' */
@ -1243,9 +1246,10 @@ static void create_patches(cJSON * const patches, const unsigned char * const pa
/* both object keys are the same */ /* both object keys are the same */
size_t path_length = strlen((const char*)path); size_t path_length = strlen((const char*)path);
size_t from_child_name_length = pointer_encoded_length((unsigned char*)from_child->string); size_t from_child_name_length = pointer_encoded_length((unsigned char*)from_child->string);
unsigned char *new_path = (unsigned char*)cJSON_malloc(path_length + from_child_name_length + sizeof("/")); size_t size = path_length + from_child_name_length + sizeof("/");
unsigned char *new_path = (unsigned char*)cJSON_malloc(size);
sprintf((char*)new_path, "%s/", path); snprintf((char*)new_path, size, "%s/", path);
encode_string_as_pointer(new_path + path_length + 1, (unsigned char*)from_child->string); encode_string_as_pointer(new_path + path_length + 1, (unsigned char*)from_child->string);
/* create a patch for the element */ /* create a patch for the element */

View File

@ -59,14 +59,16 @@ static void do_test(const char *test_name)
/* allocate file paths */ /* allocate file paths */
#define TEST_DIR_PATH "inputs/" #define TEST_DIR_PATH "inputs/"
test_path = (char*)malloc(sizeof(TEST_DIR_PATH) + test_name_length); size_t test_path_size = sizeof(TEST_DIR_PATH) + test_name_length;
test_path = (char*)malloc(test_path_size);
TEST_ASSERT_NOT_NULL_MESSAGE(test_path, "Failed to allocate test_path buffer."); TEST_ASSERT_NOT_NULL_MESSAGE(test_path, "Failed to allocate test_path buffer.");
expected_path = (char*)malloc(sizeof(TEST_DIR_PATH) + test_name_length + sizeof(".expected")); size_t expected_path_size = sizeof(TEST_DIR_PATH) + test_name_length + sizeof(".expected");
expected_path = (char*)malloc(expected_path_size);
TEST_ASSERT_NOT_NULL_MESSAGE(expected_path, "Failed to allocate expected_path buffer."); TEST_ASSERT_NOT_NULL_MESSAGE(expected_path, "Failed to allocate expected_path buffer.");
/* create file paths */ /* create file paths */
sprintf(test_path, TEST_DIR_PATH"%s", test_name); snprintf(test_path, test_path_size, TEST_DIR_PATH"%s", test_name);
sprintf(expected_path, TEST_DIR_PATH"%s.expected", test_name); snprintf(expected_path, expected_path_size, TEST_DIR_PATH"%s.expected", test_name);
/* read expected output */ /* read expected output */
expected = read_file(expected_path); expected = read_file(expected_path);

View File

@ -36,8 +36,8 @@ static void parse_hex4_should_parse_all_combinations(void)
/* test all combinations */ /* test all combinations */
for (number = 0; number <= 0xFFFF; number++) for (number = 0; number <= 0xFFFF; number++)
{ {
TEST_ASSERT_EQUAL_INT_MESSAGE(4, sprintf((char*)digits_lower, "%.4x", number), "sprintf failed."); TEST_ASSERT_EQUAL_INT_MESSAGE(4, snprintf((char*)digits_lower, sizeof(digits_lower), "%.4x", number), "snprintf failed.");
TEST_ASSERT_EQUAL_INT_MESSAGE(4, sprintf((char*)digits_upper, "%.4X", number), "sprintf failed."); TEST_ASSERT_EQUAL_INT_MESSAGE(4, snprintf((char*)digits_upper, sizeof(digits_upper), "%.4X", number), "snprintf failed.");
TEST_ASSERT_EQUAL_INT_MESSAGE(number, parse_hex4(digits_lower), "Failed to parse lowercase digits."); TEST_ASSERT_EQUAL_INT_MESSAGE(number, parse_hex4(digits_lower), "Failed to parse lowercase digits.");
TEST_ASSERT_EQUAL_INT_MESSAGE(number, parse_hex4(digits_upper), "Failed to parse uppercase digits."); TEST_ASSERT_EQUAL_INT_MESSAGE(number, parse_hex4(digits_upper), "Failed to parse uppercase digits.");