Получение ошибки сегментации при инициализации массива структур - PullRequest
0 голосов
/ 17 апреля 2020

Я работаю над рефакторингом старого кода в C. У меня есть эта структура:

struct example_opt_t
{                      
    const char *name;  
    const char *value;
};

, и я хочу инициализировать свои параметры (имя, значение), чтобы я мог передать его в функцию init.

Это объявление init():

struct lh_ctx_t *init( const struct example_clb_t *callbacks, void *user_data, const struct example_opt_t *options ) {

И это моя попытка инициализировать options:

const struct example_opt_t my_options[2] = {
    (struct example_opt_t){
        "option1_name",
        "option1_value",
    },
    (struct example_opt_t){"option2_name",
                      "option2_value"},
};

Но я получаю ошибку segfault , Что я здесь не так делаю?

[ОБНОВЛЕНИЕ]:

init в какой-то момент вызывает следующую функцию:

if ( example_strcasecmp( option->name, name ) ) return false;

, тело которой:

int example_strcasecmp( const char *s1, const char *s2 ) {

 int diff;

 if ( s1 == NULL  ||  s2 == NULL ) return 0;
 /* I'm getting a segfault at the line below*/
 do { diff = example_lowercase(s1++) - example_lowercase(s2++); } 
 while ( diff == 0  &&  s1[-1] != '\0' );

 return diff;
} 

И example_lowercase - это:

int example_lowercase( const char *s ) {

 return tolower( *(const unsigned char *)s );
} 

Странно то, что я все еще получаю segfault, но теперь я не могу увидеть точную строку, которая генерируется, так как gdb вывод ниже:

Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x000055aace859039 in ?? ()
(gdb) bt
#0  0x000055aace859039 in ?? ()
#1  0x000055aacf4b6268 in ?? ()
#2  0x000055aace85671a in ?? ()
#3  0x00007ffe39cd0e34 in ?? ()
#4  0x000055aacf4b6268 in ?? ()
#5  0x00007ffe39cd0f40 in ?? ()
#6  0x00007ffe39cd0f20 in ?? ()
#7  0x00007ffe39cd0e34 in ?? ()
#8  0x000055aace857f6f in ?? ()
#9  0x000055aacf4b6268 in ?? ()
#10 0x5d4ca731752bb200 in ?? ()
#11 0x00007ffe39cd0f20 in ?? ()
#12 0x000055aacf4b6268 in ?? ()
#13 0x0000000000000000 in ?? ()

1 Ответ

1 голос
/ 22 апреля 2020

Когда strlen (s1)> strlen (s2) вы бежите за конец s2 в не отображенную память.

Измените это -

while ( diff == 0  &&  s1[-1] != '\0' );

На это -

while ( diff == 0  && s1[-1] != '\0' && s2[-1] != '\0' );

И подтвердите, решает ли это вашу проблему.

...