@@ -453,7 +453,8 @@ impl ParameterValue {
453453 . map ( u8:: from)
454454 . sum ( ) ;
455455 assert_eq ! ( num_active, 1 ) ;
456- // Note: This code has no unsafe blocks because it is inside an unsafe function.
456+ // Note: Unsafe blocks below are necessary to dereference raw pointers
457+ // and call unsafe functions like CStr::from_ptr.
457458 // In general, the following operations are as safe as they can be, because
458459 // only non-null pointers are dereferenced, and strings and arrays are copied immediately,
459460 // so there are no concerns about choosing the correct lifetime.
@@ -462,43 +463,55 @@ impl ParameterValue {
462463 // However, it cannot be checked that it points to a valid value. Similarly for array sizes.
463464 // This is why this function must be unsafe itself.
464465 if !var. bool_value . is_null ( ) {
465- ParameterValue :: Bool ( * var. bool_value )
466+ unsafe { ParameterValue :: Bool ( * var. bool_value ) }
466467 } else if !var. integer_value . is_null ( ) {
467- ParameterValue :: Integer ( * var. integer_value )
468+ unsafe { ParameterValue :: Integer ( * var. integer_value ) }
468469 } else if !var. double_value . is_null ( ) {
469- ParameterValue :: Double ( * var. double_value )
470+ unsafe { ParameterValue :: Double ( * var. double_value ) }
470471 } else if !var. string_value . is_null ( ) {
471- let cstr = CStr :: from_ptr ( var. string_value ) ;
472- let s = cstr. to_string_lossy ( ) . into_owned ( ) ;
473- ParameterValue :: String ( s. into ( ) )
472+ unsafe {
473+ let cstr = CStr :: from_ptr ( var. string_value ) ;
474+ let s = cstr. to_string_lossy ( ) . into_owned ( ) ;
475+ ParameterValue :: String ( s. into ( ) )
476+ }
474477 } else if !var. byte_array_value . is_null ( ) {
475- let rcl_byte_array = & * var. byte_array_value ;
476- let slice = rcl_from_raw_parts ( rcl_byte_array. values , rcl_byte_array. size ) ;
477- ParameterValue :: ByteArray ( slice. into ( ) )
478+ unsafe {
479+ let rcl_byte_array = & * var. byte_array_value ;
480+ let slice = rcl_from_raw_parts ( rcl_byte_array. values , rcl_byte_array. size ) ;
481+ ParameterValue :: ByteArray ( slice. into ( ) )
482+ }
478483 } else if !var. bool_array_value . is_null ( ) {
479- let rcl_bool_array = & * var. bool_array_value ;
480- let slice = rcl_from_raw_parts ( rcl_bool_array. values , rcl_bool_array. size ) ;
481- ParameterValue :: BoolArray ( slice. into ( ) )
484+ unsafe {
485+ let rcl_bool_array = & * var. bool_array_value ;
486+ let slice = rcl_from_raw_parts ( rcl_bool_array. values , rcl_bool_array. size ) ;
487+ ParameterValue :: BoolArray ( slice. into ( ) )
488+ }
482489 } else if !var. integer_array_value . is_null ( ) {
483- let rcl_integer_array = & * var. integer_array_value ;
484- let slice = rcl_from_raw_parts ( rcl_integer_array. values , rcl_integer_array. size ) ;
485- ParameterValue :: IntegerArray ( slice. into ( ) )
490+ unsafe {
491+ let rcl_integer_array = & * var. integer_array_value ;
492+ let slice = rcl_from_raw_parts ( rcl_integer_array. values , rcl_integer_array. size ) ;
493+ ParameterValue :: IntegerArray ( slice. into ( ) )
494+ }
486495 } else if !var. double_array_value . is_null ( ) {
487- let rcl_double_array = & * var. double_array_value ;
488- let slice = rcl_from_raw_parts ( rcl_double_array. values , rcl_double_array. size ) ;
489- ParameterValue :: DoubleArray ( slice. into ( ) )
496+ unsafe {
497+ let rcl_double_array = & * var. double_array_value ;
498+ let slice = rcl_from_raw_parts ( rcl_double_array. values , rcl_double_array. size ) ;
499+ ParameterValue :: DoubleArray ( slice. into ( ) )
500+ }
490501 } else if !var. string_array_value . is_null ( ) {
491- let rcutils_string_array = & * var. string_array_value ;
492- let slice = rcl_from_raw_parts ( rcutils_string_array. data , rcutils_string_array. size ) ;
493- let strings = slice
494- . iter ( )
495- . map ( |& ptr| {
496- debug_assert ! ( !ptr. is_null( ) ) ;
497- let cstr = CStr :: from_ptr ( ptr) ;
498- Arc :: from ( cstr. to_string_lossy ( ) )
499- } )
500- . collect :: < Vec < _ > > ( ) ;
501- ParameterValue :: StringArray ( strings. into ( ) )
502+ unsafe {
503+ let rcutils_string_array = & * var. string_array_value ;
504+ let slice = rcl_from_raw_parts ( rcutils_string_array. data , rcutils_string_array. size ) ;
505+ let strings = slice
506+ . iter ( )
507+ . map ( |& ptr| {
508+ debug_assert ! ( !ptr. is_null( ) ) ;
509+ let cstr = CStr :: from_ptr ( ptr) ;
510+ Arc :: from ( cstr. to_string_lossy ( ) )
511+ } )
512+ . collect :: < Vec < _ > > ( ) ;
513+ ParameterValue :: StringArray ( strings. into ( ) )
514+ }
502515 } else {
503516 unreachable ! ( )
504517 }
0 commit comments