Opened 13 years ago
Closed 13 years ago
#2970 closed Bugs (invalid)
Out of boundary access with STLport
Reported by: | Jazz | Owned by: | nasonov |
---|---|---|---|
Milestone: | Boost 1.39.0 | Component: | lexical_cast |
Version: | Boost 1.38.0 | Severity: | Problem |
Keywords: | Cc: | Ulrich Eckhardt |
Description
In lexical_cast.hpp, line 519, it is assumed that empty strings end with a null char, but this is not true with STLPort :
char last_grp_size = grouping[0] <= 0 ? CHAR_MAX : grouping[0];
grouping[0]
has an undefined value when grouping
is empty. I propose this to fix it :
char last_grp_size = grouping_size == 0 || grouping[0] <= 0 ? CHAR_MAX : grouping[0];
Change History (4)
follow-up: 2 comment:1 by , 13 years ago
Cc: | added |
---|---|
Summary: | Out of boundary access with STLPort → Out of boundary access with STLport |
comment:2 by , 13 years ago
Replying to eckhardt:
The expression 's[s.size()]' is okay on a string, as long as 's' refers to a const string. Now, it would be interesting which version of STLport you have and how it behaves, i.e. how you detected a misbehaviour, because a missing zero would be a bug there.
I didn't know this, do you have a reference explaining this? I have STLPort 5.0.0.
follow-up: 4 comment:3 by , 13 years ago
There is pretty little explanation, but it is simply written in the C++ standard. I guess that this is a compromise made to help migration from char* strings, because there you could also access all elements from str[0] to str[size] inclusive.
Now, what I still don't know is what exactly you are seeing. Is STLport's debug mode throwing an out-of-bounds access or is something else failing? Can you provide some code that fails?
Lastly, STLport 5.0.0 was released 2005-11-02! That's almost four years ago! Further, since I partially maintained the STLport port to MS Windows CE, I know that there is actually a test-case for the above behaviour, though I'm not sure when exactly the test was added and (possibly) the behaviour fixed. If I were you, I would consider upgrading, at least to the last 5.0 release. OTOH, current compilers usually come with a well-working C++ stdlib, so just using the native one would make things easier generally.
comment:4 by , 13 years ago
Resolution: | → invalid |
---|---|
Status: | new → closed |
Replying to eckhardt:
Now, what I still don't know is what exactly you are seeing. Is STLport's debug mode throwing an out-of-bounds access or is something else failing? Can you provide some code that fails?
In this code, when str is "1024", sometime it returned 1024, sometime 1 :
boost::lexical_cast< unsigned >( str );
The change I provided fixed that.
Lastly, STLport 5.0.0 was released 2005-11-02! That's almost four years ago! Further, since I partially maintained the STLport port to MS Windows CE, I know that there is actually a test-case for the above behaviour, though I'm not sure when exactly the test was added and (possibly) the behaviour fixed. If I were you, I would consider upgrading, at least to the last 5.0 release. OTOH, current compilers usually come with a well-working C++ stdlib, so just using the native one would make things easier generally.
Probably we should upgrade STLPort. We are using STLPort in a cross-platform project, and on some platforms some features are not available with the C++ compiler.
The expression 's[s.size()]' is okay on a string, as long as 's' refers to a const string. Now, it would be interesting which version of STLport you have and how it behaves, i.e. how you detected a misbehaviour, because a missing zero would be a bug there.
The code in question is this:
Note especially the comment, which basically repeats what I wrote above.