Skip to content

Commit a26c454

Browse files
author
Ruben Ayrapetyan
committed
Add warn_unused_result attribute to ecma_string_to_utf8_string. Add assertions that specified buffer size is sufficient in places, where return value of ecma_string_to_utf8_string wasn't checked prior to the changes.
JerryScript-DCO-1.0-Signed-off-by: Ruben Ayrapetyan r.ayrapetyan@samsung.com
1 parent 6ee561e commit a26c454

File tree

12 files changed

+99
-52
lines changed

12 files changed

+99
-52
lines changed

jerry-core/ecma/base/ecma-helpers-string.cpp

Lines changed: 22 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -649,17 +649,27 @@ ecma_concat_ecma_strings (ecma_string_t *string1_p, /**< first ecma-string */
649649
if (!string_desc_p->u.concatenation.is_surrogate_pair_sliced)
650650
{
651651
lit_utf8_size_t buffer_size = ecma_string_get_size (string2_p);
652+
652653
MEM_DEFINE_LOCAL_ARRAY (utf8_str_p, buffer_size, lit_utf8_byte_t);
653-
ecma_string_to_utf8_string (string2_p, utf8_str_p, (ssize_t) buffer_size);
654+
655+
ssize_t sz = ecma_string_to_utf8_string (string2_p, utf8_str_p, (ssize_t) buffer_size);
656+
JERRY_ASSERT (sz > 0);
657+
654658
string_desc_p->hash = lit_utf8_string_hash_combine (string1_p->hash, utf8_str_p, buffer_size);
659+
655660
MEM_FINALIZE_LOCAL_ARRAY (utf8_str_p);
656661
}
657662
else
658663
{
659664
lit_utf8_size_t buffer_size = ecma_string_get_size (string_desc_p);
665+
660666
MEM_DEFINE_LOCAL_ARRAY (utf8_str_p, buffer_size, lit_utf8_byte_t);
661-
ecma_string_to_utf8_string (string_desc_p, utf8_str_p, (ssize_t) buffer_size);
667+
668+
ssize_t sz = ecma_string_to_utf8_string (string_desc_p, utf8_str_p, (ssize_t) buffer_size);
669+
JERRY_ASSERT (sz > 0);
670+
662671
string_desc_p->hash = lit_utf8_string_calc_hash (utf8_str_p, buffer_size);
672+
663673
MEM_FINALIZE_LOCAL_ARRAY (utf8_str_p);
664674
}
665675

@@ -985,7 +995,7 @@ ecma_string_get_array_index (const ecma_string_t *str_p, /**< ecma-string */
985995
* otherwise (in case size of buffer is insufficient) - negative number, which is calculated
986996
* as negation of buffer size, that is required to hold the string's content.
987997
*/
988-
ssize_t
998+
ssize_t __attr_return_value_should_be_checked___
989999
ecma_string_to_utf8_string (const ecma_string_t *string_desc_p, /**< ecma-string descriptor */
9901000
lit_utf8_byte_t *buffer_p, /**< destination buffer pointer
9911001
* (can be NULL if buffer_size == 0) */
@@ -1586,7 +1596,8 @@ ecma_string_get_char_at_pos (const ecma_string_t *string_p, /**< ecma-string */
15861596

15871597
MEM_DEFINE_LOCAL_ARRAY (utf8_str_p, buffer_size, lit_utf8_byte_t);
15881598

1589-
ecma_string_to_utf8_string (string_p, utf8_str_p, (ssize_t) buffer_size);
1599+
ssize_t sz = ecma_string_to_utf8_string (string_p, utf8_str_p, (ssize_t) buffer_size);
1600+
JERRY_ASSERT (sz > 0);
15901601

15911602
ch = lit_utf8_string_code_unit_at (utf8_str_p, buffer_size, index);;
15921603

@@ -1611,7 +1622,8 @@ ecma_string_get_byte_at_pos (const ecma_string_t *string_p, /**< ecma-string */
16111622

16121623
MEM_DEFINE_LOCAL_ARRAY (utf8_str_p, buffer_size, lit_utf8_byte_t);
16131624

1614-
ecma_string_to_utf8_string (string_p, utf8_str_p, (ssize_t) buffer_size);
1625+
ssize_t sz = ecma_string_to_utf8_string (string_p, utf8_str_p, (ssize_t) buffer_size);
1626+
JERRY_ASSERT (sz > 0);
16151627

16161628
byte = utf8_str_p[index];
16171629

@@ -1801,7 +1813,8 @@ ecma_string_substr (const ecma_string_t *string_p, /**< pointer to an ecma strin
18011813
lit_utf8_size_t buffer_size = ecma_string_get_size (string_p);
18021814
MEM_DEFINE_LOCAL_ARRAY (utf8_str_p, buffer_size, lit_utf8_byte_t);
18031815

1804-
ecma_string_to_utf8_string (string_p, utf8_str_p, (ssize_t) buffer_size);
1816+
ssize_t sz = ecma_string_to_utf8_string (string_p, utf8_str_p, (ssize_t) buffer_size);
1817+
JERRY_ASSERT (sz >= 0);
18051818

18061819
/**
18071820
* II. Extract substring
@@ -1847,7 +1860,9 @@ ecma_string_trim (const ecma_string_t *string_p) /**< pointer to an ecma string
18471860
if (buffer_size > 0)
18481861
{
18491862
MEM_DEFINE_LOCAL_ARRAY (utf8_str_p, buffer_size, lit_utf8_byte_t);
1850-
ecma_string_to_utf8_string (string_p, utf8_str_p, (ssize_t) buffer_size);
1863+
1864+
ssize_t sz = ecma_string_to_utf8_string (string_p, utf8_str_p, (ssize_t) buffer_size);
1865+
JERRY_ASSERT (sz >= 0);
18511866

18521867
lit_utf8_iterator_t front = lit_utf8_iterator_create (utf8_str_p, buffer_size);
18531868

jerry-core/ecma/base/ecma-helpers.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -127,9 +127,12 @@ extern void ecma_deref_ecma_string (ecma_string_t *string_p);
127127
extern void ecma_check_that_ecma_string_need_not_be_freed (const ecma_string_t *string_p);
128128
extern ecma_number_t ecma_string_to_number (const ecma_string_t *str_p);
129129
extern bool ecma_string_get_array_index (const ecma_string_t *str_p, uint32_t *index);
130-
extern ssize_t ecma_string_to_utf8_string (const ecma_string_t *string_desc_p,
131-
lit_utf8_byte_t *buffer_p,
132-
ssize_t buffer_size);
130+
131+
extern ssize_t __attr_return_value_should_be_checked___
132+
ecma_string_to_utf8_string (const ecma_string_t *string_desc_p,
133+
lit_utf8_byte_t *buffer_p,
134+
ssize_t buffer_size);
135+
133136
extern bool ecma_compare_ecma_strings_equal_hashes (const ecma_string_t *string1_p,
134137
const ecma_string_t *string2_p);
135138
extern bool ecma_compare_ecma_strings (const ecma_string_t *string1_p,

jerry-core/ecma/builtin-objects/ecma-builtin-date.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,9 @@ ecma_builtin_date_parse (ecma_value_t this_arg __attr_unused___, /**< this argum
208208
lit_utf8_size_t date_str_size = ecma_string_get_size (date_str_p);
209209
MEM_DEFINE_LOCAL_ARRAY (date_start_p, date_str_size, lit_utf8_byte_t);
210210

211-
ecma_string_to_utf8_string (date_str_p, date_start_p, (ssize_t) date_str_size);
211+
ssize_t sz = ecma_string_to_utf8_string (date_str_p, date_start_p, (ssize_t) date_str_size);
212+
JERRY_ASSERT (sz >= 0);
213+
212214
lit_utf8_iterator_t iter = lit_utf8_iterator_create (date_start_p, date_str_size);
213215

214216
/* 1. read year */

jerry-core/ecma/builtin-objects/ecma-builtin-function.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,9 @@ ecma_builtin_function_helper_get_arguments (const ecma_value_t *arguments_list_p
9494
lit_utf8_size_t str_size = ecma_string_get_size (str_p);
9595
MEM_DEFINE_LOCAL_ARRAY (start_p, str_size, lit_utf8_byte_t);
9696

97-
ecma_string_to_utf8_string (str_p, start_p, (ssize_t) str_size);
97+
ssize_t sz = ecma_string_to_utf8_string (str_p, start_p, (ssize_t) str_size);
98+
JERRY_ASSERT (sz >= 0);
99+
98100
lit_utf8_iterator_t iter = lit_utf8_iterator_create (start_p, str_size);
99101

100102
while (!lit_utf8_iterator_is_eos (&iter))
@@ -190,7 +192,9 @@ ecma_builtin_function_dispatch_construct (const ecma_value_t *arguments_list_p,
190192

191193
MEM_DEFINE_LOCAL_ARRAY (start_p, str_size, lit_utf8_byte_t);
192194

193-
ecma_string_to_utf8_string (arguments_str_p, start_p, (ssize_t) str_size);
195+
ssize_t sz = ecma_string_to_utf8_string (arguments_str_p, start_p, (ssize_t) str_size);
196+
JERRY_ASSERT (sz >= 0);
197+
194198
lit_utf8_iterator_t iter = lit_utf8_iterator_create (start_p, str_size);
195199
ecma_length_t last_separator = lit_utf8_iterator_get_index (&iter);
196200
ecma_length_t end_position;

jerry-core/ecma/builtin-objects/ecma-builtin-global.cpp

Lines changed: 13 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -796,9 +796,11 @@ ecma_builtin_global_object_decode_uri_helper (ecma_value_t uri __attr_unused___,
796796
input_size + 1,
797797
lit_utf8_byte_t);
798798

799-
ecma_string_to_utf8_string (input_string_p,
800-
input_start_p,
801-
(ssize_t) (input_size));
799+
ssize_t sz = ecma_string_to_utf8_string (input_string_p,
800+
input_start_p,
801+
(ssize_t) (input_size));
802+
JERRY_ASSERT (sz >= 0);
803+
802804
input_start_p[input_size] = LIT_BYTE_NULL;
803805

804806
lit_utf8_byte_t *input_char_p = input_start_p;
@@ -1043,9 +1045,10 @@ ecma_builtin_global_object_encode_uri_helper (ecma_value_t uri, /**< uri argumen
10431045
input_size,
10441046
lit_utf8_byte_t);
10451047

1046-
ecma_string_to_utf8_string (input_string_p,
1047-
input_start_p,
1048-
(ssize_t) (input_size));
1048+
ssize_t sz = ecma_string_to_utf8_string (input_string_p,
1049+
input_start_p,
1050+
(ssize_t) (input_size));
1051+
JERRY_ASSERT (sz >= 0);
10491052

10501053
/*
10511054
* The URI encoding has two major phases: first we validate the input,
@@ -1230,9 +1233,10 @@ ecma_builtin_global_object_escape (ecma_value_t this_arg __attr_unused___, /**<
12301233
input_size,
12311234
lit_utf8_byte_t);
12321235

1233-
ecma_string_to_utf8_string (input_string_p,
1234-
input_start_p,
1235-
(ssize_t) (input_size));
1236+
ssize_t sz = ecma_string_to_utf8_string (input_string_p,
1237+
input_start_p,
1238+
(ssize_t) (input_size));
1239+
JERRY_ASSERT (sz >= 0);
12361240

12371241
/*
12381242
* The escape routine has two major phases: first we compute

jerry-core/ecma/builtin-objects/ecma-builtin-helpers.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -593,9 +593,10 @@ ecma_builtin_helper_string_prototype_object_index_of (ecma_value_t this_arg, /**
593593
original_size,
594594
lit_utf8_byte_t);
595595

596-
ecma_string_to_utf8_string (original_str_p,
597-
original_str_utf8_p,
598-
(ssize_t) (original_size));
596+
ssize_t sz = ecma_string_to_utf8_string (original_str_p,
597+
original_str_utf8_p,
598+
(ssize_t) (original_size));
599+
JERRY_ASSERT (sz >= 0);
599600

600601
lit_utf8_iterator_t original_it = lit_utf8_iterator_create (original_str_utf8_p, original_size);
601602

@@ -607,9 +608,10 @@ ecma_builtin_helper_string_prototype_object_index_of (ecma_value_t this_arg, /**
607608
search_size,
608609
lit_utf8_byte_t);
609610

610-
ecma_string_to_utf8_string (search_str_p,
611-
search_str_utf8_p,
612-
(ssize_t) (search_size));
611+
ssize_t sz = ecma_string_to_utf8_string (search_str_p,
612+
search_str_utf8_p,
613+
(ssize_t) (search_size));
614+
JERRY_ASSERT (sz >= 0);
613615

614616
lit_utf8_iterator_t search_it = lit_utf8_iterator_create (search_str_utf8_p, search_size);
615617

jerry-core/ecma/builtin-objects/ecma-builtin-json.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -836,7 +836,9 @@ ecma_builtin_json_parse (ecma_value_t this_arg __attr_unused___, /**< 'this' arg
836836

837837
MEM_DEFINE_LOCAL_ARRAY (str_start_p, buffer_size, lit_utf8_byte_t);
838838

839-
ecma_string_to_utf8_string (string_p, str_start_p, (ssize_t) buffer_size);
839+
ssize_t sz = ecma_string_to_utf8_string (string_p, str_start_p, (ssize_t) buffer_size);
840+
JERRY_ASSERT (sz == (ssize_t) string_size);
841+
840842
str_start_p[string_size] = LIT_BYTE_NULL;
841843

842844
ecma_json_token_t token;

jerry-core/ecma/builtin-objects/ecma-builtin-string-prototype.cpp

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -364,9 +364,10 @@ ecma_builtin_string_prototype_object_index_of (ecma_value_t this_arg, /**< this
364364
original_size,
365365
lit_utf8_byte_t);
366366

367-
ecma_string_to_utf8_string (original_str_p,
368-
original_str_utf8_p,
369-
(ssize_t) (original_size));
367+
ssize_t sz = ecma_string_to_utf8_string (original_str_p,
368+
original_str_utf8_p,
369+
(ssize_t) (original_size));
370+
JERRY_ASSERT (sz >= 0);
370371

371372
lit_utf8_iterator_t original_it = lit_utf8_iterator_create (original_str_utf8_p, original_size);
372373

@@ -378,9 +379,10 @@ ecma_builtin_string_prototype_object_index_of (ecma_value_t this_arg, /**< this
378379
search_size,
379380
lit_utf8_byte_t);
380381

381-
ecma_string_to_utf8_string (search_str_p,
382-
search_str_utf8_p,
383-
(ssize_t) (search_size));
382+
ssize_t sz = ecma_string_to_utf8_string (search_str_p,
383+
search_str_utf8_p,
384+
(ssize_t) (search_size));
385+
JERRY_ASSERT (sz >= 0);
384386

385387
lit_utf8_iterator_t search_it = lit_utf8_iterator_create (search_str_utf8_p, search_size);
386388

@@ -888,9 +890,10 @@ ecma_builtin_string_prototype_object_replace_match (ecma_builtin_replace_search_
888890
search_size,
889891
lit_utf8_byte_t);
890892

891-
ecma_string_to_utf8_string (search_string_p,
892-
search_start_p,
893-
(ssize_t) (search_size));
893+
ssize_t sz = ecma_string_to_utf8_string (search_string_p,
894+
search_start_p,
895+
(ssize_t) (search_size));
896+
JERRY_ASSERT (sz >= 0);
894897

895898
ecma_string_t *input_string_p = ecma_get_string_from_value (context_p->input_string);
896899
lit_utf8_size_t input_size = ecma_string_get_size (input_string_p);
@@ -899,9 +902,10 @@ ecma_builtin_string_prototype_object_replace_match (ecma_builtin_replace_search_
899902
input_size,
900903
lit_utf8_byte_t);
901904

902-
ecma_string_to_utf8_string (input_string_p,
903-
input_start_p,
904-
(ssize_t) (input_size));
905+
ssize_t sz = ecma_string_to_utf8_string (input_string_p,
906+
input_start_p,
907+
(ssize_t) (input_size));
908+
JERRY_ASSERT (sz >= 0);
905909

906910
lit_utf8_iterator_t search_iterator = lit_utf8_iterator_create (search_start_p, search_size);
907911
lit_utf8_iterator_t input_iterator = lit_utf8_iterator_create (input_start_p, input_size);
@@ -1409,9 +1413,10 @@ ecma_builtin_string_prototype_object_replace_main (ecma_builtin_replace_search_c
14091413
replace_size,
14101414
lit_utf8_byte_t);
14111415

1412-
ecma_string_to_utf8_string (replace_string_p,
1413-
replace_start_p,
1414-
(ssize_t) (replace_size));
1416+
ssize_t sz = ecma_string_to_utf8_string (replace_string_p,
1417+
replace_start_p,
1418+
(ssize_t) (replace_size));
1419+
JERRY_ASSERT (sz >= 0);
14151420

14161421
context_p->replace_string_p = replace_string_p;
14171422
context_p->replace_iterator = lit_utf8_iterator_create (replace_start_p, replace_size);
@@ -2284,9 +2289,10 @@ ecma_builtin_string_prototype_object_conversion_helper (ecma_value_t this_arg, /
22842289
input_size,
22852290
lit_utf8_byte_t);
22862291

2287-
ecma_string_to_utf8_string (input_string_p,
2288-
input_start_p,
2289-
(ssize_t) (input_size));
2292+
ssize_t sz = ecma_string_to_utf8_string (input_string_p,
2293+
input_start_p,
2294+
(ssize_t) (input_size));
2295+
JERRY_ASSERT (sz >= 0);
22902296

22912297
/*
22922298
* The URI encoding has two major phases: first we compute
@@ -2503,7 +2509,8 @@ ecma_builtin_string_prototype_object_trim (ecma_value_t this_arg) /**< this argu
25032509
/* Workaround: avoid repeated call of ecma_string_get_char_at_pos() because its overhead */
25042510
lit_utf8_byte_t *original_utf8_str_p = (lit_utf8_byte_t *) mem_heap_alloc_block (size + 1,
25052511
MEM_HEAP_ALLOC_SHORT_TERM);
2506-
ecma_string_to_utf8_string (original_string_p, original_utf8_str_p, (ssize_t) size);
2512+
ssize_t sz = ecma_string_to_utf8_string (original_string_p, original_utf8_str_p, (ssize_t) size);
2513+
JERRY_ASSERT (sz >= 0);
25072514

25082515
const ecma_length_t length = lit_utf8_string_length (original_utf8_str_p, size);
25092516

jerry-core/ecma/operations/ecma-regexp-object.cpp

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,9 @@ re_parse_regexp_flags (ecma_string_t *flags_str_p, /**< Input string with flags
7171
lit_utf8_size_t flags_str_size = ecma_string_get_size (flags_str_p);
7272
MEM_DEFINE_LOCAL_ARRAY (flags_start_p, flags_str_size, lit_utf8_byte_t);
7373

74-
ecma_string_to_utf8_string (flags_str_p, flags_start_p, (ssize_t) flags_str_size);
74+
ssize_t sz = ecma_string_to_utf8_string (flags_str_p, flags_start_p, (ssize_t) flags_str_size);
75+
JERRY_ASSERT (sz >= 0);
76+
7577
lit_utf8_iterator_t iter = lit_utf8_iterator_create (flags_start_p, flags_str_size);
7678

7779
while (!lit_utf8_iterator_is_eos (&iter)
@@ -1236,7 +1238,9 @@ ecma_regexp_exec_helper (ecma_value_t regexp_value, /**< RegExp object */
12361238

12371239
MEM_DEFINE_LOCAL_ARRAY (input_utf8_buffer_p, input_string_size, lit_utf8_byte_t);
12381240

1239-
ecma_string_to_utf8_string (input_string_p, input_utf8_buffer_p, (ssize_t) input_string_size);
1241+
ssize_t sz = ecma_string_to_utf8_string (input_string_p, input_utf8_buffer_p, (ssize_t) input_string_size);
1242+
JERRY_ASSERT (sz >= 0);
1243+
12401244
lit_utf8_iterator_t iterator = lit_utf8_iterator_create (input_utf8_buffer_p, input_string_size);
12411245

12421246
re_matcher_ctx_t re_ctx;

jerry-core/jrt/jrt.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
#define __noreturn __attribute__((noreturn))
3030
#define __attr_noinline___ __attribute__((noinline))
3131
#define __attr_used___ __attribute__((used))
32+
#define __attr_return_value_should_be_checked___ __attribute__((warn_unused_result))
3233
#ifndef __attr_always_inline___
3334
# define __attr_always_inline___ __attribute__((always_inline))
3435
#endif /* !__attr_always_inline___ */

0 commit comments

Comments
 (0)