Зачем это, если раздел скомпилирован в бесконечный цикл? - PullRequest
0 голосов
/ 27 октября 2018

Код C ниже:

s32 load_string(char* string_new, char const* string_orign)
{
    StrEntry *entry = search_str_entry(string_orign);
    u8        buff_b[32];
    u16       buff_u[32];
    s32       read_size = 0;
    void     *str_file = 0;

    if (entry != 0){
        cmemclr(buff_b, 32);
        cmemclr(buff_u, 64);
        sprintf(&buff_b[0], "c:/data/%03d.str", entry->fid);
        c2w(&buff_u[0], &buff_b[0], 32);
        if (TryOpenFile(&str_file, buff_u, OPEN_MODE_READ) == 0){
            cmemclr(string_new, 256);
            TryReadFile(&read_size, str_file, entry->offset, string_new, entry->size);

            CloseFile(str_file);
            return (s32)entry->size;
        }
    }
    return 0;
}

Разборка этой функции:

  003464ac <load_string>:
  3464ac:   e92d4010    push    {r4, lr}
  3464b0:   e1a00001    mov r0, r1
  3464b4:   ebffffda    bl  346424 <search_str_entry>
  3464b8:   e3500000    cmp r0, #0
  3464bc:   08bd8010    popeq   {r4, pc}
  3464c0:   eafffffe    b   3464c0 <load_string+0x14>

Мы можем видеть, что если раздел становится бесконечным циклом, почему?

Я использую опцию -Os optimize для компиляции этого кода. Версия gcc

gcc версия 8.1.0 (devkitARM выпуск 49).

Edit:

cmemclr - простая встроенная функция:

static inline void cmemclr(void *buf, u32 size)
{
    u8 *dst = (u8*)buf;

    while(--size >= 0){
        dst[size] = 0;
    }
}

1 Ответ

0 голосов
/ 27 октября 2018

cmemclr неисправен.Согласно редактированию вопроса, cmemclr - это:

static inline void cmemclr(void *buf, u32 size)
{
    u8 *dst = (u8*)buf;

    while(--size >= 0){
        dst[size] = 0;
    }
}

Поскольку size имеет тип u32, который, предположительно, без знака, --size >= 0 всегда имеет значение true.Код входит в бесконечный цикл.

Ответ до того, как вопрос был отредактирован

Одна из возможностей состоит в том, что показанный вами код сборки является неполным, и то, что в настоящее время отображается как b 3464c0, будет позже преобразовано в другойaddress.

Предполагая, что сборка верна и не является неполной меткой-заполнителем, ожидающей дальнейшего разрешения ссылки, компилятор оптимизировал код внутри оператора if до бесконечного цикла, так как внутри оператора есть неопределенное поведение(и, следовательно, бесконечный цикл является допустимым поведением) или потому, что что-то в операторе выполняет бесконечный цикл.

Поскольку вы не предоставили реализации или спецификации подпрограмм или макросов, используемых внутри оператора if,Дальнейшая диагностика недоступна.

...