抑制非平常无用的警告"控制可能达到无效功能的结束"

时间:2017-06-12 15:19:32

标签: c++ warnings control-flow

这是一个比任何事情都更方便的问题,但我想知道是否有任何方法可以抑制警告:

  

控制可能会达到非空函数的末尾[-Wreturn-type]

对于我知道的特定情况,代码没有问题。我的代码库中有一些辅助函数用于抛出异常,对于这样的代码:

int foo(int i) {
    if (i > 10) {
        return i*10;
    }
    else {
        Exception::throwExcept(MyCustomException("Error: i not in the accepted range"));
    }
}

我知道无论如何,它会返回或抛出。因此,警告在我眼中是无用的,只是编译器无法确定控制流路径实际上会最终抛出。

我仍然希望看到这个警告弹出窗口,因为它实际上表示代码错误(即路径不返回或抛出)。

这可以通过便携方式实现吗?

编辑:忘记使用

添加编译器
  

Apple LLVM版本8.1.0(clang-802.0.41)

4 个答案:

答案 0 :(得分:10)

编译器无法确定struct Exception { [[noreturn]] static void throwExcept(SomeType const&); }; 不会返回。这里有两种解决方案。一个是告诉编译器,即

-Wmissing-noreturn

(包含在-Weverything中的clang' [[noreturn]],如果上述功能可以声明为int foo(int i) { if (!(i>10)) Exception::throwExcept(MyCustomException("Error: i not in the accepted range")); return i*10; } 但是不是{或}},则会发出警告或重新安排作为

private WebView webViewNews;
private ProgressDialog progressDialogWebViewNews;

  webViewNews = (WebView) findViewById(R.id.webViewNews);
  WebSettings webSettings = webViewNews.getSettings();
  webSettings.setJavaScriptEnabled(true);
  webViewNews.setWebViewClient(new WebViewClient() {
      @Override
      public void onPageStarted(WebView view, String url, Bitmap favicon) {
          super.onPageStarted(view, url, favicon);
          progressDialogWebViewNews = new ProgressDialog(MainActivity.this);
          progressDialogWebViewNews.setCancelable(false);
          progressDialogWebViewNews.setTitle("Demo...");
          progressDialogWebViewNews.setMessage("Demo");
          progressDialogWebViewNews.show();
      }

      @Override
      public void onPageFinished(WebView view, String url) {
          progressDialogWebViewNews.dismiss();
          super.onPageFinished(view, url);
      }
  });
  webViewNews.loadUrl("http://www.demo.com");

答案 1 :(得分:7)

标记Exception::throwExcept函数[[noreturn]]应该有助于编译器确定它实际上不会返回。

答案 2 :(得分:2)

一种快速而肮脏的方法来抑制错误是在return语句中使用逗号运算符。如果你使用

return Exception::throwExcept(MyCustomException("Error: i not in the accepted range")), 0;

编译器将看到一个return语句,但它永远不会执行为

Exception::throwExcept(MyCustomException("Error: i not in the accepted range"))

在它返回0之前会抛出。

答案 3 :(得分:1)

在我看来,你的编译器无法在Exception::throwExcept内看到它总是抛出异常。

帮助编译器使用原始C ++异常throw作为函数的最后一行:throw std::exception("Just to help the compiler know to not warn here");这不会影响代码,因为代码永远不会被执行。