[PATCH] backtrace.c: Fix word cast to a pointer

Matt Turner mattst88 at gmail.com
Wed Jan 7 22:38:33 PST 2015


On Mon, Jan 5, 2015 at 8:22 AM, Vicente Olivert Riera
<Vincent.Riera at imgtec.com> wrote:
> backtrace.c uses a word size provided by libunwind. In some
> architectures like MIPS, libunwind makes that word size 64-bit for all
> variants of the architecture.
>
> In the lines #90 and #98, backtrace.c tries to do a cast to a pointer,
> which fails in all MIPS variants with 32-bit pointers, like MIPS32 or
> MIPS64 n32, because it's trying to do a cast from a 64-bit wide variable
> to a 32-bit pointer:
>
> Making all in os
> make[2]: Entering directory
> `/home/test/test/1/output/build/xserver_xorg-server-1.15.1/os'
>   CC     WaitFor.lo
>   CC     access.lo
>   CC     auth.lo
>   CC     backtrace.lo
> backtrace.c: In function 'xorg_backtrace':
> backtrace.c:90:20: error: cast to pointer from integer of different size
> [-Werror=int-to-pointer-cast]
>          if (dladdr((void *)(pip.start_ip + off), &dlinfo) &&
> dlinfo.dli_fname &&
>                     ^
> backtrace.c:98:13: error: cast to pointer from integer of different size
> [-Werror=int-to-pointer-cast]
>              (void *)(pip.start_ip + off));
>              ^
> cc1: some warnings being treated as errors
> make[2]: *** [backtrace.lo] Error 1
> make[2]: *** Waiting for unfinished jobs....
>
> Making the cast to a pointer-sized integer, and then to a pointer fixes
> the problem.
>
> Related:
>   https://bugs.freedesktop.org/show_bug.cgi?id=79939
>
> Signed-off-by: Vicente Olivert Riera <Vincent.Riera at imgtec.com>
> ---
>  os/backtrace.c |    4 ++--
>  1 files changed, 2 insertions(+), 2 deletions(-)
>
> diff --git a/os/backtrace.c b/os/backtrace.c
> index 3d1195b..3c101ae 100644
> --- a/os/backtrace.c
> +++ b/os/backtrace.c
> @@ -87,7 +87,7 @@ xorg_backtrace(void)
>              procname[1] = 0;
>          }
>
> -        if (dladdr((void *)(pip.start_ip + off), &dlinfo) && dlinfo.dli_fname &&
> +        if (dladdr((void *)(long)(pip.start_ip + off), &dlinfo) && dlinfo.dli_fname &&

You should cast to the integer type that's actually specified to be
the same size as a pointer, intptr_t. That's what it's there for.


More information about the xorg-devel mailing list