Странная фраза?!?!?!

Тема в разделе "Флудилка", создана пользователем Igor68, 15 сен 2021.

  1. Igor68

    Igor68 Гуру

    Код (C++):
    if (((opcode & 0x00600000) == 0x00100000) && (x == 0)) {
    ....
    }
    Вообще странно сравнивать результат который никогда не будет равным сравниваему
    значению.

    А ведь эти люди код OPENOCD делали...
    Вот решил собрать с добавлением J-Link... а компилятор дюже умный
    сказал, что так не будет компилировать.
    Стервец... видишь, что код мёртвый в смысле половины условий... компилируй и хрен с ним.
    Как мне заставить его игнорировать бесполезный код.
    Ну вот смотрите... будут ли эти условия выполнены?
    Код (C++):
    /* SMLAW < y> */
            if (((opcode & 0x00600000) == 0x00100000) && (x == 0)) {
                uint8_t Rd, Rm, Rs, Rn;
                instruction->type = ARM_SMLAWy;
                Rd = (opcode & 0xf0000) >> 16;
                Rm = (opcode & 0xf);
                Rs = (opcode & 0xf00) >> 8;
                Rn = (opcode & 0xf000) >> 12;

                snprintf(instruction->text,
                        128,
                        "0x%8.8" PRIx32 "\t0x%8.8" PRIx32 "\tSMLAW%s%s r%i, r%i, r%i, r%i",
                        address,
                        opcode,
                        (y) ? "T" : "B",
                        COND(opcode),
                        Rd,
                        Rm,
                        Rs,
                        Rn);
            }

            /* SMUL < x><y> */
            if ((opcode & 0x00600000) == 0x00300000) {
                uint8_t Rd, Rm, Rs;
                instruction->type = ARM_SMULxy;
                Rd = (opcode & 0xf0000) >> 16;
                Rm = (opcode & 0xf);
                Rs = (opcode & 0xf00) >> 8;

                snprintf(instruction->text,
                        128,
                        "0x%8.8" PRIx32 "\t0x%8.8" PRIx32 "\tSMULW%s%s%s r%i, r%i, r%i",
                        address,
                        opcode,
                        (x) ? "T" : "B",
                        (y) ? "T" : "B",
                        COND(opcode),
                        Rd,
                        Rm,
                        Rs);
            }

            /* SMULW < y> */
            if (((opcode & 0x00600000) == 0x00100000) && (x == 1)) {
                uint8_t Rd, Rm, Rs;
                instruction->type = ARM_SMULWy;
                Rd = (opcode & 0xf0000) >> 16;
                Rm = (opcode & 0xf);
                Rs = (opcode & 0xf00) >> 8;

                snprintf(instruction->text,
                        128,
                        "0x%8.8" PRIx32 "\t0x%8.8" PRIx32 "\tSMULW%s%s r%i, r%i, r%i",
                        address,
                        opcode,
                        (y) ? "T" : "B",
                        COND(opcode),
                        Rd,
                        Rm,
                        Rs);
            }
    Ну хоть когда-нибудь.
     
  2. ZAZ-965

    ZAZ-965 Гуру

    @Igor68, в версии OpenOCD 0.11.0 исправлено на
    Код (C++):
    /* SMLAW < y> */
            if (((opcode & 0x00600000) == 0x00200000) && (x == 0)) {
     
    с примечанием "исправления предупреждений, выдаваемых GCC8". Нормальные исправления предупреждений, программист ошибся с побитовыми операциями, и пока компилятор не прокричал, никто и не чесался.
     
    Igor68 нравится это.
  3. Un_ka

    Un_ka Гуру

    Какой вывод? Прям ошибка? У меня
    Код (C++):
    if(0)
    Вроде компилировалась.
     
  4. Igor68

    Igor68 Гуру

    Я вас понял! Но это для дизассемблера всё... и для работы ни к чему.... ну в принципе конечно. А вот в пакет всё это включили. Ради JLink и стал его собирать. Почему-то в штатный его не включили. Собирал для малины на самой малине - поле битвы RAM диск 4 Gb.
     
  5. Igor68

    Igor68 Гуру

    Вот и говорю, что всё что в теле if может и окомпилируется (если компилятор не анализирует бесполезность), но выполняться никогда не будет. а если:
    Код (C++):
     if (((opcode & 0x00600000) == 0x00200000) && (x == 0))
    заменить на это:
    Код (C++):
     if ((opcode & 0x00200000) && (x == 0))
    то шанс на выполнение есть

    хотя я тоже сморозил - в маске "6"двойка есть и должно быть всё в норме.
    Но там есть условия и с единицей.
     
    Последнее редактирование: 16 сен 2021
  6. Igor68

    Igor68 Гуру

    ПРЕМНОГО БЛАГОДАРЕН!!!!!!!!!!!
    Скачал исходник openocd 0.11.0 прямо на малину, откомпилировал, установил... он встал вместо 0.10.0, который с jlink не очень дружил (испытывал на плате Aduc7024), а теперь всё без проблем.
    Курю теперь ещё и openocd....
    Спасибо огромное @ZAZ-965 !!!!!!!!!!