Boost logo

Boost :

From: Hartmut Kaiser (HartmutKaiser_at_[hidden])
Date: 2005-02-09 13:13:04


 
Michiel Salters wrote:

> > > This assumes that the range [first,last] is dereferenacable and
> > > contiguous in memory. This of course is not mandated by the
> > standard.
> >
> > Yes, this is a known problem (see the Changelog file), I didn't
> > realise, that it will assert on some systems. Seems, that
> I'll have to
> > fix that soon ;-). This shouldn't be a problem on other systems,
> > though, if you're using iterators acting on a continuous chunk of
> > memory (such as std::string::iterator).
>
> No, you're mistaken here and in the Changelog as well. Even
> std::string::iterator doesn't have to refer to contiguous
> memory. std::vector<char>::iterator would, though, so I built
> a string around that and found the actual bug (and a VC8 bug
> as well I think).

I stand corrected here.

> The bug is that context<IteratorT> stores the two iterators
> first and last as const&. The cpp example passed .begin() and
> .end(), which are temporaries and they go out of scope.
> The result is that the context ends up with references to
> destructed iterators. Again, the VC8 STL iterator debugging
> found the problem on first access.
>
> Line 281, cpp_context.hpp

Thanks for catching this! I'll remove the references, so the iterators get
copied. As only I've installed my own copy of vc8 and verified the
correctness of my changes I'll upload a new version of Wave (since IMHO this
bug is too serious to leave it alone for the review process).

> I really have to say Dinkumware did a fine job here, this
> would have been very hard to find without these checks.

Indeed!

> > OTOH this isn't exactly a problem in the preprocessor library, it's
> > merely a problem of the re2c generated lexer used in the
> driver. The
> > other provided lexer (SLEX based) won't expose this problem
> (i.e. the
> > cpp_tokens example shouldn't assert).
>
> Might be (didn't get there yet), but it too uses
> cpp_context.hpp, right?

The lexer components are completely independent from the preprocessor and
freely interchangable. Using the SLEX based lexer at least would circumvent
the problem regarding the continuous memory.

> BTW, if you try VC8, mail me for the string class I used.
> Using std::vector<char> directly appears to trigger a VC
> 8(beta1) bug with typenames longer than 2KB

Could you send it directly to me?

Many thanks and regards
Hartmut


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk