http://gcc.gnu.org/bugzilla/show_bug.cgi?id=48257

--- Comment #13 from Mohsin <mohsinrzaidi at gmail dot com> 2011-03-25 05:48:21 
UTC ---
(In reply to comment #12)
> (In reply to comment #11)
> > (In reply to comment #10)
> > > Two questions here:
> > > 
> > > 1. Is the behaviour undefined for __n < number of elements in __s?
> > >
> > 
> > Oops! I meant for __n >  number of elements in __s. 
> Yes!  The standard defines the behaviour of string::assign when s contains at
> least n elements. When that precondition isn't met the definition doesn't 
> apply
> i.e. it's undefined.

Sorry for the confusion here Jon. I meant to ask if the specs define what the
behaviour should be if __s *does not* contain __n elements.

> > > 2. For cases undefined in the specs, do we take steps to ensure 
> > > robustness? 
> Where possible, yes, that's what -D_GLIBCXX_DEBUG tries to do.  But in general
> it's not possible to verify that the supplied string meets the required 
> length.
> Given a const char*, how do you tell if it points to an array of at least n
> chars?  You can't.

We could always look for the null-termination :) But like you say below, this
would add overhead and still not handle all cases.

> It would be possible to check that the supplied const char* is not the shared
> static "empty string" representation, but that would add overhead and still
> wouldn't prevent similar errors like:
>   string s("oops", 999);

Understood.

> > > I
> > > still cannot digest that a programmer error could corrupt std::string 
> > > static
> > > memory.
> Really?  A sufficiently malicious/careless programmer can corrupt pretty much
> anything!

Hehe, understood.

> In any case, if you try your original example with current releases it doesn't
> print '4'

Great! I'll try that.

Thanks for bearing with my impetuous behaviour. I know it mustn't be easy
maintaining such a widely used code base.

Reply via email to