【发布时间】:2013-08-09 10:49:57
【问题描述】:
我在 PC-Lint (au-misra-cpp.lnt) 中收到这些错误:
ConverterUtil.cpp(90): 错误 864:(信息——涉及变量“transformValue”的表达式 可能取决于评估顺序 [MISRA C++ Rule 5-2-10])
ConverterUtil.cpp(90): 错误 864:(信息——涉及变量“transformValue”的表达式 可能取决于评估顺序 [MISRA C++ Rule 5-2-10])
ConverterUtil.cpp(90): 错误 534:(警告 -- 忽略函数的返回值 'std::transform(std::_String_iterator>>, std::_String_iterator>>, std::_String_iterator>>, int (*)(int))'(与第 998 行比较,文件 C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\algorithm) [MISRA C++ 规则 0-1-7 和 8-4-6],[MISRA C++ 规则 0-3-2])
关于此代码:
/**Conversion from std::string to bool*/
bool ConverterUtil::ConvertStdStringToBool(const std::string value)
{
std::string transformValue = value;
bool retValue = false;
std::transform(transformValue.begin(), transformValue.end(), transformValue.begin(), &::tolower);
if(transformValue == std::string(static_cast<const char *>("true")))
{
retValue = true;
}
return retValue;
}
我猜它不喜欢我在转换中使用相同的 std::string 作为输入和输出,但使用另一个字符串作为输出会产生相同的错误。
是否可以使 std::transform MISRA 兼容?
【问题讨论】:
-
不相关,但是因为您将
value按值传递给您的函数,所以不需要tranformValue本地。您已经在value中有一个临时副本。您可以放弃参数上的const并在代码中使用value而不是tranformValue(尽管我会建议保持原样,但将参数设为const-ref)。 -
也许它希望你复制
begin()和end()迭代器,并将副本传递给std::transform。 -
如果您只想要不区分大小写的比较,请在此处查看大量答案stackoverflow.com/questions/11635/…
-
@WhozCraig:在这种特殊情况下,按值传递比通过 ref-to-const 传递更好。见here。否则,我同意你所说的一切。
-
@CassioNeri 是的,我同意。这对我来说是一个一致性的事情,当它经常由 const-ref 完成时,很难打破这个习惯。同意。