Ada抑制无法访问的代码或缺少返回

Lam*_*eta 5 ada unreachable-code gnat

我有一个实现许多功能的标记类型。在一种情况下,我需要这些功能之一来进入无限循环。不幸的是,据我所知,我没有办法对其进行编译,从而不会发出警告。我希望仍然使用-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;
Run Code Online (Sandbox Code Playgroud)

我试过了,pragma (No_Return)但那仅适用于过程(并且该Foo函数在其他地方用作适当的函数,因此必须具有相同的签名)。

我也尝试过,pragma Suppress (All_Checks)但是仍然对代码无法到达或缺少返回语句错误提出警告。

有什么办法可以使一次性功能永久运行而不会发出警告?

Fré*_*aca 6

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

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;
Run Code Online (Sandbox Code Playgroud)


Jea*_*bre 5

pragma Suppress (All_Checks)进行运行时检查。不会在那帮你。除非您专注于性能,否则不要理会它,但是您可以-p选择使用命令行开关来做到这一点。

编译指示抑制显示编译器生成的运行时检查。如果禁用了运行时检查,则可能会抑制异常,并可能导致未定义的行为。使用编译器抑制风险由程序员承担。

您需要该return语句,但可以将其包装在2条pragma warnings语句中(如果您尝试将其关闭然后再打开的话,是可行的)

pragma warnings(off,"unreachable code");
return This;
pragma warnings(on,"unreachable code");
Run Code Online (Sandbox Code Playgroud)

请注意,该文本是可选的,但可以过滤其他可能发生的警告(如果需要)。最好这样做是因为关闭所有警告通常是不好的做法。

请注意,您必须在语句后再次打开警告。

独立的演示。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;
Run Code Online (Sandbox Code Playgroud)

foo.ads 看起来像:

package foo is
 function bar return integer;
end foo;
Run Code Online (Sandbox Code Playgroud)

如果我注释掉这些pragma行:

$ gcc -c -gnatwe foo.adb
foo.adb:8:05: warning: unreachable code
Run Code Online (Sandbox Code Playgroud)

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