[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