apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Chris Knight <christopher.d.kni...@nasa.gov>
Subject Re: %lld/%llu not handled by apr_vformatter
Date Wed, 11 Aug 2010 18:42:20 GMT
How does libc do printf for %lld for universal binaries?

On Aug 11, 2010, at 11:38 AM, Jim Jagielski wrote:

> Universal binaries for OS X and APR are not supported. I must
> force either 32 or 64 bit... Attempts to fix this at the
> APR level have been vetoed and so no further effort can
> be done.
> 
> The long and short of it (no pun intended) is that under
> OS X and universal binaries, you can no longer have
> some type lengths statically defined in *.h files as
> being a certain number of bits. Instead, the APR *.h files
> would require some internal #if tests which "looks" to see
> how the package is being compiled and then selects the
> correct set of bit sizes... This was deemed "too ugly"
> and was vetoed.
> 
> For hints, I would encourage people to see how MacPorts
> works around this...
> 
> On Aug 11, 2010, at 12:02 PM, Hyrum K. Wright wrote:
> 
>> Unfortunately, you seem to have found the same bug I uncovered in March:
>> http://mail-archives.apache.org/mod_mbox/apr-dev/201003.mbox/%3Cb51ffb6f1003100926n22c1dd79id9696972b23a153a@mail.gmail.com%3E
>> 
>> To my knowledge it hasn't been fixed, thought that thread does include
>> a somewhat hacky patch to work around the issue.  Perhaps it will be
>> of use to you.
>> 
>> -Hyrum
>> 
>> On Wed, Aug 11, 2010 at 10:51 AM, Chris Knight
>> <Christopher.D.Knight@nasa.gov> wrote:
>>> I spent half-a-day yesterday trying to figure out why I was crashing in apr_psprintf
on a strlen until I realized that my "%llu%s" format string was causing it to use my long
long int as a char *.
>>> 
>>> Needless to say, no harm in adding support for %ll[du] yes?
>>> 
>>> Ah, 64-bit fun for everyone....
>>> 
>>> Example code:
>>> 
>>> #include <apr.h>
>>> #include <apr_pools.h>
>>> #include <apr_strings.h>
>>> #include <stdio.h>
>>> 
>>> int main(int argc, char **argv) {
>>>   apr_pool_t *pool = NULL;
>>>   char *s = "hello world"; u_int64_t v = 12345678;
>>> 
>>>   apr_pool_initialize(); apr_pool_create(&(pool), NULL);
>>>   printf("%llu%s", v, s); // works
>>>   char *f = apr_psprintf(pool, "%llu%s", v, s); // segfault on strlen
>>>   printf("%s\n", f);
>>> }
>> 
> 


Mime
View raw message