Hi all,
I think there is a bug when using the native protocol to link two instances of
FlightGear via network or when recording and playing back flights using
fgfs --native=file,out,20,fgfs.out
and
fgfs --native,file,in,20,fgfs.out --fdm=external
The "external" FlightGear crashes and after some investigation I think the
problem is a missing operator =() method in FDM/flight.hxx
The problem is:
In Network/native.cxx a buffer is read either from network of from a file
containing the previously written fdm state. The content of the buffer is
than assigned to the current fdm state by doing
*cur_fdm_state = buf;
both variables are of type FGInterface which currently lacks a operator =()
method, so the compiler uses a simple memcpy to copy one object to the other.
This is almost ok but for the ground_cache object. This is a complex object
containing a std::vector<FGGroundCache::Triangle>. This vector seems to store
memory pointers to the Triangle-vertices. This is a very bad thing because
these pointers are invalid for any other FlightGear session and dereferencing
them causes a segmentation fault.
A very ugly - if not disgusting - workaround is adding the following to the
public methods of FGInterface in FDM/flight.hxx:
virtual const FGInterface & operator = ( FGInterface & src ) {
char * start = (char*)&inited;
char * end = (char*)&ground_cache;
memcpy( &inited, &src.inited, end-start );
prepare_ground_cache_m( 0, geodetic_position_v, 100.0 );
}
This gets called instead of a memcpy when assinging one FGInterface to another
and it does the memcpy for all member variables but the ground_cache. The
ground_cache itself is initialized for the recovered position with a fix
reference time of 0 and a radius of 100m.
At least this change fixes the segfault when replaying with the native
protocol, but I don't think this is the kind of code we want to see in
FlightGear for two reasons:
a) The pointer arithmetic assuming simple datatypes between the inited and
ground_cache variable
b) A constant used for reference time and the radius.
While a) may be circumnavigated by using explicit assignments for all
variables, I have no good idea for b). The radius might be saved when doing
the output, but I do not understand the idea of the reference time...
And there is one thing that is going round in my head: Curt reported, that he
does not have this problem at all and no one else (except tpalinkas) reported
this crash. Maybe this a a compiler/library problem?
Thanks for reading all that - any comment or help is appreciated.
Torsten
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Flightgear-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/flightgear-devel