I had a bug today because Integer parsing wasn't detecting any errors
while parsing a string with leading space: e.g. " -152". Once I
realised that, I noticed that integer parsing for negative numbers is
like totally broken as well, since it silently treats the '-' sign as
a digit with value == radix...
Suggesting a bug fix + a couple error detection changes to the code.
Original Code:
template <class T>
static Integer StringToInteger(const T *str)
{
int radix;
// GCC workaround
// std::char_traits<wchar_t>::length() not defined in GCC 3.2 and
STLport 4.5.3
unsigned int length;
for (length = 0; str[length] != 0; length++) {}
Integer v;
if (length == 0)
return v;
switch (str[length-1])
{
case 'h':
case 'H':
radix=16;
break;
case 'o':
case 'O':
radix=8;
break;
case 'b':
case 'B':
radix=2;
break;
default:
radix=10;
}
if (length > 2 && str[0] == '0' && str[1] == 'x')
radix = 16;
for (unsigned i=0; i<length; i++)
{
int digit;
if (str[i] >= '0' && str[i] <= '9')
digit = str[i] - '0';
else if (str[i] >= 'A' && str[i] <= 'F')
digit = str[i] - 'A' + 10;
else if (str[i] >= 'a' && str[i] <= 'f')
digit = str[i] - 'a' + 10;
else
digit = radix;
if (digit < radix)
{
v *= radix;
v += digit;
}
}
if (str[0] == '-')
v.Negate();
return v;
}
Some changes:
template <class T>
static Integer StringToInteger(const T *str)
{
int radix;
// GCC workaround
// std::char_traits<wchar_t>::length() not defined in GCC 3.2 and
STLport 4.5.3
unsigned int length;
for (length = 0; str[length] != 0; length++) {}
Integer v;
//Should this really be allowed??
if (length == 0)
return v;
switch (str[length-1])
{
case 'h':
case 'H':
radix=16;
length--; //don't parse the radix later
break;
case 'o':
case 'O':
radix=8;
length--;
break;
case 'b':
case 'B':
radix=2;
length--;
break;
default:
if( str[length-1] >= '0' && str[length-1] <= '9' )
radix=10;
else
throw "Invalid radix in integer string representation";
//something
to this effect
}
if (length == 0)
throw "Radix-only integer string representation illegal"; //
something to this effect
if (length > 1 && str[0] == '-'){
v.Negate();
str++;
length--;
}
else if (length > 2 && str[0] == '0' && str[1] == 'x'){
radix = 16;
str += 2;
length -= 2;
}
for (unsigned i=0; i<length; i++)
{
int digit;
if (str[i] >= '0' && str[i] <= '9')
digit = str[i] - '0';
else if (str[i] >= 'A' && str[i] <= 'F')
digit = str[i] - 'A' + 10;
else if (str[i] >= 'a' && str[i] <= 'f')
digit = str[i] - 'a' + 10;
else
digit = radix;
if (digit < radix)
{
v *= radix;
v += digit;
}
else throw "Invalid digit parsing integer from string";
//something
to this effect
}
return v;
}
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the "Crypto++ Users"
Google Group.
To unsubscribe, send an email to [EMAIL PROTECTED]
More information about Crypto++ and this group is available at
http://www.cryptopp.com.
-~----------~----~----~----~------~----~------~--~---