为什么lint会抱怨#34;警告446:启动器中的副作用",lint e446代码如下?

时间:2014-04-15 11:48:20

标签: c++ linux lint

由于struct初始化,我需要帮助理解为什么lint会抱怨下面的代码。 代码运行没有任何问题,或者至少是

的任何已知问题
struct MsgKey_t {
    int type;
    int index;
    int signal;
};

typedef std::map< int, std::pair< MsgKey_t*, int* > > MyMap_t;

MyMap_t myMap;

MyMap_t::iterator subKey = myMap.find( 11 );

if ( myMap.end() == subKey )
{
    exit(-1);
}

MsgKey_t key = { subKey->second.first->type, subKey->second.first->index, subKey->second.first->signal };

如果我将结构的初始化更改为:

MsgKey_t key;
memcpy( &key, subKey->second.first, sizeof( key ) );

或:

MsgKey_t* pKey = subKey->second.first;
MsgKey_t key = { pKey->type, pKey->index, pKey->signal };

lint整天都很开心。

1 个答案:

答案 0 :(得分:0)

根据C++lint documentation,这就是原因:

  

自动聚合(数组,结构和联合)通常是   由一组常量值表达式初始化而没有   副作用。在这种情况下,编译器可以支持副作用   可能想要取消此消息。

完全有可能这些不是恒定的,可能会产生副作用:

subKey->second.first->type, subKey->second.first->index, subKey->second.first->signal

由于你的memcpy在技术上并不遵循典型的初始化,只是移动字节,lint不会警告你。它会让你这样做。