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”,这是更自然的英文描述。

>

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...