|
[Rivet] Dangerous casting to FinalStateFrank Siegert frank.siegert at cern.chWed May 20 14:19:07 BST 2015
Hi David, any ideas? Do you need more information from me? Cheers, Frank On 7 May 2015 at 14:18, Frank Siegert <frank.siegert at cern.ch> wrote: > Hi David, > > We want to apply the attached patch, which hides the dangerous slicing > constructors for classes derived from FinalState. I then tested > various options of initialising/copying projections, all of which do > the correct thing now (errors during compilation for slicing > constructors, no errors for faithful ones) except for one: > > ZFinder zfinder(fs, cut, PID::ELECTRON, 65*GeV, 115*GeV, 0.2, > ZFinder::CLUSTERNODECAY, ZFinder::TRACK); > VetoedFinalState remainder = zfinder.remainingFinalState(); > addProjection(remainder, "RFS"); > > I would expect that this should work fine, but at runtime I get: > Error in MY_RFSTEST2c::init method: No projections registered for > parent 0x7ffe07be8840 > > Attached is the analysis code and a HepMC file with one event to > reproduce it quickly after having applied the patch to Rivet: > $ rivet-buildplugin MY_RFSTEST2c > $ rivet --pwd -a MY_RFSTEST2c file.hepmc2g > > It would be great if you would have an idea what is going wrong with > the projection cloning/registration. > > Cheers, > Frank > > > On 7 May 2015 at 10:50, David Grellscheid > <david.grellscheid at durham.ac.uk> wrote: >> Hi all, >> >> I'm sorry I haven't followed this from the beginning and I'm confused >> about if we're talking about registered projections or locally created >> ones, as the required copying behaviour is more tricky in the first >> case. Can someone summarise where I can find the current status? >> >> - what you see as the problem >> - what you would expect instead >> >> Thanks, >> >> David >> >> On 04/05/15 17:28, Andy Buckley wrote: >>> On 04/05/15 17:04, Frank Siegert wrote: >>>> Hi Andy, >>>> >>>>> Does that problem disappear if you define remainder as a reference, >>>>> either as VetoedFinalState& or FinalState&? >>>> >>>> Yes, even for FinalState& the problem disappears. That's case 2a in my >>>> original examples. >>>> >>>>> It would also be useful if you could use the -l TRACE flag (if I >>>>> remember the syntax correctly) when running, and send the resulting log >>>>> so we can see if that parent address corresponds to something. Offhand >>>>> it looks like a bit of an odd address value: is this the sort of pointer >>>>> value that corresponds to a non-heap-allocated local? >>>> >>>> I have no idea on the pointer value here, but I have put the full log into >>>> http://cern.ch/fsiegert/tmp/trace.log >>> >>> Thanks! >>> >>>>> When assigning a Projection like this, a copy will be made. Does >>>>> VetoedFinalState have a copy assignment operator, copy constructor, etc. >>>>> defined as per the Rule of Three >>>>> (http://en.wikipedia.org/wiki/Rule_of_three_%28C%2B%2B_programming%29) >>>>> to make this safe? I genuinely can't remember if we do that, since >>>>> copying of projections isn't really the idea. If we don't perhaps we >>>>> could make it a rule in Projection implementation to always hide (i.e. >>>>> make private) the copy constructor and copy assignment operators to >>>>> simply ban copy by value and hence force use of references. I forget if >>>>> this can be done on the Projection base class or if each new derived >>>>> class would need to explicitly re-hide them. Anyway, food for thought >>>>> albeit not quite at black belt level ;-) >>>> >>>> We don't seem to explicitly define any of the three (copy assignment >>>> operator, copy constructor, destructor). I guess the copying that you >>>> mean stems from the clone() function, which probably is using the >>>> constructor from a FinalState instead of a copy constructor? If our >>>> projection registration/cloning can't cope with normal C++ copying >>>> then we should indeed either fix it or hide the copy >>>> constructors/operators. I have to admit that I didn't even realise >>>> that we are internally cloning projections upon registration, and >>>> whatever magic is connected to that. It's probably nothing >>>> super-urgent to fix, since at least it won't give wrong results. But >>>> I'd expect the black-belts to understand this much better than I >>>> (challenge!). >>> >>> Hmm, good point about the cloning. I was just thinking of the local copy >>> that occurs if the lvalue isn't a reference type in your example. I'll >>> have to have a look at the current clone implementations to know how >>> safe they are -- in general if we're not defining copy constructor, >>> assignment, and destructor then any projection which holds pointer >>> members could be dodgy in copying. I think we've covered the destructor >>> angle, but not necessarily the copying ones... so we might want to ban >>> those, depending on how clone() is currently written. Old rusty memories >>> for me... >>> >>> Andy >>>
More information about the Rivet mailing list |