【问题标题】:Ada suppress unreachable code or missing returnAda 抑制无法访问的代码或缺少返回
【发布时间】:2019-07-12 06:55:56
【问题描述】:

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

有没有什么方法可以让一次性功能永远运行而不会发出警告?

【问题讨论】:

    标签: ada gnat unreachable-code


    【解决方案1】:

    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
    

    取消注释会删除警告。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2018-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-24
        • 2022-06-21
        • 2020-08-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多