Hi Michael, On Thu, Jan 20, 2022 at 04:25:25PM +0000, Michael Meeks <michael.meeks@xxxxxxxxxxxxx> wrote: > I just saw this ubsan thing. > > Looks like there is a mix-up with: > > if (SfxItemState::SET==rAttr.GetItemState(SID_ATTR_TRANSFORM_POS_X,true,&pPoolItem)) { > nPosDX=static_cast<const SfxInt32Item*>(pPoolItem)->GetValue() - aRect.Left(); You can write the second line as: nPosDX=pPoolItem->StaticWhichCast(SID_ATTR_TRANSFORM_POS_X).GetValue() - aRect.Left(); Because SID_ATTR_TRANSFORM_POS_X is a TypedWhichId<SfxInt32Item>(...). The easy hack to do such conversions is: https://bugs.documentfoundation.org/show_bug.cgi?id=140226 > And I wondered - is that something we could build a table for, and a > clang plugin that could catch whenever we do something like: > > cui/source/tabpages/swpossizetabpage.cxx: rSet->Put( SfxInt32Item( GetWhich( SID_ATTR_TRANSFORM_POS_X ), nHoriByPos ) ); I'm not sure we have a mechanism to prevent mistakes on the Put() side. Regards, Miklos