1

我在 PC-Lint (au-misra-cpp.lnt) 中收到此错误:

错误 1960:(注意——违反 MISRA C++ 2008 要求的规则 5-2-12,传递给函数的数组类型需要一个指针)

在此代码上:

_IDs["key"] = "value";

_IDs 声明为:

std::map<std::string,std::string> _IDs;

还尝试更改为:

_IDs.insert("key","value");

但得到同样的错误。

如何让代码符合 misra?

4

2 回答 2

6

违反的规则是调用std::string::string(const CharT* s, const Allocator& alloc = Allocator()),它将衰减char const []为 char 指针。

我认为解决方案是明确地转换为指针类型:

_IDs[static_cast<char const *>("key")] = static_cast<char const *>("value");

但是,我建议不要使用(或至少升级)当您实际使用std::string.

另请注意,您不能调用std::map::insert您尝试执行此操作的方式。没有直接采用键和值的重载,而是采用由键和值组成的对的重载。请参见此处的重载编号 1。

于 2013-05-31T08:38:53.770 回答
3
// a template function that takes an array of char 
//  and returns a std::string constructed from it
//
// This function safely 'converts' the array to a pointer
//  to it's first element, just like the compiler would
//  normally do, but this should avoid diagnostic messages
//  from very restrictive lint settings that don't approve
//  of passing arrays to functions that expect pointers.
template <typename T, size_t N>
std::string str( T (&arr)[N])
{
    return std::string(&arr[0]);
}

使用上面的模板函数,你应该能够像这样通过 linter:

_IDs[str("key")] = str("value");

顺便说一句- 我很惊讶 lint 并没有抱怨这_IDs是一个保留名称 - 你应该避免在 C 或 C++ 中使用前导下划线,尤其是与大写字母一起使用时。

于 2013-05-31T09:12:27.180 回答