Lint:调用函数'memcpy(void*,const void*,std :: size_t)'违反语义'(3n> 4)'

Ash*_*win 3 c++ lint

这是我的代码库的一部分.我没有得到警告的意思,因此无法解决此问题...代码:

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)

你能告诉我究竟是什么意思.....

nev*_*boy 7

(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)

将在不触发棉绒警告的情况下完成所有工作.