[GiNaC-list] bug in ex::ex(const std::string&, const ex&)

Diego Conti diego.conti at unipi.it
Thu Apr 4 09:29:56 CEST 2024


Hi Richard,

thanks for your reply.

On 03/04/24 22:47, Richard B. Kreckel wrote:
> Hi Diego,
>
> Thank you for reporting a bug.
>
> What is your platform? Please share the output of ./config/config.guess.


x86_64-pc-linux-gnu


>
> On 4/3/24 10:23 AM, Diego Conti wrote:
>> Indeed, inserting a pragma command  inside parser/default_reader.cpp 
>> (see attached patch) fixes the problem. I do not know if this can be 
>> made portable across compilers; maybe it would be easier to modify 
>> the code by replacing reader_func with a class that handles the 
>> conversion in a type-safe way?
>
> Could you, please, explain to us how you arrived at this patch?


Well, with the unpatched GiNAC 1.8.7 code the stack trace is as follows:

0  0x00007ffff7c7e192 in GiNaC::function::eval() const () from 
build/ginac/libginac.so.11
#1  0x00007ffff7c324cf in GiNaC::ex::construct_from_basic(GiNaC::basic 
const&) () from build/ginac/libginac.so.11
#2  0x000055555555fdf0 in GiNaC::ex::ex(GiNaC::basic const&) ()
#3  0x00007ffff7dbd383 in GiNaC::dispatch_reader_fcn(GiNaC::ex 
(*)(std::vector<GiNaC::ex, std::allocator<GiNaC::ex> > const&), 
std::vector<GiNaC::ex, std::allocator<GiNaC::ex> > const&) () from 
build/ginac/libginac.so.11
#4  0x00007ffff7dbda9e in GiNaC::parser::parse_identifier_expr() () from 
build/ginac/libginac.so.11
#5  0x00007ffff7dbe461 in GiNaC::parser::parse_primary() () from 
build/ginac/libginac.so.11
#6  0x00007ffff7dbe87f in GiNaC::parser::parse_expression() () from 
build/ginac/libginac.so.11
#7  0x00007ffff7dbed8b in 
GiNaC::parser::operator()(std::basic_istream<char, 
std::char_traits<char> >&) () from build/ginac/libginac.so.11
#8  0x00007ffff7dbf0fa in 
GiNaC::parser::operator()(std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > const&) () from 
build/ginac/libginac.so.11
#9  0x00007ffff7dbc2c0 in 
GiNaC::ex::construct_from_string_and_lst(std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > const&, GiNaC::ex const&) ()
    from build/ginac/libginac.so.11
#10 0x000055555555fe46 in GiNaC::ex::ex(std::__cxx11::basic_string<char, 
std::char_traits<char>, std::allocator<char> > const&, GiNaC::ex const&) ()
#11 0x000055555555ed92 in main ()

The function dispatch_reader_fcn is precisely where the 
pointer-to-integer conversion is made.

I can confirm that function alignment is the problem by logging the 
address of sqrt_reader inside

the function get_default_reader (attached patch to default_reader.cpp).

This prints out 140737351734977 before crashing (without the pragma). 
However, the code assumes that the address is even.

With the pragma, the code prints out

140737351734992

sqrt(3)

and then exits normally.

Best,

Diego

>
> All my best,
>   -richy.
-------------- next part --------------
A non-text attachment was scrubbed...
Name: logpatch.diff
Type: text/x-patch
Size: 73 bytes
Desc: not available
URL: <http://www.ginac.de/pipermail/ginac-list/attachments/20240404/c02f8957/attachment.bin>


More information about the GiNaC-list mailing list