微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Coverity 分析显示 const 类型错误如何解决这个问题?

如何解决Coverity 分析显示 const 类型错误如何解决这个问题?

当我运行 Coverity 分析时,下面的函数显示错误

void initalizeStatement(sqlite3* db,const char* query)
{
    // statement shall not be reuesed!
    if (_valid) _valid = false;
    else
    {
        sqlite3_stmt* stmt = NULL;
        auto result = sqlite3_prepare(db,query,-1,&stmt,NULL);

        if(sqlITE_OK != result)
        {
            DLT_LOG(dltContextSARMBUtils,DLT_LOG_ERROR,DLT_STRING("[Statement::initalizeStatement()] sqlite3_prepare Failed. status code : "),DLT_INT(result),DLT_STRING(",query : "),DLT_STRING(query));
        }

        else //all good!
        {
            _valid = true;
            _stmt = stmt;
            _db = db;
        }
    }
}

我看到的错误如下:

<testcase name="[45] MISRA C++-2008 Rule 7-1-1 | misra_cpp_2008_rule_7_1_1_violation" time="0">
<failure message="The variable `query` has a non-const type,however its value is never changed. Consider adding a const qualifier to the variable type."> MBUtils::Statement::initalizeStatement(sqlite3*,char const*) </failure>

如果已经有 const 类型,为什么会显示错误

解决方法

解决方法:在声明中加入const

MISRA C++ 2008 规则 7-1-1 全文阅读,“未修改的变量应为 const 限定。” (该标准不是免费提供的,所以我无法链接到它。)此外,标准中给出的示例清楚地表明该规则适用于参数以及局部变量。

在您的示例代码中,query 没有被修改,因此它必须是 const 才能符合此规则:

void initalizeStatement(sqlite3* db,const char* const query)
//                                               ^^^^^ added

在您的原始代码中,query 被声明为指向指向 const 但本身不是 const 的内容。

如何阅读 C 声明

由于 C/C++ 声明的语法可能有点混乱,我的建议是从右到左阅读它们。所以原声明:

const char * query

将被解读为“查询是指向常量字符的指针”。我建议的修复中的声明:

const char * const query

将被解读为“查询是一个指向常量字符的常量指针”。

风格意见

顺便说一句,如果这是我的代码(并且我必须遵守 MISRA),我实际上会将其写为:

char const * const query

这把开头的 charconst 的顺序颠倒了,所以现在读作“query is an constant pointer to a constant character”,这是更自然的英文描述。

>

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。