[Rivet] Dangerous casting to FinalState

Andy Buckley andy.buckley at cern.ch
Tue Mar 24 16:59:08 GMT 2015


On 24/03/15 16:50, Frank Siegert wrote:
> Thanks David for the feedback.
> 
> I'm hoping to get more feedback from the other Riveters as well. Just
> to recap, there are two issues with my patch:
> 
> (i) It's a bit ugly to have to hide this for each derived
> FinalState explicitly, I don't know whether there is any better way to
> disallow such "lossy" copying altogether for a base class?

I've not looked in detail, but the second answer here looks like a
templated generalisation of the catching mechanism:
http://stackoverflow.com/questions/580375/how-to-generate-a-compiler-warning-error-when-object-sliced

Maybe this could be specialised to FinalState derived classes using
SFINAE-type template magic: an awful lot can be done with that, and even
more in C++11... at the cost of some isolated bits of unreadable code.
Take a look at the return types in
https://rivet.hepforge.org/trac/browser/include/Rivet/Math/MathUtils.hh
if you want a flavour of how that looks! No guarantees, though:
templates & member functions have more restrictions than for free functions.

No way to generate a compiler warning with gcc, unfortunately :-/

> (ii) My example 2c is a bit strange... it compiles fine, but at
> runtime fails with:
> Error in MY_RFSTEST2c::init method: No projections registered for
> parent 0x7fff33dc1630
> 
> I'm attaching again the three files from back then in case somebody
> doesn't find them anymore.

Thanks! I agree this is something to follow up on, to be helpful to our
users. Blame C++ for making such subtle errors possible... and g++ for
not (yet) telling them about it.

Andy


> On 14 March 2015 at 20:45, David Bjergaard <david.bjergaard at gmail.com> wrote:
>> Ah,
>>
>> Sorry I forgot to "make install" after applying the patch. I can at
>> least confirm the crash:
>>> rivet --pwd -a MY_RFSTEST2c zee.hepmc
>>> Rivet trunk running on machine calypso (x86_64)
>>> Rivet.Analysis.Handler: WARN  Analysis 'MY_RFSTEST2c' is unvalidated: be careful, it may be broken!
>>> Error in MY_RFSTEST2c::init method: No projections registered for parent 0x7fff6d42d9a0
>>
>> David Bjergaard <david.bjergaard at gmail.com> writes:
>>
>>> Hi Frank,
>>>
>>> For some reason your test works (with the patch):
>>>> rivet --pwd -a MY_RFSTEST2c zee.hepmc
>>>> Rivet trunk running on machine calypso (x86_64)
>>>> Rivet.Analysis.Handler: WARN  Analysis 'MY_RFSTEST2c' is unvalidated: be careful, it may be broken!
>>>> Reading events from 'zee.hepmc'
>>>> zfinder: -11 10022
>>>> zfinder: 11 10021
>>>> rfs.size = 8
>>>>   rfs[0] = 2103 10006
>>>>   rfs[1] = 2 10007
>>>>   rfs[2] = 2103 10009
>>>>   rfs[3] = 2 10010
>>>>   rfs[4] = 21 10015
>>>>   rfs[5] = 21 10016
>>>>   rfs[6] = -4 10017
>>>>   rfs[7] = 4 10018
>>>> Finished event loop
>>>> Rivet.Analysis.Handler: INFO  Finalising analyses
>>>> Rivet.Analysis.Handler: INFO  Processed 1 event
>>>
>>>> The MCnet usage guidelines apply to Rivet: see http://www.montecarlonet.org/GUIDELINES
>>>> Please acknowledge plots made with Rivet analyses, and cite arXiv:1003.0694 (http://arxiv.org/abs/1003.0694)
>>>> Cross-section = 1.515878e+03 pb
>>> I wonder if its a compiler difference?
>>>> g++ --version
>>>> g++ (Ubuntu 4.8.2-19ubuntu1) 4.8.2
>>>> uname -a
>>>> Linux calypso 3.13.0-46-generic #77-Ubuntu SMP Mon Mar 2 18:23:39 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
>>>
>>> Cheers,
>>>
>>>     Dave
>>>
>>> Frank Siegert <frank.siegert at cern.ch> writes:
>>>
>>>> Hi David,
>>>>
>>>> Thanks for your feedback.
>>>>
>>>>> Just thinking out loud:
>>>>> addProjection is templated on a reference, is it possible to make a
>>>>> specialized template for the non-reference version?
>>>>>
>>>>> Something like:
>>>>>     template <typename PROJ>
>>>>>     const PROJ& addProjection(const PROJ proj, const std::string& name) {
>>>>>       std::cerr<<"Please be careful about using references!"<<std::endl;
>>>>>       return proj;
>>>>>     }
>>>>
>>>> But we would not want to prevent *registering* projections by copy,
>>>> since that's in general absolutely fine, right? It's rather the
>>>> copying of a derived projection, e.g. VetoedFinalState, into a
>>>> FinalState that seems dangerous to me.
>>>>
>>>> I have just tested that it's possible to hide the copy constructor,
>>>> and am attaching a patch for Rivet which shows how this would work in
>>>> real life. It's a bit ugly to have to hide this for each derived
>>>> FinalState explicitly, I don't know whether there is any better way to
>>>> disallow such "lossy" copying altogether for a base class?
>>>>
>>>> With this patch Rivet compiles fine, and a few of the typical ZFinder
>>>> analyses seem to work as expected. Furthermore, an accidental VFS ->
>>>> FS copying like in my Example 1 now fails as expected and 2a and 2b
>>>> work as expected. But 2c is a bit strange... it compiles fine, but at
>>>> runtime fails with:
>>>> Error in MY_RFSTEST2c::init method: No projections registered for
>>>> parent 0x7fff33dc1630
>>>>
>>>> I don't at all understand where that's coming from, but there is a lot
>>>> of casting in the projection registration going on. Any ideas? I'm
>>>> attaching a simple analysis that demonstrates this behaviour, together
>>>> with one Zee event for testing.
>>>>
>>>> Cheers,
>>>> Frank
>>>>
>>>>
>>>> _______________________________________________
>>>> 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


More information about the Rivet mailing list