Подтвердить что ты не робот

Как намекнуть на GCC, что линия должна быть недоступна?

Обычно компиляторы предоставляют переключатель для предупреждения, когда код недоступен. Я также видел макросы для некоторых библиотек, которые предоставляют утверждения для недостижимого кода.

Есть подсказка, например, через прагму или встроенную версию, которую я могу передать GCC (или любые другие компиляторы, если на то пошло), которые будут предупреждать или ошибочно во время компиляции, если он определит, что ожидаемая строка быть недостижимым, может быть достигнуто?

Вот пример:

    if (!conf->devpath) {
        conf->devpath = arg;
        return 0;
    } // pass other opts into fuse
    else {
        return 1;
    }
    UNREACHABLE_LINE();

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

4b9b3361

Ответ 1

gcc 4.5 поддерживает __builtin_unreachable() компилятор, объединенный с -Wunreachable-code, может делать то, что вы хотите, но, вероятно, вызовет ложные предупреждения

Ответ 2

Если у вашего компилятора нет необходимого вам предупреждения, его можно дополнить статическим анализатором. Тип анализатора, о котором я говорю, будет иметь свой собственный язык аннотации и/или распознавать C assert, и использовать их для подсказок свойств, которые должны быть истинными в определенных точках выполнения. Если для недостижимых утверждений нет конкретной аннотации, возможно, вы можете использовать assert (false);.

Я лично не знаком с ними, но Klokwork и CodeSonar - два известных анализатора. Гоанна - третья.

Ответ 3

С перекрестным компилятором gcc 4.4.0 Windows для компиляции PowerPC с -O2 или -O3 для меня работает следующее:

#define unreachable asm("unreachable\n")

Сбой ассемблера с неизвестной операцией, если компилятор не оптимизирует его, потому что он пришел к выводу, что он недоступен.

Да, это, скорее всего, "очень непредсказуемо в разных вариантах оптимизации" и, вероятно, сломается, когда я, наконец, обновляю компилятор, но на данный момент это лучше, чем ничего.