NetBSD-Bugs archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

lib/52942: libunwind failure in atf c++ internal test



>Number:         52942
>Category:       lib
>Synopsis:       libunwind failure in atf c++ internal test
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    lib-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Tue Jan 23 10:45:00 +0000 2018
>Originator:     Martin Husemann
>Release:        NetBSD 8.99.12
>Organization:
The NetBSD Foundation, Inc.
>Environment:
System: NetBSD space-truckin.duskware.de 8.99.12 NetBSD 8.99.12 (SUNXI) #18: Mon Jan 22 12:01:55 CET 2018 martin%night-owl.duskware.de@localhost:/usr/src/sys/arch/evbarm/compile/SUNXI evbarm
Architecture: earmv7hfeb
Machine: evbarm
>Description:

On big endian arm the atf internal test case
/usr/tests/atf/atf-c++/detailtext_test::to_type fails.

This part of the test is equivalent to something like:

--8<--
#include <iostream>
#include <sstream>
#include <string>

template <class T>
T test(std::string &str)
{
	T value;
	std::istringstream ss(str);

	ss >> value;

	std::cout << "value: " << value << "\n";
	if (ss.eof())
		std::cout << "eof()\n";
	if (ss.fail())
		std::cout << "fail()\n";
	if (ss.bad())
		std::cout << "bad()\n";
	if (!ss.eof() || (ss.eof() && (ss.fail() || ss.bad())))
		throw std::runtime_error("Cannot convert string to requested type");

	return value;
}

int main(void)
{
	int v;
	std::string str("   ");

	try {
		v = test<int>(str);
		return 10+v;
	} catch (const std::runtime_error &) {
		return 1;
	} catch (const std::exception& atfu_e) {
		return 2;
	} catch (...) {
		return 3;
	}
	return 4;
}
-->8--

It takes a string of a few blanks, tries to convert it to int with the atf
internal to_type<T> macro and checks that std::runtime_error exception
is raised.

This all works fine, but when throwing the exception libunwind fails to 
identify the proper handler and instead we end up aborting the program.

A step in between is:

(gdb) p *this
$11 = {fInfo = {data_base = 0, start_ip = 0, end_ip = 0, lsda = 0, 
    handler = 0, extra_args = 0, unwind_info = 0}, fRegisters = {reg = {
      2147358504, 2, 3336, 2035255504, 2031280304, 2147358832, 2147358504, 
      1126902528, 2031280280, 2147358864, 2147359688, 2147359604, 2147359608, 
      2147358496, 2033402552, 2033402552, 1611530768}, flags = 0, fpreg = {
      4096, 3737629, 4096, 141991618805760, 3737629, 4294967296, 0, 
      18446744073709551615, 1516702867, 2059950152923217920, 1516167243, 
      166604820, 0, 272617096740, 8737718594714180144, 9222838037128289060, 
      9222837624811427840, 8735362066417344140, 0, 9222838066931178400, 
      240552312831, 9222838034980929599, 8097581722283038920, 47455248, 
      8746342322110809088, 9222835889533701120, 8746359914296857600, 
      1885396800, 8098065455859687188, 8097717407004491776, 0, 
      8746364312343356160}}, fAddressSpace = @0x7942ea6c, 
  fUnwindInfoMissing = false, fIsSignalFrame = false}
#0  _Unwind::UnwindCursor<_Unwind::LocalAddressSpace, _Unwind::Registers_arm32>::setInfoBasedOnIPRegister (this=this@entry=0x7ffe1870, 
    isReturnAddress=isReturnAddress@entry=false)
    at /usr/src/sys/lib/libunwind/UnwindCursor.hpp:118
#1  0x7933434c in unwind_phase1 (exc=0x7912e098, cursor=...)
    at /usr/src/sys/lib/libunwind/libunwind.cxx:31
#2  _Unwind_RaiseException (exc=exc@entry=0x7912e098)
    at /usr/src/sys/lib/libunwind/libunwind.cxx:201
#3  0x794f89a8 in __cxxabiv1::__cxa_throw (obj=0x7912e0b0, tinfo=0x432b2b00, 
    dest=<optimized out>)
    at /usr/src/external/gpl3/gcc.old/dist/libstdc++-v3/libsupc++/eh_throw.cc:82
#4  0x02d574c0 in atf::text::to_type<int> (str=...)
    at /usr/src/external/bsd/atf/dist/atf-c++/detail/text.hpp:154
#5  0x02d50390 in (anonymous namespace)::atfu_tc_to_type::body (
    this=<optimized out>)
    at /usr/src/external/bsd/atf/dist/atf-c++/detail/text_test.cpp:361
#6  0x795e43a8 in atf::tests::tc_impl::wrap_body (tc=<optimized out>)
    at /usr/src/external/bsd/atf/dist/atf-c++/tests.cpp:157
#7  0x795a8488 in atf_tc_run (tc=0x791121f4, resfile=<optimized out>)
    at /usr/src/external/bsd/atf/dist/atf-c/tc.c:1024
#8  0x795d884c in atf::tests::tc::run (this=this@entry=0x791220e8, resfile=...)
    at /usr/src/external/bsd/atf/dist/atf-c++/tests.cpp:280

The tinfo value passed in #3 is correct on entry to __cxxabiv1::__cxa_throw,
however we end up like this:

#3  0x794f8a50 in __cxxabiv1::__terminate (handler=<optimized out>)
    at /usr/src/external/gpl3/gcc.old/dist/libstdc++-v3/libsupc++/eh_terminate.cc:47
#4  0x794f8aec in std::terminate ()
    at /usr/src/external/gpl3/gcc.old/dist/libstdc++-v3/libsupc++/eh_terminate.cc:57
#5  0x794f89b4 in __cxxabiv1::__cxa_throw (obj=0x7912e0b0, tinfo=0x432b2b00, 
    dest=<optimized out>)
    at /usr/src/external/gpl3/gcc.old/dist/libstdc++-v3/libsupc++/eh_throw.cc:87
#6  0x02d574c0 in atf::text::to_type<int> (str=...)
    at /usr/src/external/bsd/atf/dist/atf-c++/detail/text.hpp:154


The simple test program above does not exhibit this issue, and all works
fine on little endian arm.


>How-To-Repeat:

cd /usr/tests/atf/atf-c++/detail
./text_test to_type

>Fix:
n/a



Home | Main Index | Thread Index | Old Index