On HP-UX we clashed with the problem that application falls in coredump if
exception is thrown by the function that returns float (or double) and this
function is placed in shared library.
What is interesting - the same function that returns int (or long, etc) works
correctly.
The example below illustrates it (these sources are also attached).
We are not sure if it's gcc bug and if this bug was already committed but we
can not find it anywhere.
So any help is appreciated.

Sample code:

// ---------------------------------
// File ncelib.hpp
// ---------------------------------
#include <stdexcept>

int lib_func_rInt();
float lib_func_rFloat();


// ---------------------------------
// File ncelib.cpp
// ---------------------------------
#include "ncelib.hpp"

int lib_func_rInt()
{
        throw std::exception();
        return 0;
}

float lib_func_rFloat()
{
        throw std::exception();
        return 0.0;
}

// ---------------------------------
// File nceexe.cpp
// ---------------------------------
#include "ncelib.hpp"
#include <stdlib.h>

int main()
{

        printf("main() {\n");

        try 
        {
                lib_func_rInt();
        }
        catch (std::exception &) 
        {
        }

        printf("...\n");

        try 
        {
                lib_func_rFloat();
        }
        catch (std::exception &) 
        {
        }

        printf("}\n");
        return 0;
}

// ---------------------------------
// File compile.sh
// ---------------------------------
set -ex

g++ -Wall -save-temps -fPIC -shared -g -D_GLIBCXX_DEBUG -o libncelib.sl
ncelib.cpp
g++ -Wall -save-temps -fPIC -g -D_GLIBCXX_DEBUG -o nceexe nceexe.cpp -L.
-lncelib

//---- Output sample ----------
bash-3.2$ gcc -v
Using built-in specs.
Target: hppa2.0w-hp-hpux11.11
Configured with: ../gcc/configure  : (reconfigured) ../gcc/configure  :
(reconfigured) ../gcc/configure
Thread model: posix
gcc version 4.1.2

bash-3.2$ ./compile.sh
++ g++ -Wall -save-temps -fPIC -shared -g -D_GLIBCXX_DEBUG -o libncelib.sl
ncelib.cpp
++ g++ -Wall -save-temps -fPIC -g -D_GLIBCXX_DEBUG -o nceexe nceexe.cpp -L.
-lncelib

bash-3.2$ ./nceexe
main() {
...
terminate called after throwing an instance of 'std::exception'
  what():  St9exception
ABORT instruction (core dumped)


-- 
           Summary: Exception from shared library's functions or methods
                    that return float (double, long double) value cannot be
                    caught on HP-UX.
           Product: gcc
           Version: 4.1.2
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: c++
        AssignedTo: unassigned at gcc dot gnu dot org
        ReportedBy: v dot grikyan at sam-solutions dot net
GCC target triplet: hppa2.0w-hp-hpux11.11


http://gcc.gnu.org/bugzilla/show_bug.cgi?id=37029

Reply via email to