![]() |
Boost : |
From: Doug Gregor (dgregor_at_[hidden])
Date: 2005-10-12 13:43:36
Hi Andreas,
On Oct 12, 2005, at 10:57 AM, Andreas Pokorny wrote:
> We just stumbled across a small problem with Boost.Signals,
> while playing with the symbol visibility features of gcc-3.4 and
> gcc-4. That feature is still buggy, but it unveiled some strange
> code.
We've stumbled into this as well.
> The code is in signal_template.hpp:
>
> template<typename Pair>
> R operator()(const Pair& slot) const {
> F* target = const_cast<F*>(any_cast<F>(&slot.second));
> return (*target)(BOOST_SIGNALS_BOUND_ARGS);
> }
>
> I dont see why any_cast is used here at all. The type safety
> is guranteed by the interface of Boost.Signals, so I doubt that
> someone will be able to abuse the library. I believe the author
> of that code had the same in mind, since he did not test
> target != 0 before invoking the target. So in my opinion a
> simple reinterpret_cast should suffice here. It would also
> fix our issue, although that one is caused by gcc.
You're right. Our options are:
1) Fix any_cast to compare typeid().name() instead of type_info
objects
2) Make an unsafe_any_cast that doesn't do the check
3) Switch signals to use void*'s
For 1.33.1, I like #2 best because it affects the least amount of code.
For 1.34.0 and beyond, #1 is probably our best bet so that others don't
run into the same problem.
Doug
Boost list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk