@@ -48,8 +48,8 @@ static rt_err_t generate_unique_name(char *buf, rt_size_t size, const char *pref
48
48
49
49
/* Check if name (or truncated name) is unique */
50
50
if (rt_object_find (buf , RT_Object_Class_Unknown ) == RT_NULL &&
51
- rt_thread_find (buf ) == RT_NULL &&
52
- rt_device_find (buf ) == RT_NULL )
51
+ rt_thread_find (buf ) == RT_NULL &&
52
+ rt_device_find (buf ) == RT_NULL )
53
53
{
54
54
return RT_EOK ;
55
55
}
@@ -61,8 +61,20 @@ static void test_object_name_handling(void)
61
61
{
62
62
struct rt_object static_obj1 , static_obj2 , static_obj3 ;
63
63
rt_object_t dyn_obj = RT_NULL ;
64
- char test_name [TEST_RT_NAME_MAX ];
65
- char unique_name [TEST_RT_NAME_MAX ];
64
+ char * test_name = RT_NULL ;
65
+ char * unique_name = RT_NULL ;
66
+ char * exact_name = RT_NULL ;
67
+
68
+ /* Allocate memory for test names to reduce stack usage */
69
+ test_name = (char * )rt_malloc (TEST_RT_NAME_MAX );
70
+ unique_name = (char * )rt_malloc (TEST_RT_NAME_MAX );
71
+ exact_name = (char * )rt_malloc (TEST_RT_NAME_MAX );
72
+
73
+ if (!test_name || !unique_name || !exact_name )
74
+ {
75
+ rt_kprintf ("Memory allocation failed in test_object_name_handling\n" );
76
+ goto cleanup ;
77
+ }
66
78
67
79
/* Prepare a test name within TEST_RT_NAME_MAX */
68
80
rt_memset (test_name , 'A' , TEST_RT_NAME_MAX - 1 );
@@ -100,23 +112,36 @@ static void test_object_name_handling(void)
100
112
rt_object_delete (dyn_obj );
101
113
102
114
/* Test 4: Exact Length Name */
103
- char exact_name [TEST_RT_NAME_MAX ];
104
115
rt_memset (exact_name , 'B' , TEST_RT_NAME_MAX - 1 );
105
116
exact_name [TEST_RT_NAME_MAX - 1 ] = '\0' ;
106
117
uassert_true (generate_unique_name (unique_name , TEST_RT_NAME_MAX , "exact" ) == RT_EOK );
107
118
rt_object_init (& static_obj3 , RT_Object_Class_Thread , exact_name );
108
119
uassert_str_equal (static_obj3 .name , exact_name );
109
120
rt_object_detach (& static_obj3 );
121
+
122
+ cleanup :
123
+ /* Free allocated memory */
124
+ if (test_name ) rt_free (test_name );
125
+ if (unique_name ) rt_free (unique_name );
126
+ if (exact_name ) rt_free (exact_name );
110
127
}
111
128
112
129
static void test_object_find_operations (void )
113
130
{
114
131
rt_object_t found ;
115
132
rt_thread_t found_thread ;
116
133
rt_device_t found_device ;
117
- char name [ TEST_RT_NAME_MAX ] ;
134
+ char * name = RT_NULL ;
118
135
rt_err_t ret ;
119
136
137
+ /* Allocate memory for name buffer to reduce stack usage */
138
+ name = (char * )rt_malloc (TEST_RT_NAME_MAX );
139
+ if (!name )
140
+ {
141
+ rt_kprintf ("Memory allocation failed in test_object_find_operations\n" );
142
+ return ;
143
+ }
144
+
120
145
/* Scenario 1: Object Name Within TEST_RT_NAME_MAX */
121
146
/* Test 1.1: Find static thread object with rt_object_find */
122
147
struct rt_object static_obj ;
@@ -154,8 +179,8 @@ static void test_object_find_operations(void)
154
179
/* Test 2: Same Prefix Within TEST_RT_NAME_MAX */
155
180
#ifdef RT_USING_DEVICE
156
181
struct rt_device dev1 , dev2 ;
157
- char name1 [TEST_RT_NAME_MAX ] = "norflash1" ;
158
- char name2 [TEST_RT_NAME_MAX ] = "norflash2" ;
182
+ const char name1 [] = "norflash1" ;
183
+ const char name2 [] = "norflash2" ;
159
184
ret = rt_device_register (& dev1 , name1 , RT_DEVICE_FLAG_RDONLY );
160
185
uassert_int_equal (ret , RT_EOK );
161
186
ret = rt_device_register (& dev2 , name2 , RT_DEVICE_FLAG_RDONLY );
@@ -188,13 +213,24 @@ static void test_object_find_operations(void)
188
213
found_device = rt_device_find (NULL );
189
214
uassert_null (found_device );
190
215
#endif
216
+
217
+ /* Free allocated memory */
218
+ rt_free (name );
191
219
}
192
220
193
221
static void test_object_info_enumeration (void )
194
222
{
195
223
struct rt_object static_objs [3 ];
196
224
rt_object_t dyn_objs [2 ] = {RT_NULL , RT_NULL };
197
- char names [5 ][TEST_RT_NAME_MAX ];
225
+ char (* names )[TEST_RT_NAME_MAX ] = RT_NULL ;
226
+
227
+ /* Allocate memory for names array to reduce stack usage */
228
+ names = (char (* )[TEST_RT_NAME_MAX ])rt_malloc (5 * TEST_RT_NAME_MAX );
229
+ if (!names )
230
+ {
231
+ rt_kprintf ("Memory allocation failed in test_object_info_enumeration\n" );
232
+ return ;
233
+ }
198
234
199
235
/* Generate unique names */
200
236
for (int i = 0 ; i < 5 ; i ++ )
@@ -254,12 +290,27 @@ static void test_object_info_enumeration(void)
254
290
rt_object_detach (& static_objs [i ]);
255
291
for (int i = 0 ; i < 2 ; i ++ )
256
292
if (dyn_objs [i ]) rt_object_delete (dyn_objs [i ]);
293
+
294
+ /* Free allocated memory */
295
+ rt_free (names );
257
296
}
258
297
259
298
static void test_object_type_handling (void )
260
299
{
261
300
struct rt_object obj ;
262
- char name [TEST_RT_NAME_MAX ];
301
+ char * name = RT_NULL ;
302
+ char * name_buf = RT_NULL ;
303
+
304
+ /* Allocate memory for name buffers to reduce stack usage */
305
+ name = (char * )rt_malloc (TEST_RT_NAME_MAX );
306
+ name_buf = (char * )rt_malloc (TEST_RT_NAME_MAX );
307
+
308
+ if (!name || !name_buf )
309
+ {
310
+ rt_kprintf ("Memory allocation failed in test_object_type_handling\n" );
311
+ goto cleanup ;
312
+ }
313
+
263
314
uassert_true (generate_unique_name (name , TEST_RT_NAME_MAX , "typ" ) == RT_EOK );
264
315
rt_object_init (& obj , RT_Object_Class_Thread , name );
265
316
@@ -270,8 +321,7 @@ static void test_object_type_handling(void)
270
321
uassert_true (rt_object_is_systemobject (& obj ));
271
322
272
323
/* Test 3: Get name with sufficient buffer */
273
- char name_buf [TEST_RT_NAME_MAX ];
274
- rt_err_t ret = rt_object_get_name (& obj , name_buf , sizeof (name_buf ));
324
+ rt_err_t ret = rt_object_get_name (& obj , name_buf , TEST_RT_NAME_MAX );
275
325
uassert_int_equal (ret , RT_EOK );
276
326
uassert_str_equal (name_buf , name );
277
327
@@ -283,14 +333,19 @@ static void test_object_type_handling(void)
283
333
uassert_true (small_buf [sizeof (small_buf ) - 1 ] == '\0' );
284
334
285
335
/* Test 5: Get name with invalid parameters */
286
- ret = rt_object_get_name (RT_NULL , name_buf , sizeof ( name_buf ) );
336
+ ret = rt_object_get_name (RT_NULL , name_buf , TEST_RT_NAME_MAX );
287
337
uassert_int_equal (ret , - RT_EINVAL );
288
- ret = rt_object_get_name (& obj , NULL , sizeof ( name_buf ) );
338
+ ret = rt_object_get_name (& obj , NULL , TEST_RT_NAME_MAX );
289
339
uassert_int_equal (ret , - RT_EINVAL );
290
340
ret = rt_object_get_name (& obj , name_buf , 0 );
291
341
uassert_int_equal (ret , - RT_EINVAL );
292
342
293
343
rt_object_detach (& obj );
344
+
345
+ cleanup :
346
+ /* Free allocated memory */
347
+ if (name ) rt_free (name );
348
+ if (name_buf ) rt_free (name_buf );
294
349
}
295
350
296
351
static rt_err_t testcase_init (void )
@@ -310,7 +365,7 @@ static rt_err_t testcase_cleanup(void)
310
365
311
366
static void test_object_suite (void )
312
367
{
313
- #ifdef RT_NAME_MAX < 10
368
+ #if RT_NAME_MAX < 10
314
369
rt_kprintf ("Error: Please increase \'RT_NAME_MAX\' to be greater than 10.\n" );
315
370
return ;
316
371
#endif
0 commit comments