Ада подавить недоступный код или пропущенный возврат - PullRequest
0 голосов
/ 18 февраля 2019

У меня есть теговый тип, который реализует ряд функций.В одном случае мне нужна одна из этих функций, чтобы вместо этого войти в бесконечный цикл.К сожалению, насколько я могу судить, я не могу скомпилировать это так, чтобы это не вызывало предупреждения.Я все еще хочу использовать -gnatwe, чтобы в моем коде не было предупреждений, но как я могу реализовать такую ​​функцию.

Вот как выглядит функция:

function Foo (This : Some_Type) return Some_Type'Class is
begin
    loop
        Do_Useful_Stuff_Indefinitely_With (This);
    end loop;

    -- return This; (if needed?)
end Foo;

Я пробовал pragma (No_Return), за исключением того, что это применимо только к процедурам (а функция Foo используется как правильная функция в других местах, поэтому должна иметь такую ​​же сигнатуру).

Я также пытался pragma Suppress (All_Checks), но это все ещевыдает предупреждение о недоступном коде или пропущенной ошибке в операторе возврата.

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

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Взяв тот же пример, что и Жан-Франсуа, вы можете избежать предупреждения, объявив и вызвав «приватную» процедуру (вам не нужно объявлять ее в спецификации), оборачивая ваш цикл, как показано ниже:

package body foo is

   procedure Infinite_Loop is
   begin
      loop
        null;
      end loop;
   end Infinite_Loop;

   function bar return integer is
   begin
      Infinite_Loop;

      return 12;
   end bar;
end foo;
0 голосов
/ 18 февраля 2019

pragma Suppress (All_Checks) действует на проверки во время выполнения .Не поможет тебе там.Оставьте это в покое, если только вы не сконцентрируетесь на производительности, но тогда у вас есть опция -p, чтобы сделать это с помощью переключателей командной строки

Прагма Suppress подавляет проверки во время выполнения, генерируемые компилятором.Если проверка во время выполнения отключена, исключение может быть подавлено, что может привести к неопределенному поведению.Подавление прагмы используется на риск программиста.

Вам нужен оператор return, но вы можете обернуть его вокруг 2 pragma warnings операторов (случай, когда вы пытались его выключить и снова включить? работает)

pragma warnings(off,"unreachable code");
return This;
pragma warnings(on,"unreachable code");

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

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

Автономная демонстрация.foo.adb выглядит так:

package body foo is
 function bar return integer is
 begin
    loop
        null;
    end loop;
    pragma warnings(off,"unreachable code");
    return 12;
    pragma warnings(on,"unreachable code");
 end bar;
end foo;

foo.ads выглядит следующим образом:

package foo is
 function bar return integer;
end foo;

Если я закомментирую строки pragma:

$ gcc -c -gnatwe foo.adb
foo.adb:8:05: warning: unreachable code

без комментариевони удаляют предупреждение.

...