Ada抑制无法访问的代码或丢失返回

问题描述 投票:5回答:2

我有一个标记类型,实现了许多功能。在一种情况下,我需要其中一个函数来代替进入无限循环。不幸的是,据我所知,我没有办法编译它,因此它不会发出警告。我仍然希望使用-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),但仍然提出了无法访问代码或缺少return语句错误的警告。

有没有任何方法可以永久运行一次性功能而不会发出警告?

ada gnat unreachable-code
2个回答
5
投票

pragma Suppress (All_Checks)对运行时检查采取行动。在那里帮助你。除非你专注于性能,否则不要管它,但是你有-p选项来使用命令行开关

编译指示Suppress禁止编译器生成的运行时检查。如果禁用运行时检查,则可能会抑制异常并导致未定义的行为。 pragma 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

取消注释它们会删除警告。


6
投票

以Jean-François提供的相同示例为例,您可以通过声明和调用“私有”过程(您不必在规范中声明它)包装循环来避免警告,如下所示:

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;
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.