https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94981

--- Comment #5 from Tony Reix <tony.reix at atos dot net> ---
I'm not invoking myself directly this conversion. It is made by C++.

The original issue appeared when running tests of Boost v1.73 math library,
dealing with include code of C++ , line 324 of file:
include/c++/bits/stl_algobase.h (GCC v8), with  _OI  being: char* .

Thus, this was deeply hidden in C++ internal code while doing some
initialization of a vector, with:
  boost::array<double, 4> const d3a = { { 10, -6, -4, 3 } };
  polynomial<T> const a(d3a.begin(), d3a.end());
where a is built wrong silently: (10, 0, 0, 3).

The Boost line generating the issue seems to be:
std::vector<T> m_data;

That seems to mean that anyone using standard C++ code , with his own kind of
array, could face this issue silently and break some data.

include/c++/bits/stl_algobase.h :

         std::__copy_move<false, false,
std::random_access_iterator_tag>::__copy_m<double const*, char*>
         (  __first=0x10002e80 <_GLOBAL__F__ZSt4bug3i+1168>,
            __last =0x10002ea0 <_GLOBAL__F__ZSt4bug3i+1200>,
           __result=0x20001ce8 "")

 +314    template<>
 +315      struct __copy_move<false, false, random_access_iterator_tag>
 +316      {
 +317        template<typename _II, typename _OI>
 +318          static _OI
 +319          __copy_m(_II __first, _II __last, _OI __result)
 +320          {
 +321            typedef typename iterator_traits<_II>::difference_type
_Distance;
 +322            for(_Distance __n = __last - __first; __n > 0; --__n)
 +323              {
 +324                *__result = *__first;
 +325                ++__first;
 +326                ++__result;
 +327              }
 +328            return __result;
 +329          }
 +330      };

generating the assembler code:

  0x10001978 <+56>:    lwz     r9,88(r31)
  0x1000197c <+60>:    lfd     f0,0(r9)
  0x10001980 <+64>:    fctiwuz f0,f0
  0x10001984 <+68>:    addi    r9,r31,40
  0x10001988 <+72>:    stfiwx  f0,0,r9

where fctiwuz replaces f0 by 0 when contents of f0 is negative.



Complete stack is below. Showing that Boost test code is testing with "char"
type.

Does it means that:
 - C++ should check that _OI cannot be "char*" because such conversion is
undefined ?
 - or that Boost should not use the char type in that code ?


Thread 2 hit Breakpoint 1, std::__copy_move<false, false,
std::random_access_iterator_tag>::__copy_m<double const*, char*> (
    __first=0x1003f8928 <_GLOBAL__F__ZSt4bug3i+136760>, __last=0x1003f8940
<_GLOBAL__F__ZSt4bug3i+136784>, __result=0x110042931 "")
    at
/opt/freeware/lib/gcc/powerpc-ibm-aix7.2.0.0/8/include/c++/bits/stl_algobase.h:324
324                   *__result = *__first;
(gdb) where
#0  std::__copy_move<false, false,
std::random_access_iterator_tag>::__copy_m<double const*, char*>
(__first=0x1003f8928 <_GLOBAL__F__ZSt4bug3i+136760>,
    __last=0x1003f8940 <_GLOBAL__F__ZSt4bug3i+136784>, __result=0x110042931 "")
    at
/opt/freeware/lib/gcc/powerpc-ibm-aix7.2.0.0/8/include/c++/bits/stl_algobase.h:324
#1  0x0fffffffffffd410 in ?? ()
#2  0x0000000100195338 in std::__copy_move_a2<false, double const*, char*>
(__first=0x1003f8920 <_GLOBAL__F__ZSt4bug3i+136752>,
    __last=0x1003f8940 <_GLOBAL__F__ZSt4bug3i+136784>, __result=0x110042930
"\n")
    at
/opt/freeware/lib/gcc/powerpc-ibm-aix7.2.0.0/8/include/c++/bits/stl_algobase.h:422
#3  0x0000000100195278 in std::copy<double const*, char*> (__first=0x1003f8920
<_GLOBAL__F__ZSt4bug3i+136752>,
    __last=0x1003f8940 <_GLOBAL__F__ZSt4bug3i+136784>, __result=0x110042930
"\n")
    at
/opt/freeware/lib/gcc/powerpc-ibm-aix7.2.0.0/8/include/c++/bits/stl_algobase.h:455
#4  0x00000001001951a8 in std::__uninitialized_copy<true>::__uninit_copy<double
const*, char*> (__first=0x1003f8920 <_GLOBAL__F__ZSt4bug3i+136752>,
    __last=0x1003f8940 <_GLOBAL__F__ZSt4bug3i+136784>, __result=0x110042930
"\n")
    at
/opt/freeware/lib/gcc/powerpc-ibm-aix7.2.0.0/8/include/c++/bits/stl_uninitialized.h:101
#5  0x0000000100195114 in std::uninitialized_copy<double const*, char*>
(__first=0x1003f8920 <_GLOBAL__F__ZSt4bug3i+136752>,
    __last=0x1003f8940 <_GLOBAL__F__ZSt4bug3i+136784>, __result=0x110042930
"\n")
    at
/opt/freeware/lib/gcc/powerpc-ibm-aix7.2.0.0/8/include/c++/bits/stl_uninitialized.h:134
#6  0x000000010019506c in std::__uninitialized_copy_a<double const*, char*,
char> (__first=0x1003f8920 <_GLOBAL__F__ZSt4bug3i+136752>,
    __last=0x1003f8940 <_GLOBAL__F__ZSt4bug3i+136784>, __result=0x110042930
"\n")
    at
/opt/freeware/lib/gcc/powerpc-ibm-aix7.2.0.0/8/include/c++/bits/stl_uninitialized.h:289
#7  0x0000000100194db4 in std::vector<char, std::allocator<char>
>::_M_range_initialize<double const*> (this=0xfffffffffffda08,
    __first=0x1003f8920 <_GLOBAL__F__ZSt4bug3i+136752>, __last=0x1003f8940
<_GLOBAL__F__ZSt4bug3i+136784>)
    at
/opt/freeware/lib/gcc/powerpc-ibm-aix7.2.0.0/8/include/c++/bits/stl_vector.h:1474
#8  0x0000000100194c90 in std::vector<char, std::allocator<char>
>::_M_initialize_dispatch<double const*> (this=0xfffffffffffda08,
    __first=0x1003f8920 <_GLOBAL__F__ZSt4bug3i+136752>, __last=0x1003f8940
<_GLOBAL__F__ZSt4bug3i+136784>)
    at
/opt/freeware/lib/gcc/powerpc-ibm-aix7.2.0.0/8/include/c++/bits/stl_vector.h:1442
#9  0x0000000100194a74 in std::vector<char, std::allocator<char>
>::vector<double const*, void> (this=0xfffffffffffda08,
    __first=0x1003f8920 <_GLOBAL__F__ZSt4bug3i+136752>, __last=0x1003f8940
<_GLOBAL__F__ZSt4bug3i+136784>, __a=...)
    at
/opt/freeware/lib/gcc/powerpc-ibm-aix7.2.0.0/8/include/c++/bits/stl_vector.h:551
#10 0x0000000100194930 in
boost::math::tools::polynomial<char>::polynomial<double const*>
(this=0xfffffffffffda08,
    first=0x1003f8920 <_GLOBAL__F__ZSt4bug3i+136752>, last=0x1003f8940
<_GLOBAL__F__ZSt4bug3i+136784>) at ../boost/math/tools/polynomial.hpp:304
#11 0x00000001001d2f60 in test_multiplication<char>::test_method
(this=0xfffffffffffe3e0) at ../libs/math/test/test_polynomial.cpp:417
#12 0x00000001001d2a5c in test_multiplication_invoker::run<char> () at
../libs/math/test/test_polynomial.cpp:415
#13 0x00000001001d2640 in
boost::unit_test::ut_detail::test_case_template_invoker<test_multiplication_invoker,
char>::operator() (this=0x110045a90)
    at ../boost/test/tree/test_case_template.hpp:70
#14 0x00000001001d2540 in
boost::detail::function::void_function_obj_invoker0<boost::unit_test::ut_detail::test_case_template_invoker<test_multiplication_invoker,
char>, void>::invoke (function_obj_ptr=...) at
../boost/function/function_template.hpp:158

Reply via email to