Ada抑制不可达代码或缺少返回

7

我有一个标记类型,实现了许多函数。在某些情况下,我需要其中一个函数进入无限循环。不幸的是,据我所知,没有办法编译它而不会引发警告。我希望仍然使用-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个回答

6

pragma Suppress (All_Checks)会影响运行时检查。它对此无帮助。除非你专注于性能,否则请不要更改它,但是你可以使用命令行开关-p来进行操作。

pragma 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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接