Follow @Openwall on Twitter for new release announcements and other news
[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Date: Fri, 14 Dec 2012 16:59:57 +0400
From: ojab <ojab@...b.ru>
To: musl@...ts.openwall.com
Subject: Re: spandsp build, lrint/sqrt/pow issue

On 14.12.2012 16:40, Szabolcs Nagy wrote:
> * ojab <ojab@...b.ru> [2012-12-14 13:49:57 +0400]:
>> spandsp library (which is used in FreeSWITCH/Asterisk/Yate/many
>> commercial solutions/etc) build fails with (first error):
>>
>>> In file included from awgn.c:59:0:
>>> spandsp/saturated.h: In function 'fsaturate':
>>> spandsp/saturated.h:184:22: warning: cast to pointer from integer of different size
>>> spandsp/saturated.h:184:22: warning: cast to pointer from integer of different size
>>> spandsp/saturated.h:184:5: error: invalid use of void expression
>>
>> line 184 is return statement in
>>> static __inline__ int16_t fsaturate(double damp)
>>> {
>>>     if (damp > (double) INT16_MAX)
>>>         return INT16_MAX;
>>>     if (damp < (double) INT16_MIN)
>>>         return INT16_MIN;
>>>     return (int16_t) lrint(damp);
>>> }
>
> this is a bug in musl's tgmath.h
> (incorrectly casted the return value to a floating-point type)
>
> thanks for catching it, i pushed a fix to my math repo
> (also attached)
>
>> awgn.i can be found in the attached file. The same errors happens
>> with pow() and sqrt() functions.
>
> i don't see problems with pow or sqrt
>
> they seem to use sqrt(log(something)) which expands to a very
> long expression, but otherwise it should work
>
> actually they shouldn't use tgmath.h at all
> (it could be useful if they used a custom floating-point type that
> is typedefed to float,double or long double in some header, but
> they seem to use plain doubles everywhere)
>
> so you can fix the issue by replacing tgmath.h with math.h in that file
> (and maybe report the issue upstream, tgmath.h is a header
> that is hard to get right, can cause cryptic error messages,
> and is very rarely used, so it should be avoided when possible)
>

Thanks for the quick fix, lrint issue is fixed. Right now build fails 
only on sqrt() and pow():
awgn.c: In function 'awgn_init_dbov':
awgn.c:109:14: warning: cast to pointer from integer of different size
awgn.c:109:14: warning: cast to pointer from integer of different size
awgn.c:109:14: warning: cast to pointer from integer of different size
awgn.c:109:5: error: void value not ignored as it ought to be

and line 109:
   s->rms = pow(10.0, level/20.0)*32768.0;


Next issue is
awgn.c: In function 'awgn':
awgn.c:165:15: warning: cast to pointer from integer of different size
awgn.c:165:15: warning: cast to pointer from integer of different size
awgn.c:165:9: error: void value not ignored as it ought to be
awgn.c:165:9: warning: type defaults to 'int' in type name

and line 165:
         fac = sqrt(-2.0*log(r)/r);


So I suppose the fix is needed (don't know if it should be on musl side 
though).
spandsp use tgmath.h only if available, so if I'll remove tgmath.h or 
undefine HAVE_TGMATH_H — spandsp builds fine.


//wbr ojab

Powered by blists - more mailing lists

Confused about mailing lists and their use? Read about mailing lists on Wikipedia and check out these guidelines on proper formatting of your messages.