2017-03-21 06:23:09 -05:00
|
|
|
/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
|
|
|
|
/*
|
|
|
|
* This file is part of the LibreOffice project.
|
|
|
|
*
|
|
|
|
* This Source Code Form is subject to the terms of the Mozilla Public
|
|
|
|
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
|
|
|
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
|
|
|
*/
|
|
|
|
|
2017-03-22 07:06:09 -05:00
|
|
|
#ifndef INCLUDED_O3TL_SAFEINT_HXX
|
|
|
|
#define INCLUDED_O3TL_SAFEINT_HXX
|
2017-03-21 06:23:09 -05:00
|
|
|
|
Fix -fsanitize=signed-integer-overflow
during CppunitTest_sw_uiwriter (see below). vmiklos suggested making that addition
saturating, so I introduced o3tl::saturating_add for that.
<https://ci.libreoffice.org/job/lo_ubsan/684/console>:
> /sw/source/core/layout/sectfrm.cxx:1964:23: runtime error: signed integer overflow: 6203 + 9223372036854774315 cannot be represented in type 'long'
> #0 0x2b65623b9a65 in SwSectionFrame::Grow_(long, bool) /sw/source/core/layout/sectfrm.cxx:1964:23
> #1 0x2b65625d6f51 in SwFrame::Grow(long, bool, bool) /sw/source/core/layout/wsfrm.cxx:1172:20
> #2 0x2b6562385999 in SwSectionFrame::MakeAll(OutputDevice*) /sw/source/core/layout/sectfrm.cxx:749:12
> #3 0x2b6561b6c728 in SwFrame::PrepareMake(OutputDevice*) /sw/source/core/layout/calcmove.cxx:346:5
> #4 0x2b656257f355 in SwFrame::Calc(OutputDevice*) const /sw/source/core/layout/trvlfrm.cxx:1769:9
> #5 0x2b656247d232 in lcl_InnerCalcLayout(SwFrame*, long, bool) /sw/source/core/layout/tabfrm.cxx:1522:13
> #6 0x2b656247d635 in lcl_InnerCalcLayout(SwFrame*, long, bool) /sw/source/core/layout/tabfrm.cxx:1524:25
> #7 0x2b656247d635 in lcl_InnerCalcLayout(SwFrame*, long, bool) /sw/source/core/layout/tabfrm.cxx:1524:25
> #8 0x2b65624b9b2e in lcl_RecalcRow(SwRowFrame&, long) /sw/source/core/layout/tabfrm.cxx:1559:16
> #9 0x2b65624b0a9f in SwTabFrame::MakeAll(OutputDevice*) /sw/source/core/layout/tabfrm.cxx:2454:29
> #10 0x2b6561b6c728 in SwFrame::PrepareMake(OutputDevice*) /sw/source/core/layout/calcmove.cxx:346:5
> #11 0x2b656257f355 in SwFrame::Calc(OutputDevice*) const /sw/source/core/layout/trvlfrm.cxx:1769:9
> #12 0x2b6561b68bf1 in SwFrame::PrepareMake(OutputDevice*) /sw/source/core/layout/calcmove.cxx:249:13
> #13 0x2b656257f355 in SwFrame::Calc(OutputDevice*) const /sw/source/core/layout/trvlfrm.cxx:1769:9
> #14 0x2b6561b68bf1 in SwFrame::PrepareMake(OutputDevice*) /sw/source/core/layout/calcmove.cxx:249:13
> #15 0x2b656257f355 in SwFrame::Calc(OutputDevice*) const /sw/source/core/layout/trvlfrm.cxx:1769:9
> #16 0x2b6561b6e7de in SwFrame::OptPrepareMake() /sw/source/core/layout/calcmove.cxx:357:13
> #17 0x2b6561fa557d in SwFrame::OptCalc() const /sw/source/core/inc/frame.hxx:889:9
> #18 0x2b6561f6f40c in SwLayAction::FormatLayout(OutputDevice*, SwLayoutFrame*, bool) /sw/source/core/layout/layact.cxx:1368:13
> #19 0x2b6561f6f04a in SwLayAction::FormatLayout(OutputDevice*, SwLayoutFrame*, bool) /sw/source/core/layout/layact.cxx:1363:29
> #20 0x2b6561f8737e in SwLayAction::FormatLayoutTab(SwTabFrame*, bool) /sw/source/core/layout/layact.cxx:1576:25
> #21 0x2b6561f6eb14 in SwLayAction::FormatLayout(OutputDevice*, SwLayoutFrame*, bool) /sw/source/core/layout/layact.cxx:1360:32
> #22 0x2b6561f6f04a in SwLayAction::FormatLayout(OutputDevice*, SwLayoutFrame*, bool) /sw/source/core/layout/layact.cxx:1363:29
> #23 0x2b6561f50723 in SwLayAction::InternalAction(OutputDevice*) /sw/source/core/layout/layact.cxx:550:25
> #24 0x2b6561f47023 in SwLayAction::Action(OutputDevice*) /sw/source/core/layout/layact.cxx:341:5
> #25 0x2b6564f03b8f in SwViewShell::ImplEndAction(bool) /sw/source/core/view/viewsh.cxx:280:9
> #26 0x2b655ee80f89 in SwViewShell::EndAction(bool) /sw/inc/viewsh.hxx:605:9
> #27 0x2b655edcccbe in SwCursorShell::EndAction(bool, bool) /sw/source/core/crsr/crsrsh.cxx:258:5
> #28 0x2b6567ac5b5b in SwView::OuterResizePixel(Point const&, Size const&) /sw/source/uibase/uiview/viewport.cxx:1116:9
> #29 0x2b65421f88c1 in SfxViewFrame::DoAdjustPosSizePixel(SfxViewShell*, Point const&, Size const&, bool) /sfx2/source/view/viewfrm.cxx:1490:13
> #30 0x2b6542228d89 in SfxViewFrame::Resize(bool) /sfx2/source/view/viewfrm.cxx:2275:17
> #31 0x2b654226038f in SfxFrameViewWindow_Impl::Resize() /sfx2/source/view/viewfrm2.cxx:73:9
> #32 0x2b650ff227aa in vcl::Window::ImplCallResize() /vcl/source/window/event.cxx:522:5
> #33 0x2b6510a8d5f6 in vcl::Window::Show(bool, ShowFlags) /vcl/source/window/window.cxx:2276:13
> #34 0x2b6542132a1e in SfxBaseController::ConnectSfxFrame_Impl(SfxBaseController::ConnectSfxFrame) /sfx2/source/view/sfxbasecontroller.cxx:1250:13
> #35 0x2b654212c985 in SfxBaseController::attachFrame(com::sun::star::uno::Reference<com::sun::star::frame::XFrame> const&) /sfx2/source/view/sfxbasecontroller.cxx:550:13
> #36 0x2b6542084861 in (anonymous namespace)::SfxFrameLoader_Impl::impl_createDocumentView(com::sun::star::uno::Reference<com::sun::star::frame::XModel2> const&, com::sun::star::uno::Reference<com::sun::star::frame::XFrame> const&, comphelper::NamedValueCollection const&, rtl::OUString const&) /sfx2/source/view/frmload.cxx:599:5
> #37 0x2b65420777e9 in (anonymous namespace)::SfxFrameLoader_Impl::load(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&, com::sun::star::uno::Reference<com::sun::star::frame::XFrame> const&) /sfx2/source/view/frmload.cxx:716:13
> #38 0x2b65b0ed3384 in framework::LoadEnv::impl_loadContent() /framework/source/loadenv/loadenv.cxx:1087:24
> #39 0x2b65b0eb7531 in framework::LoadEnv::startLoading() /framework/source/loadenv/loadenv.cxx:372:20
> #40 0x2b65b0eb0063 in framework::LoadEnv::loadComponentFromURL(com::sun::star::uno::Reference<com::sun::star::frame::XComponentLoader> const&, com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&, rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) /framework/source/loadenv/loadenv.cxx:158:9
> #41 0x2b65b10e0078 in framework::Desktop::loadComponentFromURL(rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) /framework/source/services/desktop.cxx:618:12
> #42 0x2b65b10e02fa in non-virtual thunk to framework::Desktop::loadComponentFromURL(rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) /framework/source/services/desktop.cxx:606:64
> #43 0x2b657183ee13 in unotest::MacrosTest::loadFromDesktop(rtl::OUString const&, rtl::OUString const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) /unotest/source/cpp/macros_test.cxx:50:51
> #44 0x2b6533b674a3 in SwModelTestBase::loadURL(rtl::OUString const&, char const*, char const*) /sw/qa/extras/inc/swmodeltestbase.hxx:668:23
> #45 0x2b6533b69aa0 in SwModelTestBase::load(rtl::OUString const&, char const*, char const*) /sw/qa/extras/inc/swmodeltestbase.hxx:639:16
> #46 0x2b6533716c59 in SwUiWriterTest::createDoc(char const*) /sw/qa/extras/uiwriter/uiwriter.cxx:446:9
> #47 0x2b6533b50a9d in SwUiWriterTest::testTdf108524() /sw/qa/extras/uiwriter/uiwriter.cxx:5101:5
> #48 0x2b6533d7e36a in void std::_Mem_fn_base<void (SwUiWriterTest::*)(), true>::operator()<, void>(SwUiWriterTest*) const /home/tdf/lode/opt_private/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:600:11
> #49 0x2b6533d7e073 in void std::_Bind<std::_Mem_fn<void (SwUiWriterTest::*)()> (SwUiWriterTest*)>::__call<void, , 0ul>(std::tuple<>&&, std::_Index_tuple<0ul>) /home/tdf/lode/opt_private/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:1073:11
> #50 0x2b6533d7da81 in void std::_Bind<std::_Mem_fn<void (SwUiWriterTest::*)()> (SwUiWriterTest*)>::operator()<, void>() /home/tdf/lode/opt_private/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:1131:11
> #51 0x2b6533d7c459 in std::_Function_handler<void (), std::_Bind<std::_Mem_fn<void (SwUiWriterTest::*)()> (SwUiWriterTest*)> >::_M_invoke(std::_Any_data const&) /home/tdf/lode/opt_private/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:1871:2
> #52 0x2b6533d7edf0 in std::function<void ()>::operator()() const /home/tdf/lode/opt_private/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:2271:14
> #53 0x2b6533d7aaf5 in CppUnit::TestCaller<SwUiWriterTest>::runTest() /workdir/UnpackedTarball/cppunit/include/cppunit/TestCaller.h:175:7
> #54 0x2b64ed1ff0ad in CppUnit::TestCaseMethodFunctor::operator()() const /workdir/UnpackedTarball/cppunit/src/cppunit/TestCase.cpp:32:5
> #55 0x2b6508a28ea6 in (anonymous namespace)::Protector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) /test/source/vclbootstrapprotector.cxx:39:14
> #56 0x2b64ed1bdb77 in CppUnit::ProtectorChain::ProtectFunctor::operator()() const /workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:12
> #57 0x2b64fca7f7f6 in (anonymous namespace)::Prot::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) /unotest/source/cpp/unobootstrapprotector/unobootstrapprotector.cxx:89:12
> #58 0x2b64ed1bdb77 in CppUnit::ProtectorChain::ProtectFunctor::operator()() const /workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:12
> #59 0x2b64f8c39e73 in (anonymous namespace)::Prot::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) /unotest/source/cpp/unoexceptionprotector/unoexceptionprotector.cxx:63:16
> #60 0x2b64ed1bdb77 in CppUnit::ProtectorChain::ProtectFunctor::operator()() const /workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:12
> #61 0x2b64ed13950f in CppUnit::DefaultProtector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) /workdir/UnpackedTarball/cppunit/src/cppunit/DefaultProtector.cpp:15:12
> #62 0x2b64ed1bdb77 in CppUnit::ProtectorChain::ProtectFunctor::operator()() const /workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:12
> #63 0x2b64ed1b3da0 in CppUnit::ProtectorChain::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) /workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:86:18
> #64 0x2b64ed288efb in CppUnit::TestResult::protect(CppUnit::Functor const&, CppUnit::Test*, std::string const&) /workdir/UnpackedTarball/cppunit/src/cppunit/TestResult.cpp:182:10
> #65 0x2b64ed1fc12d in CppUnit::TestCase::run(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestCase.cpp:91:5
> #66 0x2b64ed2022e3 in CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:64:5
> #67 0x2b64ed20124d in CppUnit::TestComposite::run(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:23:3
> #68 0x2b64ed2022e3 in CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:64:5
> #69 0x2b64ed20124d in CppUnit::TestComposite::run(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:23:3
> #70 0x2b64ed2c88b6 in CppUnit::TestRunner::WrappingSuite::run(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestRunner.cpp:47:5
> #71 0x2b64ed287049 in CppUnit::TestResult::runTest(CppUnit::Test*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestResult.cpp:149:3
> #72 0x2b64ed2c9d57 in CppUnit::TestRunner::run(CppUnit::TestResult&, std::string const&) /workdir/UnpackedTarball/cppunit/src/cppunit/TestRunner.cpp:96:3
> #73 0x515fdd in (anonymous namespace)::ProtectedFixtureFunctor::run() const /sal/cppunittester/cppunittester.cxx:319:13
> #74 0x51098f in sal_main() /sal/cppunittester/cppunittester.cxx:469:14
> #75 0x50eaa2 in main /sal/cppunittester/cppunittester.cxx:376:1
> #76 0x2b64eeeefc04 in __libc_start_main (/lib64/libc.so.6+0x21c04)
> #77 0x433704 in _start (/workdir/LinkTarget/Executable/cppunittester+0x433704)> /sw/source/core/layout/sectfrm.cxx:1964:23: runtime error: signed integer overflow: 6203 + 9223372036854774315 cannot be represented in type 'long'
Change-Id: Idda17d4f03997f9cc0555103a27f480f33e43877
2017-10-06 02:29:03 -05:00
|
|
|
#include <sal/config.h>
|
|
|
|
|
2017-03-21 06:23:09 -05:00
|
|
|
#include <limits>
|
Fix -fsanitize=signed-integer-overflow
during CppunitTest_sw_uiwriter (see below). vmiklos suggested making that addition
saturating, so I introduced o3tl::saturating_add for that.
<https://ci.libreoffice.org/job/lo_ubsan/684/console>:
> /sw/source/core/layout/sectfrm.cxx:1964:23: runtime error: signed integer overflow: 6203 + 9223372036854774315 cannot be represented in type 'long'
> #0 0x2b65623b9a65 in SwSectionFrame::Grow_(long, bool) /sw/source/core/layout/sectfrm.cxx:1964:23
> #1 0x2b65625d6f51 in SwFrame::Grow(long, bool, bool) /sw/source/core/layout/wsfrm.cxx:1172:20
> #2 0x2b6562385999 in SwSectionFrame::MakeAll(OutputDevice*) /sw/source/core/layout/sectfrm.cxx:749:12
> #3 0x2b6561b6c728 in SwFrame::PrepareMake(OutputDevice*) /sw/source/core/layout/calcmove.cxx:346:5
> #4 0x2b656257f355 in SwFrame::Calc(OutputDevice*) const /sw/source/core/layout/trvlfrm.cxx:1769:9
> #5 0x2b656247d232 in lcl_InnerCalcLayout(SwFrame*, long, bool) /sw/source/core/layout/tabfrm.cxx:1522:13
> #6 0x2b656247d635 in lcl_InnerCalcLayout(SwFrame*, long, bool) /sw/source/core/layout/tabfrm.cxx:1524:25
> #7 0x2b656247d635 in lcl_InnerCalcLayout(SwFrame*, long, bool) /sw/source/core/layout/tabfrm.cxx:1524:25
> #8 0x2b65624b9b2e in lcl_RecalcRow(SwRowFrame&, long) /sw/source/core/layout/tabfrm.cxx:1559:16
> #9 0x2b65624b0a9f in SwTabFrame::MakeAll(OutputDevice*) /sw/source/core/layout/tabfrm.cxx:2454:29
> #10 0x2b6561b6c728 in SwFrame::PrepareMake(OutputDevice*) /sw/source/core/layout/calcmove.cxx:346:5
> #11 0x2b656257f355 in SwFrame::Calc(OutputDevice*) const /sw/source/core/layout/trvlfrm.cxx:1769:9
> #12 0x2b6561b68bf1 in SwFrame::PrepareMake(OutputDevice*) /sw/source/core/layout/calcmove.cxx:249:13
> #13 0x2b656257f355 in SwFrame::Calc(OutputDevice*) const /sw/source/core/layout/trvlfrm.cxx:1769:9
> #14 0x2b6561b68bf1 in SwFrame::PrepareMake(OutputDevice*) /sw/source/core/layout/calcmove.cxx:249:13
> #15 0x2b656257f355 in SwFrame::Calc(OutputDevice*) const /sw/source/core/layout/trvlfrm.cxx:1769:9
> #16 0x2b6561b6e7de in SwFrame::OptPrepareMake() /sw/source/core/layout/calcmove.cxx:357:13
> #17 0x2b6561fa557d in SwFrame::OptCalc() const /sw/source/core/inc/frame.hxx:889:9
> #18 0x2b6561f6f40c in SwLayAction::FormatLayout(OutputDevice*, SwLayoutFrame*, bool) /sw/source/core/layout/layact.cxx:1368:13
> #19 0x2b6561f6f04a in SwLayAction::FormatLayout(OutputDevice*, SwLayoutFrame*, bool) /sw/source/core/layout/layact.cxx:1363:29
> #20 0x2b6561f8737e in SwLayAction::FormatLayoutTab(SwTabFrame*, bool) /sw/source/core/layout/layact.cxx:1576:25
> #21 0x2b6561f6eb14 in SwLayAction::FormatLayout(OutputDevice*, SwLayoutFrame*, bool) /sw/source/core/layout/layact.cxx:1360:32
> #22 0x2b6561f6f04a in SwLayAction::FormatLayout(OutputDevice*, SwLayoutFrame*, bool) /sw/source/core/layout/layact.cxx:1363:29
> #23 0x2b6561f50723 in SwLayAction::InternalAction(OutputDevice*) /sw/source/core/layout/layact.cxx:550:25
> #24 0x2b6561f47023 in SwLayAction::Action(OutputDevice*) /sw/source/core/layout/layact.cxx:341:5
> #25 0x2b6564f03b8f in SwViewShell::ImplEndAction(bool) /sw/source/core/view/viewsh.cxx:280:9
> #26 0x2b655ee80f89 in SwViewShell::EndAction(bool) /sw/inc/viewsh.hxx:605:9
> #27 0x2b655edcccbe in SwCursorShell::EndAction(bool, bool) /sw/source/core/crsr/crsrsh.cxx:258:5
> #28 0x2b6567ac5b5b in SwView::OuterResizePixel(Point const&, Size const&) /sw/source/uibase/uiview/viewport.cxx:1116:9
> #29 0x2b65421f88c1 in SfxViewFrame::DoAdjustPosSizePixel(SfxViewShell*, Point const&, Size const&, bool) /sfx2/source/view/viewfrm.cxx:1490:13
> #30 0x2b6542228d89 in SfxViewFrame::Resize(bool) /sfx2/source/view/viewfrm.cxx:2275:17
> #31 0x2b654226038f in SfxFrameViewWindow_Impl::Resize() /sfx2/source/view/viewfrm2.cxx:73:9
> #32 0x2b650ff227aa in vcl::Window::ImplCallResize() /vcl/source/window/event.cxx:522:5
> #33 0x2b6510a8d5f6 in vcl::Window::Show(bool, ShowFlags) /vcl/source/window/window.cxx:2276:13
> #34 0x2b6542132a1e in SfxBaseController::ConnectSfxFrame_Impl(SfxBaseController::ConnectSfxFrame) /sfx2/source/view/sfxbasecontroller.cxx:1250:13
> #35 0x2b654212c985 in SfxBaseController::attachFrame(com::sun::star::uno::Reference<com::sun::star::frame::XFrame> const&) /sfx2/source/view/sfxbasecontroller.cxx:550:13
> #36 0x2b6542084861 in (anonymous namespace)::SfxFrameLoader_Impl::impl_createDocumentView(com::sun::star::uno::Reference<com::sun::star::frame::XModel2> const&, com::sun::star::uno::Reference<com::sun::star::frame::XFrame> const&, comphelper::NamedValueCollection const&, rtl::OUString const&) /sfx2/source/view/frmload.cxx:599:5
> #37 0x2b65420777e9 in (anonymous namespace)::SfxFrameLoader_Impl::load(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&, com::sun::star::uno::Reference<com::sun::star::frame::XFrame> const&) /sfx2/source/view/frmload.cxx:716:13
> #38 0x2b65b0ed3384 in framework::LoadEnv::impl_loadContent() /framework/source/loadenv/loadenv.cxx:1087:24
> #39 0x2b65b0eb7531 in framework::LoadEnv::startLoading() /framework/source/loadenv/loadenv.cxx:372:20
> #40 0x2b65b0eb0063 in framework::LoadEnv::loadComponentFromURL(com::sun::star::uno::Reference<com::sun::star::frame::XComponentLoader> const&, com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&, rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) /framework/source/loadenv/loadenv.cxx:158:9
> #41 0x2b65b10e0078 in framework::Desktop::loadComponentFromURL(rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) /framework/source/services/desktop.cxx:618:12
> #42 0x2b65b10e02fa in non-virtual thunk to framework::Desktop::loadComponentFromURL(rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) /framework/source/services/desktop.cxx:606:64
> #43 0x2b657183ee13 in unotest::MacrosTest::loadFromDesktop(rtl::OUString const&, rtl::OUString const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) /unotest/source/cpp/macros_test.cxx:50:51
> #44 0x2b6533b674a3 in SwModelTestBase::loadURL(rtl::OUString const&, char const*, char const*) /sw/qa/extras/inc/swmodeltestbase.hxx:668:23
> #45 0x2b6533b69aa0 in SwModelTestBase::load(rtl::OUString const&, char const*, char const*) /sw/qa/extras/inc/swmodeltestbase.hxx:639:16
> #46 0x2b6533716c59 in SwUiWriterTest::createDoc(char const*) /sw/qa/extras/uiwriter/uiwriter.cxx:446:9
> #47 0x2b6533b50a9d in SwUiWriterTest::testTdf108524() /sw/qa/extras/uiwriter/uiwriter.cxx:5101:5
> #48 0x2b6533d7e36a in void std::_Mem_fn_base<void (SwUiWriterTest::*)(), true>::operator()<, void>(SwUiWriterTest*) const /home/tdf/lode/opt_private/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:600:11
> #49 0x2b6533d7e073 in void std::_Bind<std::_Mem_fn<void (SwUiWriterTest::*)()> (SwUiWriterTest*)>::__call<void, , 0ul>(std::tuple<>&&, std::_Index_tuple<0ul>) /home/tdf/lode/opt_private/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:1073:11
> #50 0x2b6533d7da81 in void std::_Bind<std::_Mem_fn<void (SwUiWriterTest::*)()> (SwUiWriterTest*)>::operator()<, void>() /home/tdf/lode/opt_private/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:1131:11
> #51 0x2b6533d7c459 in std::_Function_handler<void (), std::_Bind<std::_Mem_fn<void (SwUiWriterTest::*)()> (SwUiWriterTest*)> >::_M_invoke(std::_Any_data const&) /home/tdf/lode/opt_private/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:1871:2
> #52 0x2b6533d7edf0 in std::function<void ()>::operator()() const /home/tdf/lode/opt_private/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:2271:14
> #53 0x2b6533d7aaf5 in CppUnit::TestCaller<SwUiWriterTest>::runTest() /workdir/UnpackedTarball/cppunit/include/cppunit/TestCaller.h:175:7
> #54 0x2b64ed1ff0ad in CppUnit::TestCaseMethodFunctor::operator()() const /workdir/UnpackedTarball/cppunit/src/cppunit/TestCase.cpp:32:5
> #55 0x2b6508a28ea6 in (anonymous namespace)::Protector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) /test/source/vclbootstrapprotector.cxx:39:14
> #56 0x2b64ed1bdb77 in CppUnit::ProtectorChain::ProtectFunctor::operator()() const /workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:12
> #57 0x2b64fca7f7f6 in (anonymous namespace)::Prot::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) /unotest/source/cpp/unobootstrapprotector/unobootstrapprotector.cxx:89:12
> #58 0x2b64ed1bdb77 in CppUnit::ProtectorChain::ProtectFunctor::operator()() const /workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:12
> #59 0x2b64f8c39e73 in (anonymous namespace)::Prot::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) /unotest/source/cpp/unoexceptionprotector/unoexceptionprotector.cxx:63:16
> #60 0x2b64ed1bdb77 in CppUnit::ProtectorChain::ProtectFunctor::operator()() const /workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:12
> #61 0x2b64ed13950f in CppUnit::DefaultProtector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) /workdir/UnpackedTarball/cppunit/src/cppunit/DefaultProtector.cpp:15:12
> #62 0x2b64ed1bdb77 in CppUnit::ProtectorChain::ProtectFunctor::operator()() const /workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:12
> #63 0x2b64ed1b3da0 in CppUnit::ProtectorChain::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) /workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:86:18
> #64 0x2b64ed288efb in CppUnit::TestResult::protect(CppUnit::Functor const&, CppUnit::Test*, std::string const&) /workdir/UnpackedTarball/cppunit/src/cppunit/TestResult.cpp:182:10
> #65 0x2b64ed1fc12d in CppUnit::TestCase::run(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestCase.cpp:91:5
> #66 0x2b64ed2022e3 in CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:64:5
> #67 0x2b64ed20124d in CppUnit::TestComposite::run(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:23:3
> #68 0x2b64ed2022e3 in CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:64:5
> #69 0x2b64ed20124d in CppUnit::TestComposite::run(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:23:3
> #70 0x2b64ed2c88b6 in CppUnit::TestRunner::WrappingSuite::run(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestRunner.cpp:47:5
> #71 0x2b64ed287049 in CppUnit::TestResult::runTest(CppUnit::Test*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestResult.cpp:149:3
> #72 0x2b64ed2c9d57 in CppUnit::TestRunner::run(CppUnit::TestResult&, std::string const&) /workdir/UnpackedTarball/cppunit/src/cppunit/TestRunner.cpp:96:3
> #73 0x515fdd in (anonymous namespace)::ProtectedFixtureFunctor::run() const /sal/cppunittester/cppunittester.cxx:319:13
> #74 0x51098f in sal_main() /sal/cppunittester/cppunittester.cxx:469:14
> #75 0x50eaa2 in main /sal/cppunittester/cppunittester.cxx:376:1
> #76 0x2b64eeeefc04 in __libc_start_main (/lib64/libc.so.6+0x21c04)
> #77 0x433704 in _start (/workdir/LinkTarget/Executable/cppunittester+0x433704)> /sw/source/core/layout/sectfrm.cxx:1964:23: runtime error: signed integer overflow: 6203 + 9223372036854774315 cannot be represented in type 'long'
Change-Id: Idda17d4f03997f9cc0555103a27f480f33e43877
2017-10-06 02:29:03 -05:00
|
|
|
#include <type_traits>
|
|
|
|
|
2017-04-12 07:34:10 -05:00
|
|
|
#if defined(_MSC_VER)
|
2017-03-21 06:23:09 -05:00
|
|
|
#include <safeint.h>
|
|
|
|
#else
|
|
|
|
#ifndef __has_builtin
|
|
|
|
# define __has_builtin(x) 0
|
|
|
|
#endif
|
|
|
|
#endif
|
|
|
|
|
|
|
|
namespace o3tl
|
|
|
|
{
|
|
|
|
|
Fix -fsanitize=signed-integer-overflow
during CppunitTest_sw_uiwriter (see below). vmiklos suggested making that addition
saturating, so I introduced o3tl::saturating_add for that.
<https://ci.libreoffice.org/job/lo_ubsan/684/console>:
> /sw/source/core/layout/sectfrm.cxx:1964:23: runtime error: signed integer overflow: 6203 + 9223372036854774315 cannot be represented in type 'long'
> #0 0x2b65623b9a65 in SwSectionFrame::Grow_(long, bool) /sw/source/core/layout/sectfrm.cxx:1964:23
> #1 0x2b65625d6f51 in SwFrame::Grow(long, bool, bool) /sw/source/core/layout/wsfrm.cxx:1172:20
> #2 0x2b6562385999 in SwSectionFrame::MakeAll(OutputDevice*) /sw/source/core/layout/sectfrm.cxx:749:12
> #3 0x2b6561b6c728 in SwFrame::PrepareMake(OutputDevice*) /sw/source/core/layout/calcmove.cxx:346:5
> #4 0x2b656257f355 in SwFrame::Calc(OutputDevice*) const /sw/source/core/layout/trvlfrm.cxx:1769:9
> #5 0x2b656247d232 in lcl_InnerCalcLayout(SwFrame*, long, bool) /sw/source/core/layout/tabfrm.cxx:1522:13
> #6 0x2b656247d635 in lcl_InnerCalcLayout(SwFrame*, long, bool) /sw/source/core/layout/tabfrm.cxx:1524:25
> #7 0x2b656247d635 in lcl_InnerCalcLayout(SwFrame*, long, bool) /sw/source/core/layout/tabfrm.cxx:1524:25
> #8 0x2b65624b9b2e in lcl_RecalcRow(SwRowFrame&, long) /sw/source/core/layout/tabfrm.cxx:1559:16
> #9 0x2b65624b0a9f in SwTabFrame::MakeAll(OutputDevice*) /sw/source/core/layout/tabfrm.cxx:2454:29
> #10 0x2b6561b6c728 in SwFrame::PrepareMake(OutputDevice*) /sw/source/core/layout/calcmove.cxx:346:5
> #11 0x2b656257f355 in SwFrame::Calc(OutputDevice*) const /sw/source/core/layout/trvlfrm.cxx:1769:9
> #12 0x2b6561b68bf1 in SwFrame::PrepareMake(OutputDevice*) /sw/source/core/layout/calcmove.cxx:249:13
> #13 0x2b656257f355 in SwFrame::Calc(OutputDevice*) const /sw/source/core/layout/trvlfrm.cxx:1769:9
> #14 0x2b6561b68bf1 in SwFrame::PrepareMake(OutputDevice*) /sw/source/core/layout/calcmove.cxx:249:13
> #15 0x2b656257f355 in SwFrame::Calc(OutputDevice*) const /sw/source/core/layout/trvlfrm.cxx:1769:9
> #16 0x2b6561b6e7de in SwFrame::OptPrepareMake() /sw/source/core/layout/calcmove.cxx:357:13
> #17 0x2b6561fa557d in SwFrame::OptCalc() const /sw/source/core/inc/frame.hxx:889:9
> #18 0x2b6561f6f40c in SwLayAction::FormatLayout(OutputDevice*, SwLayoutFrame*, bool) /sw/source/core/layout/layact.cxx:1368:13
> #19 0x2b6561f6f04a in SwLayAction::FormatLayout(OutputDevice*, SwLayoutFrame*, bool) /sw/source/core/layout/layact.cxx:1363:29
> #20 0x2b6561f8737e in SwLayAction::FormatLayoutTab(SwTabFrame*, bool) /sw/source/core/layout/layact.cxx:1576:25
> #21 0x2b6561f6eb14 in SwLayAction::FormatLayout(OutputDevice*, SwLayoutFrame*, bool) /sw/source/core/layout/layact.cxx:1360:32
> #22 0x2b6561f6f04a in SwLayAction::FormatLayout(OutputDevice*, SwLayoutFrame*, bool) /sw/source/core/layout/layact.cxx:1363:29
> #23 0x2b6561f50723 in SwLayAction::InternalAction(OutputDevice*) /sw/source/core/layout/layact.cxx:550:25
> #24 0x2b6561f47023 in SwLayAction::Action(OutputDevice*) /sw/source/core/layout/layact.cxx:341:5
> #25 0x2b6564f03b8f in SwViewShell::ImplEndAction(bool) /sw/source/core/view/viewsh.cxx:280:9
> #26 0x2b655ee80f89 in SwViewShell::EndAction(bool) /sw/inc/viewsh.hxx:605:9
> #27 0x2b655edcccbe in SwCursorShell::EndAction(bool, bool) /sw/source/core/crsr/crsrsh.cxx:258:5
> #28 0x2b6567ac5b5b in SwView::OuterResizePixel(Point const&, Size const&) /sw/source/uibase/uiview/viewport.cxx:1116:9
> #29 0x2b65421f88c1 in SfxViewFrame::DoAdjustPosSizePixel(SfxViewShell*, Point const&, Size const&, bool) /sfx2/source/view/viewfrm.cxx:1490:13
> #30 0x2b6542228d89 in SfxViewFrame::Resize(bool) /sfx2/source/view/viewfrm.cxx:2275:17
> #31 0x2b654226038f in SfxFrameViewWindow_Impl::Resize() /sfx2/source/view/viewfrm2.cxx:73:9
> #32 0x2b650ff227aa in vcl::Window::ImplCallResize() /vcl/source/window/event.cxx:522:5
> #33 0x2b6510a8d5f6 in vcl::Window::Show(bool, ShowFlags) /vcl/source/window/window.cxx:2276:13
> #34 0x2b6542132a1e in SfxBaseController::ConnectSfxFrame_Impl(SfxBaseController::ConnectSfxFrame) /sfx2/source/view/sfxbasecontroller.cxx:1250:13
> #35 0x2b654212c985 in SfxBaseController::attachFrame(com::sun::star::uno::Reference<com::sun::star::frame::XFrame> const&) /sfx2/source/view/sfxbasecontroller.cxx:550:13
> #36 0x2b6542084861 in (anonymous namespace)::SfxFrameLoader_Impl::impl_createDocumentView(com::sun::star::uno::Reference<com::sun::star::frame::XModel2> const&, com::sun::star::uno::Reference<com::sun::star::frame::XFrame> const&, comphelper::NamedValueCollection const&, rtl::OUString const&) /sfx2/source/view/frmload.cxx:599:5
> #37 0x2b65420777e9 in (anonymous namespace)::SfxFrameLoader_Impl::load(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&, com::sun::star::uno::Reference<com::sun::star::frame::XFrame> const&) /sfx2/source/view/frmload.cxx:716:13
> #38 0x2b65b0ed3384 in framework::LoadEnv::impl_loadContent() /framework/source/loadenv/loadenv.cxx:1087:24
> #39 0x2b65b0eb7531 in framework::LoadEnv::startLoading() /framework/source/loadenv/loadenv.cxx:372:20
> #40 0x2b65b0eb0063 in framework::LoadEnv::loadComponentFromURL(com::sun::star::uno::Reference<com::sun::star::frame::XComponentLoader> const&, com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&, rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) /framework/source/loadenv/loadenv.cxx:158:9
> #41 0x2b65b10e0078 in framework::Desktop::loadComponentFromURL(rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) /framework/source/services/desktop.cxx:618:12
> #42 0x2b65b10e02fa in non-virtual thunk to framework::Desktop::loadComponentFromURL(rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) /framework/source/services/desktop.cxx:606:64
> #43 0x2b657183ee13 in unotest::MacrosTest::loadFromDesktop(rtl::OUString const&, rtl::OUString const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) /unotest/source/cpp/macros_test.cxx:50:51
> #44 0x2b6533b674a3 in SwModelTestBase::loadURL(rtl::OUString const&, char const*, char const*) /sw/qa/extras/inc/swmodeltestbase.hxx:668:23
> #45 0x2b6533b69aa0 in SwModelTestBase::load(rtl::OUString const&, char const*, char const*) /sw/qa/extras/inc/swmodeltestbase.hxx:639:16
> #46 0x2b6533716c59 in SwUiWriterTest::createDoc(char const*) /sw/qa/extras/uiwriter/uiwriter.cxx:446:9
> #47 0x2b6533b50a9d in SwUiWriterTest::testTdf108524() /sw/qa/extras/uiwriter/uiwriter.cxx:5101:5
> #48 0x2b6533d7e36a in void std::_Mem_fn_base<void (SwUiWriterTest::*)(), true>::operator()<, void>(SwUiWriterTest*) const /home/tdf/lode/opt_private/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:600:11
> #49 0x2b6533d7e073 in void std::_Bind<std::_Mem_fn<void (SwUiWriterTest::*)()> (SwUiWriterTest*)>::__call<void, , 0ul>(std::tuple<>&&, std::_Index_tuple<0ul>) /home/tdf/lode/opt_private/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:1073:11
> #50 0x2b6533d7da81 in void std::_Bind<std::_Mem_fn<void (SwUiWriterTest::*)()> (SwUiWriterTest*)>::operator()<, void>() /home/tdf/lode/opt_private/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:1131:11
> #51 0x2b6533d7c459 in std::_Function_handler<void (), std::_Bind<std::_Mem_fn<void (SwUiWriterTest::*)()> (SwUiWriterTest*)> >::_M_invoke(std::_Any_data const&) /home/tdf/lode/opt_private/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:1871:2
> #52 0x2b6533d7edf0 in std::function<void ()>::operator()() const /home/tdf/lode/opt_private/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:2271:14
> #53 0x2b6533d7aaf5 in CppUnit::TestCaller<SwUiWriterTest>::runTest() /workdir/UnpackedTarball/cppunit/include/cppunit/TestCaller.h:175:7
> #54 0x2b64ed1ff0ad in CppUnit::TestCaseMethodFunctor::operator()() const /workdir/UnpackedTarball/cppunit/src/cppunit/TestCase.cpp:32:5
> #55 0x2b6508a28ea6 in (anonymous namespace)::Protector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) /test/source/vclbootstrapprotector.cxx:39:14
> #56 0x2b64ed1bdb77 in CppUnit::ProtectorChain::ProtectFunctor::operator()() const /workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:12
> #57 0x2b64fca7f7f6 in (anonymous namespace)::Prot::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) /unotest/source/cpp/unobootstrapprotector/unobootstrapprotector.cxx:89:12
> #58 0x2b64ed1bdb77 in CppUnit::ProtectorChain::ProtectFunctor::operator()() const /workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:12
> #59 0x2b64f8c39e73 in (anonymous namespace)::Prot::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) /unotest/source/cpp/unoexceptionprotector/unoexceptionprotector.cxx:63:16
> #60 0x2b64ed1bdb77 in CppUnit::ProtectorChain::ProtectFunctor::operator()() const /workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:12
> #61 0x2b64ed13950f in CppUnit::DefaultProtector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) /workdir/UnpackedTarball/cppunit/src/cppunit/DefaultProtector.cpp:15:12
> #62 0x2b64ed1bdb77 in CppUnit::ProtectorChain::ProtectFunctor::operator()() const /workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:12
> #63 0x2b64ed1b3da0 in CppUnit::ProtectorChain::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) /workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:86:18
> #64 0x2b64ed288efb in CppUnit::TestResult::protect(CppUnit::Functor const&, CppUnit::Test*, std::string const&) /workdir/UnpackedTarball/cppunit/src/cppunit/TestResult.cpp:182:10
> #65 0x2b64ed1fc12d in CppUnit::TestCase::run(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestCase.cpp:91:5
> #66 0x2b64ed2022e3 in CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:64:5
> #67 0x2b64ed20124d in CppUnit::TestComposite::run(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:23:3
> #68 0x2b64ed2022e3 in CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:64:5
> #69 0x2b64ed20124d in CppUnit::TestComposite::run(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:23:3
> #70 0x2b64ed2c88b6 in CppUnit::TestRunner::WrappingSuite::run(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestRunner.cpp:47:5
> #71 0x2b64ed287049 in CppUnit::TestResult::runTest(CppUnit::Test*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestResult.cpp:149:3
> #72 0x2b64ed2c9d57 in CppUnit::TestRunner::run(CppUnit::TestResult&, std::string const&) /workdir/UnpackedTarball/cppunit/src/cppunit/TestRunner.cpp:96:3
> #73 0x515fdd in (anonymous namespace)::ProtectedFixtureFunctor::run() const /sal/cppunittester/cppunittester.cxx:319:13
> #74 0x51098f in sal_main() /sal/cppunittester/cppunittester.cxx:469:14
> #75 0x50eaa2 in main /sal/cppunittester/cppunittester.cxx:376:1
> #76 0x2b64eeeefc04 in __libc_start_main (/lib64/libc.so.6+0x21c04)
> #77 0x433704 in _start (/workdir/LinkTarget/Executable/cppunittester+0x433704)> /sw/source/core/layout/sectfrm.cxx:1964:23: runtime error: signed integer overflow: 6203 + 9223372036854774315 cannot be represented in type 'long'
Change-Id: Idda17d4f03997f9cc0555103a27f480f33e43877
2017-10-06 02:29:03 -05:00
|
|
|
template<typename T> inline
|
|
|
|
typename std::enable_if<std::is_signed<T>::value, T>::type saturating_add(
|
|
|
|
T a, T b)
|
|
|
|
{
|
|
|
|
if (b >= 0) {
|
|
|
|
if (a <= std::numeric_limits<T>::max() - b) {
|
|
|
|
return a + b;
|
|
|
|
} else {
|
|
|
|
return std::numeric_limits<T>::max();
|
|
|
|
}
|
|
|
|
} else {
|
2017-10-26 08:33:40 -05:00
|
|
|
if (a >= std::numeric_limits<T>::min() - b) {
|
|
|
|
return a + b;
|
Fix -fsanitize=signed-integer-overflow
during CppunitTest_sw_uiwriter (see below). vmiklos suggested making that addition
saturating, so I introduced o3tl::saturating_add for that.
<https://ci.libreoffice.org/job/lo_ubsan/684/console>:
> /sw/source/core/layout/sectfrm.cxx:1964:23: runtime error: signed integer overflow: 6203 + 9223372036854774315 cannot be represented in type 'long'
> #0 0x2b65623b9a65 in SwSectionFrame::Grow_(long, bool) /sw/source/core/layout/sectfrm.cxx:1964:23
> #1 0x2b65625d6f51 in SwFrame::Grow(long, bool, bool) /sw/source/core/layout/wsfrm.cxx:1172:20
> #2 0x2b6562385999 in SwSectionFrame::MakeAll(OutputDevice*) /sw/source/core/layout/sectfrm.cxx:749:12
> #3 0x2b6561b6c728 in SwFrame::PrepareMake(OutputDevice*) /sw/source/core/layout/calcmove.cxx:346:5
> #4 0x2b656257f355 in SwFrame::Calc(OutputDevice*) const /sw/source/core/layout/trvlfrm.cxx:1769:9
> #5 0x2b656247d232 in lcl_InnerCalcLayout(SwFrame*, long, bool) /sw/source/core/layout/tabfrm.cxx:1522:13
> #6 0x2b656247d635 in lcl_InnerCalcLayout(SwFrame*, long, bool) /sw/source/core/layout/tabfrm.cxx:1524:25
> #7 0x2b656247d635 in lcl_InnerCalcLayout(SwFrame*, long, bool) /sw/source/core/layout/tabfrm.cxx:1524:25
> #8 0x2b65624b9b2e in lcl_RecalcRow(SwRowFrame&, long) /sw/source/core/layout/tabfrm.cxx:1559:16
> #9 0x2b65624b0a9f in SwTabFrame::MakeAll(OutputDevice*) /sw/source/core/layout/tabfrm.cxx:2454:29
> #10 0x2b6561b6c728 in SwFrame::PrepareMake(OutputDevice*) /sw/source/core/layout/calcmove.cxx:346:5
> #11 0x2b656257f355 in SwFrame::Calc(OutputDevice*) const /sw/source/core/layout/trvlfrm.cxx:1769:9
> #12 0x2b6561b68bf1 in SwFrame::PrepareMake(OutputDevice*) /sw/source/core/layout/calcmove.cxx:249:13
> #13 0x2b656257f355 in SwFrame::Calc(OutputDevice*) const /sw/source/core/layout/trvlfrm.cxx:1769:9
> #14 0x2b6561b68bf1 in SwFrame::PrepareMake(OutputDevice*) /sw/source/core/layout/calcmove.cxx:249:13
> #15 0x2b656257f355 in SwFrame::Calc(OutputDevice*) const /sw/source/core/layout/trvlfrm.cxx:1769:9
> #16 0x2b6561b6e7de in SwFrame::OptPrepareMake() /sw/source/core/layout/calcmove.cxx:357:13
> #17 0x2b6561fa557d in SwFrame::OptCalc() const /sw/source/core/inc/frame.hxx:889:9
> #18 0x2b6561f6f40c in SwLayAction::FormatLayout(OutputDevice*, SwLayoutFrame*, bool) /sw/source/core/layout/layact.cxx:1368:13
> #19 0x2b6561f6f04a in SwLayAction::FormatLayout(OutputDevice*, SwLayoutFrame*, bool) /sw/source/core/layout/layact.cxx:1363:29
> #20 0x2b6561f8737e in SwLayAction::FormatLayoutTab(SwTabFrame*, bool) /sw/source/core/layout/layact.cxx:1576:25
> #21 0x2b6561f6eb14 in SwLayAction::FormatLayout(OutputDevice*, SwLayoutFrame*, bool) /sw/source/core/layout/layact.cxx:1360:32
> #22 0x2b6561f6f04a in SwLayAction::FormatLayout(OutputDevice*, SwLayoutFrame*, bool) /sw/source/core/layout/layact.cxx:1363:29
> #23 0x2b6561f50723 in SwLayAction::InternalAction(OutputDevice*) /sw/source/core/layout/layact.cxx:550:25
> #24 0x2b6561f47023 in SwLayAction::Action(OutputDevice*) /sw/source/core/layout/layact.cxx:341:5
> #25 0x2b6564f03b8f in SwViewShell::ImplEndAction(bool) /sw/source/core/view/viewsh.cxx:280:9
> #26 0x2b655ee80f89 in SwViewShell::EndAction(bool) /sw/inc/viewsh.hxx:605:9
> #27 0x2b655edcccbe in SwCursorShell::EndAction(bool, bool) /sw/source/core/crsr/crsrsh.cxx:258:5
> #28 0x2b6567ac5b5b in SwView::OuterResizePixel(Point const&, Size const&) /sw/source/uibase/uiview/viewport.cxx:1116:9
> #29 0x2b65421f88c1 in SfxViewFrame::DoAdjustPosSizePixel(SfxViewShell*, Point const&, Size const&, bool) /sfx2/source/view/viewfrm.cxx:1490:13
> #30 0x2b6542228d89 in SfxViewFrame::Resize(bool) /sfx2/source/view/viewfrm.cxx:2275:17
> #31 0x2b654226038f in SfxFrameViewWindow_Impl::Resize() /sfx2/source/view/viewfrm2.cxx:73:9
> #32 0x2b650ff227aa in vcl::Window::ImplCallResize() /vcl/source/window/event.cxx:522:5
> #33 0x2b6510a8d5f6 in vcl::Window::Show(bool, ShowFlags) /vcl/source/window/window.cxx:2276:13
> #34 0x2b6542132a1e in SfxBaseController::ConnectSfxFrame_Impl(SfxBaseController::ConnectSfxFrame) /sfx2/source/view/sfxbasecontroller.cxx:1250:13
> #35 0x2b654212c985 in SfxBaseController::attachFrame(com::sun::star::uno::Reference<com::sun::star::frame::XFrame> const&) /sfx2/source/view/sfxbasecontroller.cxx:550:13
> #36 0x2b6542084861 in (anonymous namespace)::SfxFrameLoader_Impl::impl_createDocumentView(com::sun::star::uno::Reference<com::sun::star::frame::XModel2> const&, com::sun::star::uno::Reference<com::sun::star::frame::XFrame> const&, comphelper::NamedValueCollection const&, rtl::OUString const&) /sfx2/source/view/frmload.cxx:599:5
> #37 0x2b65420777e9 in (anonymous namespace)::SfxFrameLoader_Impl::load(com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&, com::sun::star::uno::Reference<com::sun::star::frame::XFrame> const&) /sfx2/source/view/frmload.cxx:716:13
> #38 0x2b65b0ed3384 in framework::LoadEnv::impl_loadContent() /framework/source/loadenv/loadenv.cxx:1087:24
> #39 0x2b65b0eb7531 in framework::LoadEnv::startLoading() /framework/source/loadenv/loadenv.cxx:372:20
> #40 0x2b65b0eb0063 in framework::LoadEnv::loadComponentFromURL(com::sun::star::uno::Reference<com::sun::star::frame::XComponentLoader> const&, com::sun::star::uno::Reference<com::sun::star::uno::XComponentContext> const&, rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) /framework/source/loadenv/loadenv.cxx:158:9
> #41 0x2b65b10e0078 in framework::Desktop::loadComponentFromURL(rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) /framework/source/services/desktop.cxx:618:12
> #42 0x2b65b10e02fa in non-virtual thunk to framework::Desktop::loadComponentFromURL(rtl::OUString const&, rtl::OUString const&, int, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) /framework/source/services/desktop.cxx:606:64
> #43 0x2b657183ee13 in unotest::MacrosTest::loadFromDesktop(rtl::OUString const&, rtl::OUString const&, com::sun::star::uno::Sequence<com::sun::star::beans::PropertyValue> const&) /unotest/source/cpp/macros_test.cxx:50:51
> #44 0x2b6533b674a3 in SwModelTestBase::loadURL(rtl::OUString const&, char const*, char const*) /sw/qa/extras/inc/swmodeltestbase.hxx:668:23
> #45 0x2b6533b69aa0 in SwModelTestBase::load(rtl::OUString const&, char const*, char const*) /sw/qa/extras/inc/swmodeltestbase.hxx:639:16
> #46 0x2b6533716c59 in SwUiWriterTest::createDoc(char const*) /sw/qa/extras/uiwriter/uiwriter.cxx:446:9
> #47 0x2b6533b50a9d in SwUiWriterTest::testTdf108524() /sw/qa/extras/uiwriter/uiwriter.cxx:5101:5
> #48 0x2b6533d7e36a in void std::_Mem_fn_base<void (SwUiWriterTest::*)(), true>::operator()<, void>(SwUiWriterTest*) const /home/tdf/lode/opt_private/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:600:11
> #49 0x2b6533d7e073 in void std::_Bind<std::_Mem_fn<void (SwUiWriterTest::*)()> (SwUiWriterTest*)>::__call<void, , 0ul>(std::tuple<>&&, std::_Index_tuple<0ul>) /home/tdf/lode/opt_private/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:1073:11
> #50 0x2b6533d7da81 in void std::_Bind<std::_Mem_fn<void (SwUiWriterTest::*)()> (SwUiWriterTest*)>::operator()<, void>() /home/tdf/lode/opt_private/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:1131:11
> #51 0x2b6533d7c459 in std::_Function_handler<void (), std::_Bind<std::_Mem_fn<void (SwUiWriterTest::*)()> (SwUiWriterTest*)> >::_M_invoke(std::_Any_data const&) /home/tdf/lode/opt_private/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:1871:2
> #52 0x2b6533d7edf0 in std::function<void ()>::operator()() const /home/tdf/lode/opt_private/lib/gcc/x86_64-unknown-linux-gnu/5.2.0/../../../../include/c++/5.2.0/functional:2271:14
> #53 0x2b6533d7aaf5 in CppUnit::TestCaller<SwUiWriterTest>::runTest() /workdir/UnpackedTarball/cppunit/include/cppunit/TestCaller.h:175:7
> #54 0x2b64ed1ff0ad in CppUnit::TestCaseMethodFunctor::operator()() const /workdir/UnpackedTarball/cppunit/src/cppunit/TestCase.cpp:32:5
> #55 0x2b6508a28ea6 in (anonymous namespace)::Protector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) /test/source/vclbootstrapprotector.cxx:39:14
> #56 0x2b64ed1bdb77 in CppUnit::ProtectorChain::ProtectFunctor::operator()() const /workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:12
> #57 0x2b64fca7f7f6 in (anonymous namespace)::Prot::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) /unotest/source/cpp/unobootstrapprotector/unobootstrapprotector.cxx:89:12
> #58 0x2b64ed1bdb77 in CppUnit::ProtectorChain::ProtectFunctor::operator()() const /workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:12
> #59 0x2b64f8c39e73 in (anonymous namespace)::Prot::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) /unotest/source/cpp/unoexceptionprotector/unoexceptionprotector.cxx:63:16
> #60 0x2b64ed1bdb77 in CppUnit::ProtectorChain::ProtectFunctor::operator()() const /workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:12
> #61 0x2b64ed13950f in CppUnit::DefaultProtector::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) /workdir/UnpackedTarball/cppunit/src/cppunit/DefaultProtector.cpp:15:12
> #62 0x2b64ed1bdb77 in CppUnit::ProtectorChain::ProtectFunctor::operator()() const /workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:20:12
> #63 0x2b64ed1b3da0 in CppUnit::ProtectorChain::protect(CppUnit::Functor const&, CppUnit::ProtectorContext const&) /workdir/UnpackedTarball/cppunit/src/cppunit/ProtectorChain.cpp:86:18
> #64 0x2b64ed288efb in CppUnit::TestResult::protect(CppUnit::Functor const&, CppUnit::Test*, std::string const&) /workdir/UnpackedTarball/cppunit/src/cppunit/TestResult.cpp:182:10
> #65 0x2b64ed1fc12d in CppUnit::TestCase::run(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestCase.cpp:91:5
> #66 0x2b64ed2022e3 in CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:64:5
> #67 0x2b64ed20124d in CppUnit::TestComposite::run(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:23:3
> #68 0x2b64ed2022e3 in CppUnit::TestComposite::doRunChildTests(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:64:5
> #69 0x2b64ed20124d in CppUnit::TestComposite::run(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestComposite.cpp:23:3
> #70 0x2b64ed2c88b6 in CppUnit::TestRunner::WrappingSuite::run(CppUnit::TestResult*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestRunner.cpp:47:5
> #71 0x2b64ed287049 in CppUnit::TestResult::runTest(CppUnit::Test*) /workdir/UnpackedTarball/cppunit/src/cppunit/TestResult.cpp:149:3
> #72 0x2b64ed2c9d57 in CppUnit::TestRunner::run(CppUnit::TestResult&, std::string const&) /workdir/UnpackedTarball/cppunit/src/cppunit/TestRunner.cpp:96:3
> #73 0x515fdd in (anonymous namespace)::ProtectedFixtureFunctor::run() const /sal/cppunittester/cppunittester.cxx:319:13
> #74 0x51098f in sal_main() /sal/cppunittester/cppunittester.cxx:469:14
> #75 0x50eaa2 in main /sal/cppunittester/cppunittester.cxx:376:1
> #76 0x2b64eeeefc04 in __libc_start_main (/lib64/libc.so.6+0x21c04)
> #77 0x433704 in _start (/workdir/LinkTarget/Executable/cppunittester+0x433704)> /sw/source/core/layout/sectfrm.cxx:1964:23: runtime error: signed integer overflow: 6203 + 9223372036854774315 cannot be represented in type 'long'
Change-Id: Idda17d4f03997f9cc0555103a27f480f33e43877
2017-10-06 02:29:03 -05:00
|
|
|
} else {
|
|
|
|
return std::numeric_limits<T>::min();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename T> inline
|
|
|
|
typename std::enable_if<std::is_unsigned<T>::value, T>::type saturating_add(
|
|
|
|
T a, T b)
|
|
|
|
{
|
|
|
|
if (a <= std::numeric_limits<T>::max() - b) {
|
|
|
|
return a + b;
|
|
|
|
} else {
|
|
|
|
return std::numeric_limits<T>::max();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2018-01-28 08:15:44 -06:00
|
|
|
template<typename T> inline
|
|
|
|
typename std::enable_if<std::is_signed<T>::value, T>::type saturating_sub(
|
|
|
|
T a, T b)
|
|
|
|
{
|
|
|
|
if (b >= 0) {
|
|
|
|
if (a >= std::numeric_limits<T>::min() + b) {
|
|
|
|
return a - b;
|
|
|
|
} else {
|
|
|
|
return std::numeric_limits<T>::min();
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
if (a <= std::numeric_limits<T>::max() + b) {
|
|
|
|
return a - b;
|
|
|
|
} else {
|
|
|
|
return std::numeric_limits<T>::max();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
template<typename T> inline
|
|
|
|
typename std::enable_if<std::is_unsigned<T>::value, T>::type saturating_sub(
|
|
|
|
T a, T b)
|
|
|
|
{
|
|
|
|
if (a >= std::numeric_limits<T>::min() + b) {
|
|
|
|
return a - b;
|
|
|
|
} else {
|
|
|
|
return std::numeric_limits<T>::min();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-10-26 04:45:08 -05:00
|
|
|
template<typename T> inline
|
|
|
|
typename std::enable_if<std::is_signed<T>::value, T>::type saturating_toggle_sign(
|
|
|
|
T a)
|
|
|
|
{
|
|
|
|
if (a == std::numeric_limits<T>::min())
|
|
|
|
return std::numeric_limits<T>::max();
|
|
|
|
return a * -1;
|
|
|
|
}
|
|
|
|
|
2017-04-12 07:34:10 -05:00
|
|
|
#if defined(_MSC_VER)
|
2017-03-21 06:23:09 -05:00
|
|
|
|
|
|
|
template<typename T> inline bool checked_multiply(T a, T b, T& result)
|
|
|
|
{
|
|
|
|
return !msl::utilities::SafeMultiply(a, b, result);
|
|
|
|
}
|
|
|
|
|
2017-10-24 09:17:49 -05:00
|
|
|
template<typename T> inline bool checked_add(T a, T b, T& result)
|
|
|
|
{
|
|
|
|
return !msl::utilities::SafeAdd(a, b, result);
|
|
|
|
}
|
|
|
|
|
2017-10-25 03:44:59 -05:00
|
|
|
template<typename T> inline bool checked_sub(T a, T b, T& result)
|
|
|
|
{
|
|
|
|
return !msl::utilities::SafeSubtract(a, b, result);
|
|
|
|
}
|
|
|
|
|
2018-08-29 06:49:03 -05:00
|
|
|
#elif (defined __GNUC__ && __GNUC__ >= 5) || (__has_builtin(__builtin_mul_overflow) && !(defined ANDROID && defined __clang__) && !(defined(__clang__) && defined(__i386__)))
|
|
|
|
// 32-bit clang fails with undefined reference to `__mulodi4'
|
2017-03-21 06:23:09 -05:00
|
|
|
|
|
|
|
template<typename T> inline bool checked_multiply(T a, T b, T& result)
|
|
|
|
{
|
|
|
|
return __builtin_mul_overflow(a, b, &result);
|
|
|
|
}
|
|
|
|
|
2017-10-24 09:17:49 -05:00
|
|
|
template<typename T> inline bool checked_add(T a, T b, T& result)
|
|
|
|
{
|
|
|
|
return __builtin_add_overflow(a, b, &result);
|
|
|
|
}
|
|
|
|
|
2017-10-25 03:44:59 -05:00
|
|
|
template<typename T> inline bool checked_sub(T a, T b, T& result)
|
|
|
|
{
|
|
|
|
return __builtin_sub_overflow(a, b, &result);
|
|
|
|
}
|
|
|
|
|
2017-03-21 06:23:09 -05:00
|
|
|
#else
|
|
|
|
|
|
|
|
//https://www.securecoding.cert.org/confluence/display/c/INT32-C.+Ensure+that+operations+on+signed+integers+do+not+result+in+overflow
|
|
|
|
template<typename T> inline typename std::enable_if<std::is_signed<T>::value, bool>::type checked_multiply(T a, T b, T& result)
|
|
|
|
{
|
|
|
|
if (a > 0) { /* a is positive */
|
|
|
|
if (b > 0) { /* a and b are positive */
|
|
|
|
if (a > (std::numeric_limits<T>::max() / b)) {
|
|
|
|
return true; /* Handle error */
|
|
|
|
}
|
|
|
|
} else { /* a positive, b nonpositive */
|
|
|
|
if (b < (std::numeric_limits<T>::min() / a)) {
|
|
|
|
return true; /* Handle error */
|
|
|
|
}
|
|
|
|
} /* a positive, b nonpositive */
|
|
|
|
} else { /* a is nonpositive */
|
|
|
|
if (b > 0) { /* a is nonpositive, b is positive */
|
|
|
|
if (a < (std::numeric_limits<T>::min() / b)) {
|
|
|
|
return true; /* Handle error */
|
|
|
|
}
|
|
|
|
} else { /* a and b are nonpositive */
|
|
|
|
if ( (a != 0) && (b < (std::numeric_limits<T>::max() / a))) {
|
|
|
|
return true; /* Handle error */
|
|
|
|
}
|
|
|
|
} /* End if a and b are nonpositive */
|
|
|
|
} /* End if a is nonpositive */
|
|
|
|
|
|
|
|
result = a * b;
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
//https://www.securecoding.cert.org/confluence/display/c/INT30-C.+Ensure+that+unsigned+integer+operations+do+not+wrap
|
|
|
|
template<typename T> inline typename std::enable_if<std::is_unsigned<T>::value, bool>::type checked_multiply(T a, T b, T& result)
|
|
|
|
{
|
|
|
|
if (b && a > std::numeric_limits<T>::max() / b) {
|
|
|
|
return true;/* Handle error */
|
|
|
|
}
|
|
|
|
|
|
|
|
result = a * b;
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-10-24 09:17:49 -05:00
|
|
|
//https://www.securecoding.cert.org/confluence/display/c/INT32-C.+Ensure+that+operations+on+signed+integers+do+not+result+in+overflow
|
|
|
|
template<typename T> inline typename std::enable_if<std::is_signed<T>::value, bool>::type checked_add(T a, T b, T& result)
|
|
|
|
{
|
|
|
|
if (((b > 0) && (a > (std::numeric_limits<T>::max() - b))) ||
|
|
|
|
((b < 0) && (a < (std::numeric_limits<T>::min() - b)))) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
result = a + b;
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
//https://www.securecoding.cert.org/confluence/display/c/INT30-C.+Ensure+that+unsigned+integer+operations+do+not+wrap
|
|
|
|
template<typename T> inline typename std::enable_if<std::is_unsigned<T>::value, bool>::type checked_add(T a, T b, T& result)
|
|
|
|
{
|
|
|
|
if (std::numeric_limits<T>::max() - a < b) {
|
|
|
|
return true;/* Handle error */
|
|
|
|
}
|
|
|
|
|
|
|
|
result = a + b;
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-10-25 03:44:59 -05:00
|
|
|
//https://www.securecoding.cert.org/confluence/display/c/INT32-C.+Ensure+that+operations+on+signed+integers+do+not+result+in+overflow
|
|
|
|
template<typename T> inline typename std::enable_if<std::is_signed<T>::value, bool>::type checked_sub(T a, T b, T& result)
|
|
|
|
{
|
|
|
|
if ((b > 0 && a < std::numeric_limits<T>::min() + b) ||
|
|
|
|
(b < 0 && a > std::numeric_limits<T>::max() + b)) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
result = a - b;
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
|
|
|
//https://www.securecoding.cert.org/confluence/display/c/INT30-C.+Ensure+that+unsigned+integer+operations+do+not+wrap
|
|
|
|
template<typename T> inline typename std::enable_if<std::is_unsigned<T>::value, bool>::type checked_sub(T a, T b, T& result)
|
|
|
|
{
|
|
|
|
if (a < b) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
result = a - b;
|
|
|
|
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
|
2017-03-21 06:23:09 -05:00
|
|
|
#endif
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
|