ping

On 10/08/2015 04:59 PM, Vicente Olivert Riera wrote:
> /* Verify that we can safely cast arch_addr_t* to unw_word_t*. */
> (void)sizeof(char[1 - 2*(sizeof(unw_word_t) != sizeof(arch_addr_t))]);
> 
> This check will always fail for MIPS 32-bit architectures (the only ones
> supported by ltrace) because unw_word_t is 64-bit sized (it's actually a
> uint64_t) and arch_add_t (which is void*) is 32-bit sized:
> 
> output.c:784:3: error: size of unnamed array is negative
> 
> So do the check in a different way that works for all architectures.
> 
> Signed-off-by: Vicente Olivert Riera <[email protected]>
> ---
>  output.c |   24 +++++++++++++++---------
>  1 files changed, 15 insertions(+), 9 deletions(-)
> 
> diff --git a/output.c b/output.c
> index b63befe..e166554 100644
> --- a/output.c
> +++ b/output.c
> @@ -773,27 +773,28 @@ output_right(enum tof type, struct process *proc, 
> struct library_symbol *libsym,
>           && proc->unwind_as != NULL) {
>               unw_cursor_t cursor;
>               arch_addr_t ip, function_offset;
> +             unw_word_t uw_ip, uw_function_offset;
>               struct library *lib = NULL;
>               int unwind_depth = options.bt_depth;
>               char fn_name[100];
>               const char *lib_name;
>               size_t distance;
>  
> -             /* Verify that we can safely cast arch_addr_t* to
> -              * unw_word_t*.  */
> -             (void)sizeof(char[1 - 2*(sizeof(unw_word_t)
> -                                     != sizeof(arch_addr_t))]);
>               unw_init_remote(&cursor, proc->unwind_as, proc->unwind_priv);
>               while (unwind_depth) {
>  
> -                     int rc = unw_get_reg(&cursor, UNW_REG_IP,
> -                                          (unw_word_t *) &ip);
> +                     int rc = unw_get_reg(&cursor, UNW_REG_IP, &uw_ip);
> +
>                       if (rc < 0) {
>                               fprintf(options.output, " > Error: %s\n",
>                                       unw_strerror(rc));
>                               goto cont;
>                       }
>  
> +                     // Verify that we can safely cast arch_addr_t* to 
> unw_word_t*.
> +                     ip = (arch_addr_t) uw_ip;
> +                     assert(uw_ip == (unw_word_t) ip);
> +
>                       /* We are looking for the library with the base address
>                        * closest to the current ip.  */
>                       lib_name = "unmapped_area";
> @@ -814,13 +815,18 @@ output_right(enum tof type, struct process *proc, 
> struct library_symbol *libsym,
>  
>                       rc = unw_get_proc_name(&cursor, fn_name,
>                                              sizeof(fn_name),
> -                                            (unw_word_t *) &function_offset);
> -                     if (rc == 0 || rc == -UNW_ENOMEM)
> +                                            &uw_function_offset);
> +                     if (rc == 0 || rc == -UNW_ENOMEM) {
> +                             // Verify that we can safely cast arch_addr_t* 
> to unw_word_t*.
> +                             function_offset = (arch_addr_t) 
> uw_function_offset;
> +                             assert(uw_function_offset == (unw_word_t) 
> function_offset);
> +
>                               fprintf(options.output, " > %s(%s+%p) [%p]\n",
>                                       lib_name, fn_name, function_offset, ip);
> -                     else
> +                     } else {
>                               fprintf(options.output, " > %s(??\?) [%p]\n",
>                                       lib_name, ip);
> +                     }
>  
>               cont:
>                       if (unw_step(&cursor) <= 0)
> 

_______________________________________________
Ltrace-devel mailing list
[email protected]
http://lists.alioth.debian.org/cgi-bin/mailman/listinfo/ltrace-devel

Reply via email to