/* 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)
-- 
1.7.1


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

Reply via email to