[Rivet] Dangerous casting to FinalState

Chris Pollard cpollard at cern.ch
Tue Jul 7 16:50:07 BST 2015


Hi,

Bringing this back up over here...

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?

Chris

On Wed, Jul 1, 2015 at 10:25 PM, Andy Buckley <andy.buckley at cern.ch> wrote:

> A late follow-up on this: on the trunk (i.e. default branch) I just
> added a *tiny* tweak to declare a private virtual operator=(const
> Projection&) method on the Projection base class. It could possibly be
> done better than I have, but I believe this should make it impossible to
> copy-assign any classes derived from Projection.
>
> This should ban accidental copies by value. Everything in the Rivet
> trunk recompiled just fine, but can you test it with your pathological
> examples, Frank?
>
> Andy
>
>
> On 20/05/15 14:19, Frank Siegert wrote:
> > 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
> >>>>
> > _______________________________________________
> > Rivet mailing list
> > Rivet at projects.hepforge.org
> > https://www.hepforge.org/lists/listinfo/rivet
> >
>
>
> --
> Dr Andy Buckley, Lecturer / Royal Society University Research Fellow
> Particle Physics Expt Group, University of Glasgow
> _______________________________________________
> Rivet mailing list
> Rivet at projects.hepforge.org
> https://www.hepforge.org/lists/listinfo/rivet
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://www.hepforge.org/lists-archive/rivet/attachments/20150707/76eea5f6/attachment.html>


More information about the Rivet mailing list