On Fri, Mar 02, 2018 at 06:06:32PM +0100, Christophe de Dinechin wrote:
> > FWIW, I also find myself in agreement with Frediano and Lukas on this point.
> OK. Maybe I misunderstood something.
> Do we agree that the case Frediano raised is someone trying:
>       throw Error(“The value of “ + std::to_string(2) + “ does not match “ + 
> std::to_string(1));
> which yields the following error:
>       spice-streaming-agent.cpp:165:93: error: no matching function for call 
> to ‘spice::streaming_agent::Error::Error(std::__cxx11::basic_string<char>)’
> So far, I think the interface was not “error prone”. It caught the error 
> correctly.
> Therefore, in order to find the interface “error prone”, one has to accept a 
> second hypothesis, which is that whoever attempted that, after seeing that 
> error message, looks at the interface, which has a ‘const char *’ and a 
> comment that specifically states "It is recommended to only use static C 
> strings, since formatting of any dynamic argument is done by 
> ‘format_message’”, and after reading that comment, has a big “Aha” moment and 
> writes:
>       throw Error((“The value of “ + std::to_string(2) + “ does not match “ + 
> std::to_string(1)).c_str());
> I’m sorry, but I cannot accept that step of the reasoning as being even 
> remotely valid. Just looking at the code makes me want to barf.
> So either I misunderstood Frediano’s point, or the reasoning is deeply flawed 
> in a not very subtle way.

It's not just about .c_str(), it's really about any API returning a
non-static string which will be freed before the exception is caught
(think RAII-like cases, wrappers around preexisting C APIs, ...).
I already mentioned it, but an API taking a const char *, and also
mandating that this const char * must be alive as long as the instance
I invoked the method from is really unusual/unexpected to me, and would
thus be error-prone.


Attachment: signature.asc
Description: PGP signature

Spice-devel mailing list

Reply via email to