这是我的代码库的一部分.我没有得到警告的意思,因此无法解决此问题...代码:
struct ParamsTube{
uint8 Colours01[4];
uint8 Colours02[4];
uint8 Colours03[4];
};
void sample_fun(const uint8 *diagData){
ParamsTube Record;
memcpy(&Record.Colours01[0], &diagData[0], 4); //Line 1
memcpy(&Record.Colours02[0], &diagData[4], 4); //Line 2
memcpy(&Record.Colours03[0], &diagData[8], 4); //Line 3
}
Run Code Online (Sandbox Code Playgroud)
在第1,2和3行的这个逻辑的LINT警告426是
Call to function 'memcpy(void *, const void *, std::size_t)' violates semantic '(3n>4)'
Run Code Online (Sandbox Code Playgroud)
你能告诉我究竟是什么意思.....
(3n > 4)意味着用于调用的第三个参数memcpy()应大于4,并且您的调用违反了此语义.语义似乎表明memcpy()不应该用于复制小于机器字的数据(通常为4).这就是lint警告你的原因.语义是否合适是另一个问题.
以下是棉绒警告426的说明:
426调用函数'Symbol'违反语义'String' - 当违反用户语义(由-sem定义)时发出此警告消息.'String'是被违反的语义的子部分.例如:
//lint -sem( f, 1n > 10 && 2n > 10 )
void f( int, int );
...
f( 2, 20 );
Run Code Online (Sandbox Code Playgroud)
结果在消息中:
Call to function 'f(int, int)' violates semantic '(1n>10)'
Run Code Online (Sandbox Code Playgroud)
所以memcpy()在你的环境中可能有一个领先的lint语义,如下所示:
// lint -sem(memcpy, 3n > 4)
void* memcpy(void* s1, const void* s2, std::size_t n);
Run Code Online (Sandbox Code Playgroud)
对于您的情况,如果您想实现的目标是:
memcpy(&Record.Colours01[0], &diagData[0], 4); //Line 1
memcpy(&Record.Colours02[1], &diagData[4], 4); //Line 2
memcpy(&Record.Colours03[2], &diagData[8], 4); //Line 3
Run Code Online (Sandbox Code Playgroud)
那简单地说:
memcpy(&Record, diagData, sizeof(Record));
Run Code Online (Sandbox Code Playgroud)
将在不触发棉绒警告的情况下完成所有工作.