apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Jim Jagielski <...@jaguNET.com>
Subject Re: %lld/%llu not handled by apr_vformatter
Date Wed, 11 Aug 2010 18:38:53 GMT
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);
>> }

View raw message