如何在不违反MISRA C ++ 2008要求规则5-2-12的情况下在std :: map中插入项目?

时间:2013-05-31 08:28:06

标签: c++ misra

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

  

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

关于此代码:

_IDs["key"] = "value";

_ID声明为:

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

也尝试改为:

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

但是得到同样的错误。

如何让代码符合Misra?

2 个答案:

答案 0 :(得分:6)

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

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

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

但是,我建议不要使用(或至少升级)在实际使用std::string时发出警告的linter。

另请注意,您无法按照尝试方式拨打std::map::insert。没有直接接受密钥和值的重载,而是存在一个由密钥和值组成的对的重载。请参阅here重载号码1。

答案 1 :(得分: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]);
}

使用上面的模板功能,你应该能够像这样过去:

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

顺便说一句 - 我很惊讶lint并没有抱怨_IDs是一个保留名称 - 你应该避免在C或C ++中使用下划线,特别是与cap一起使用时。