Ошибка сегментации при доступе к члену структуры в функции библиотеки - PullRequest
1 голос
/ 28 января 2020

Следующая проблема: В моей основной программе я объявляю struct variable и затем передаю адрес ей в библиотечную функцию (shared-object, скомпилированный мной). Функция библиотеки должна инициализировать структуру, но она падает с ошибкой сегментации. Cra sh происходит, когда элемент (тип int) структуры установлен в 0. Проблема не возникает, если я устанавливаю тот же элемент в основной программе.

Основная программа: C ++ (скомпилировано с g ++)

rnxctr_t tRNX;
tRNX.ephsat = 0;  // <-- works
init_rnxctr(&tRNX);

Функция библиотеки: C (скомпилировано с g cc)

extern int init_rnxctr(rnxctr_t *rnx)
{
    gtime_t time0={0};
    obsd_t data0={{0}};
    eph_t  eph0={0,-1,-1};
    geph_t geph0={0,-1};
    seph_t seph0={0};
    int i,j;

    trace(3,"init_rnxctr:\n");

    rnx->obs.data=NULL;
    rnx->nav.eph =NULL;
    rnx->nav.geph=NULL;
    rnx->nav.seph=NULL;

    if (!(rnx->obs.data=(obsd_t *)malloc(sizeof(obsd_t)*MAXOBS ))||
        !(rnx->nav.eph =(eph_t  *)malloc(sizeof(eph_t )*MAXSAT ))||
        !(rnx->nav.geph=(geph_t *)malloc(sizeof(geph_t)*NSATGLO))||
        !(rnx->nav.seph=(seph_t *)malloc(sizeof(seph_t)*NSATSBS))) {
        free_rnxctr(rnx);
        return 0;
    }
    rnx->time=time0;
    rnx->ver=0.0;
    rnx->sys=rnx->tsys=0;
    for (i=0;i<6;i++) for (j=0;j<MAXOBSTYPE;j++) rnx->tobs[i][j][0]='\0';
    rnx->obs.n=0;
    rnx->nav.n=MAXSAT;
    rnx->nav.ng=NSATGLO;
    rnx->nav.ns=NSATSBS;
    for (i=0;i<MAXOBS ;i++) rnx->obs.data[i]=data0;
    for (i=0;i<MAXSAT ;i++) rnx->nav.eph [i]=eph0;
    for (i=0;i<NSATGLO;i++) rnx->nav.geph[i]=geph0;
    for (i=0;i<NSATSBS;i++) rnx->nav.seph[i]=seph0;
    rnx->ephsat=0;    // <-- segmentation fault
    rnx->opt[0]='\0';

    return 1;
}

Определение структуры:

typedef struct {        /* rinex control struct type */
    gtime_t time;       /* message time */
    double ver;         /* rinex version */
    char   type;        /* rinex file type ('O','N',...) */
    int    sys;         /* navigation system */
    int    tsys;        /* time system */
    char   tobs[7][MAXOBSTYPE][4]; /* rinex obs types */
    obs_t  obs;         /* observation data */
    nav_t  nav;         /* navigation data */
    sta_t  sta;         /* station info */
    int    ephsat;      /* ephemeris satellite number */
    char   opt[256];    /* rinex dependent options */
} rnxctr_t;

Обновление : ссылка на полный заголовочный файл: rtklib.h

Некоторые наблюдения

Проблема возникает только в том случае, если я включаю (определяю) некоторые дополнительные функции (DENAGAL, ​​DENACMP) библиотеки. Но различия с «нормальной» версией вообще не объясняют проблему. Единственное, что изменяется в размещенном коде, это определение MAXSAT.

Обновление : я только что понял, что изменение MAXSAT действительно меняет размер структур внутри rnxctr_t (например, nav_t)

С помощью GDB я вижу, что адреса некоторых членов различаются в основной программе и в функции. Main:

  • & tRNX: 0x7ffffffc6e10
  • & tRNX.nav: 0x7ffffffc7548
  • & tRNX.ephsat: 0x7fffffffd290
1041 *1040*

1043 *

rnx: 0x7ffffffc6e10 & rnx-> nav: 0x7ffffffc7548 & rnx-> ephsat: 0x800000026ef8

Эта последняя точка действительно смущает меня, потому что Я не понимаю, как это может произойти.

С наилучшими пожеланиями Майкл

1 Ответ

0 голосов
/ 29 января 2020

Я только что нашел проблему. Я только что понял, что использовал две разные версии rtklib.h. Это привело к разным размерам структуры rnxctr_t.

Так что в итоге это была просто моя глупость, но все равно спасибо за ваши полезные комментарии.

...