【问题标题】:MISRA-C++:2008[8-4-3] : return in all exit path in functionMISRA-C++:2008[8-4-3] : 在函数的所有退出路径中返回
【发布时间】:2013-12-23 20:57:19
【问题描述】:

在测试我的代码(静态分析)以查看我是否尊重 misra c++ 2008 时,我收到以下错误

函数不会在所有路径上都返回值。

函数看起来像

int* Dosomething(string v)
{
   int* retvalue = NULL;

   if( 0 == exists(v) )
   {
      throw("error: value doesn't exist");
   }
   else
   {
     retvalue = dosomecomputations(v);
   }

   return retvalue;
}

我真的需要抛出一个异常,因为调用者会根据错误做一些事情。可能的错误列表可能很大,而且不仅仅是此代码示例中的值不存在。

我该如何管理它?我认为在这种情况下,我使用的工具不应将其视为不遵守 misra。

感谢您的建议。

罗尼。

【问题讨论】:

  • 您使用的是哪个 MISRA 检查器(QAC?PClint?...)?在我看来,您发布的 sn-p 并不违反规则 8-4-3
  • 看起来像工具的一个错误
  • @constantin,我正在使用 ldra
  • 尝试在投掷后添加虚假回报。也尝试删除else
  • 出于好奇,如果您使用的是现代静态分析器,那么您为什么要使用模糊的“尤达条件”编写代码? 0 == exists(v) 而不是 exists(v) == 0?这种编写代码的方式是在《星球大战》电影上映时由车库黑客发明的。它在 1990 年左右变得过时了,当时即使是最糟糕的编译器也设法警告不要在条件内进行赋值。对于现代静态分析仪来说,发现这样的错误将是在公园里散步。这是 30 年的代码吗?

标签: c++ return throw misra


【解决方案1】:

以下代码不应报告应用 MISRA C++ 2008 规则的任何警告/错误。所以很可能是您的工具有问题 - 或者发布的代码不是受影响的部分。

#include <string>

int exists(std::string v){ (void)v; return 1; }
int* dosomecomputations(std::string v){ (void)v; return NULL; }

int* dosomething(std::string v){
  int* retvalue = NULL;
  if( 0 == exists(v) ){
    throw("error: value doesn't exist");
  }else{
    retvalue = dosomecomputations(v);
  }
  return retvalue;
}

尝试使用您的 MISRA 检查器仅检查上面的 sn-p,看看它是否仍在报告任何内容。如果问题仍然存在,我会联系工具供应商并询问他有关该问题的问题。

【讨论】:

  • 我已经检查了上面的sn-p,我仍然得到同样的错误。我的结论是它是工具中的一个错误。谢谢康斯坦丁。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多