Link to home
Start Free TrialLog in
Avatar of DLyall
DLyall

asked on

sscanf causing core dump

I have come across a bit of code that uses sscanf.  The function containing it is as follwos,

void f_extract_n(char *string, SINT *value, short *ind, int len )
{
    char    tmp[30];

    memset(&tmp, 0, 30 );
    strncpy( tmp, string, len );
printf("calling sscanf\n");
    if ( (sscanf(tmp, "%d", (unsigned int) value )) == EOF )
        *ind   = -1;
printf("sscanf ok\n");

    return;
}

When run under AIX 4.3(32bit) it works fine (where value in tmp is "001108") but when run under AIX 5.2(64 bit) the sscanf is core dumping (same value of tmp).  If I remove the (unsigned int) cast it works ok.  Can anyone tell me why the (unsigned int) cast is causing the core dump?
Avatar of Kent Olsen
Kent Olsen
Flag of United States of America image


sscanf needs a target location to place the converted value.  In this case you're recasting an address into an integer!  C is dutifully placing the integer on the stack prior to calling sscanf() and using this value as the address to store the conversion.

I suspect that the recast to an int (32-bits?) is dropping the upper 32 bits of the 64-bit address in the *value parameter.


Kent
Hi DLyall,
Replace (unsigned int) by (unsigned long).


Cheers!

Stefan
ASKER CERTIFIED SOLUTION
Avatar of Kent Olsen
Kent Olsen
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial

I suspect that the code should recast the return value of sscanf(), not the pointer being passed.

Kent
Avatar of AlexFM
AlexFM

Out of topic: I wonder how this is working -

char    tmp[30];
memset(&tmp, 0, 30 );         // should be tmp and not &tmp
although memset(&tmp, 0, 30) is used wrongly, it can still work, only zeroing some other memory

I believe that the compiler will simply disregard the unnecessarey '&'.  Depending on the compiler options, it should produce a "superfluous '&'" warning.

Kent

Avatar of DLyall

ASKER

Cheers Kent

Removing the cast works on both the 32 and 64 bit environments.  Also I output the values of &tmp and tmp and they are the same so it looks like the & is ignored at compile time.

Thanks for your Help

Don