<div dir="ltr">Hi,<div><br></div><div>Bringing this back up over here...</div><div><br></div><div>Taking what Andy says he's implemented at face value (haven't looked at the code), Frank: I'm not sure how your original Example1 and Example2c even compile. You shouldn't be allowed to copy by value anymore. Or did I miss something?</div><div><br>Chris</div><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jul 1, 2015 at 10:25 PM, Andy Buckley <span dir="ltr"><<a href="mailto:andy.buckley@cern.ch" target="_blank">andy.buckley@cern.ch</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">A late follow-up on this: on the trunk (i.e. default branch) I just<br>
added a *tiny* tweak to declare a private virtual operator=(const<br>
Projection&) method on the Projection base class. It could possibly be<br>
done better than I have, but I believe this should make it impossible to<br>
copy-assign any classes derived from Projection.<br>
<br>
This should ban accidental copies by value. Everything in the Rivet<br>
trunk recompiled just fine, but can you test it with your pathological<br>
examples, Frank?<br>
<span><font color="#888888"><br>
Andy<br>
</font></span><div><div><br>
<br>
On 20/05/15 14:19, Frank Siegert wrote:<br>
> Hi David,<br>
><br>
> any ideas? Do you need more information from me?<br>
><br>
> Cheers,<br>
> Frank<br>
><br>
><br>
><br>
> On 7 May 2015 at 14:18, Frank Siegert <<a href="mailto:frank.siegert@cern.ch" target="_blank">frank.siegert@cern.ch</a>> wrote:<br>
>> Hi David,<br>
>><br>
>> We want to apply the attached patch, which hides the dangerous slicing<br>
>> constructors for classes derived from FinalState. I then tested<br>
>> various options of initialising/copying projections, all of which do<br>
>> the correct thing now (errors during compilation for slicing<br>
>> constructors, no errors for faithful ones) except for one:<br>
>><br>
>> ZFinder zfinder(fs, cut, PID::ELECTRON, 65*GeV, 115*GeV, 0.2,<br>
>> ZFinder::CLUSTERNODECAY, ZFinder::TRACK);<br>
>> VetoedFinalState remainder = zfinder.remainingFinalState();<br>
>> addProjection(remainder, "RFS");<br>
>><br>
>> I would expect that this should work fine, but at runtime I get:<br>
>>   Error in MY_RFSTEST2c::init method: No projections registered for<br>
>> parent 0x7ffe07be8840<br>
>><br>
>> Attached is the analysis code and a HepMC file with one event to<br>
>> reproduce it quickly after having applied the patch to Rivet:<br>
>>   $ rivet-buildplugin MY_RFSTEST2c<br>
>>   $ rivet --pwd -a MY_RFSTEST2c file.hepmc2g<br>
>><br>
>> It would be great if you would have an idea what is going wrong with<br>
>> the projection cloning/registration.<br>
>><br>
>> Cheers,<br>
>> Frank<br>
>><br>
>><br>
>> On 7 May 2015 at 10:50, David Grellscheid<br>
>> <<a href="mailto:david.grellscheid@durham.ac.uk" target="_blank">david.grellscheid@durham.ac.uk</a>> wrote:<br>
>>> Hi all,<br>
>>><br>
>>> I'm sorry I haven't followed this from the beginning and I'm confused<br>
>>> about if we're talking about registered projections or locally created<br>
>>> ones, as the required copying behaviour is more tricky in the first<br>
>>> case. Can someone summarise where I can find the current status?<br>
>>><br>
>>>   - what you see as the problem<br>
>>>   - what you would expect instead<br>
>>><br>
>>> Thanks,<br>
>>><br>
>>>   David<br>
>>><br>
>>> On 04/05/15 17:28, Andy Buckley wrote:<br>
>>>> On 04/05/15 17:04, Frank Siegert wrote:<br>
>>>>> Hi Andy,<br>
>>>>><br>
>>>>>> Does that problem disappear if you define remainder as a reference,<br>
>>>>>> either as VetoedFinalState& or FinalState&?<br>
>>>>><br>
>>>>> Yes, even for FinalState& the problem disappears. That's case 2a in my<br>
>>>>> original examples.<br>
>>>>><br>
>>>>>> It would also be useful if you could use the -l TRACE flag (if I<br>
>>>>>> remember the syntax correctly) when running, and send the resulting log<br>
>>>>>> so we can see if that parent address corresponds to something. Offhand<br>
>>>>>> it looks like a bit of an odd address value: is this the sort of pointer<br>
>>>>>> value that corresponds to a non-heap-allocated local?<br>
>>>>><br>
>>>>> I have no idea on the pointer value here, but I have put the full log into<br>
>>>>> <a href="http://cern.ch/fsiegert/tmp/trace.log" rel="noreferrer" target="_blank">http://cern.ch/fsiegert/tmp/trace.log</a><br>
>>>><br>
>>>> Thanks!<br>
>>>><br>
>>>>>> When assigning a Projection like this, a copy will be made. Does<br>
>>>>>> VetoedFinalState have a copy assignment operator, copy constructor, etc.<br>
>>>>>> defined as per the Rule of Three<br>
>>>>>> (<a href="http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29" rel="noreferrer" target="_blank">http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29</a>)<br>
>>>>>> to make this safe? I genuinely can't remember if we do that, since<br>
>>>>>> copying of projections isn't really the idea. If we don't perhaps we<br>
>>>>>> could make it a rule in Projection implementation to always hide (i.e.<br>
>>>>>> make private) the copy constructor and copy assignment operators to<br>
>>>>>> simply ban copy by value and hence force use of references. I forget if<br>
>>>>>> this can be done on the Projection base class or if each new derived<br>
>>>>>> class would need to explicitly re-hide them. Anyway, food for thought<br>
>>>>>> albeit not quite at black belt level ;-)<br>
>>>>><br>
>>>>> We don't seem to explicitly define any of the three (copy assignment<br>
>>>>> operator, copy constructor, destructor). I guess the copying that you<br>
>>>>> mean stems from the clone() function, which probably is using the<br>
>>>>> constructor from a FinalState instead of a copy constructor? If our<br>
>>>>> projection registration/cloning can't cope with normal C++ copying<br>
>>>>> then we should indeed either fix it or hide the copy<br>
>>>>> constructors/operators. I have to admit that I didn't even realise<br>
>>>>> that we are internally cloning projections upon registration, and<br>
>>>>> whatever magic is connected to that. It's probably nothing<br>
>>>>> super-urgent to fix, since at least it won't give wrong results. But<br>
>>>>> I'd expect the black-belts to understand this much better than I<br>
>>>>> (challenge!).<br>
>>>><br>
>>>> Hmm, good point about the cloning. I was just thinking of the local copy<br>
>>>> that occurs if the lvalue isn't a reference type in your example. I'll<br>
>>>> have to have a look at the current clone implementations to know how<br>
>>>> safe they are -- in general if we're not defining copy constructor,<br>
>>>> assignment, and destructor then any projection which holds pointer<br>
>>>> members could be dodgy in copying. I think we've covered the destructor<br>
>>>> angle, but not necessarily the copying ones... so we might want to ban<br>
>>>> those, depending on how clone() is currently written. Old rusty memories<br>
>>>> for me...<br>
>>>><br>
>>>> Andy<br>
>>>><br>
> _______________________________________________<br>
> Rivet mailing list<br>
> <a href="mailto:Rivet@projects.hepforge.org" target="_blank">Rivet@projects.hepforge.org</a><br>
> <a href="https://www.hepforge.org/lists/listinfo/rivet" rel="noreferrer" target="_blank">https://www.hepforge.org/lists/listinfo/rivet</a><br>
><br>
<br>
<br>
</div></div><span>--<br>
Dr Andy Buckley, Lecturer / Royal Society University Research Fellow<br>
Particle Physics Expt Group, University of Glasgow<br>
</span><div><div>_______________________________________________<br>
Rivet mailing list<br>
<a href="mailto:Rivet@projects.hepforge.org" target="_blank">Rivet@projects.hepforge.org</a><br>
<a href="https://www.hepforge.org/lists/listinfo/rivet" rel="noreferrer" target="_blank">https://www.hepforge.org/lists/listinfo/rivet</a><br>
</div></div></blockquote></div><br></div></div>