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?
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?
Hi DLyall,
Replace (unsigned int) by (unsigned long).
Cheers!
Stefan
Replace (unsigned int) by (unsigned long).
Cheers!
Stefan
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
I suspect that the code should recast the return value of sscanf(), not the pointer being passed.
Kent
Out of topic: I wonder how this is working -
char tmp[30];
memset(&tmp, 0, 30 ); // should be tmp and not &tmp
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
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
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
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