0

当我运行 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类型,为什么会显示这个错误?

4

1 回答 1

0

解决方案:在声明中添加 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

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

于 2021-02-02T18:05:11.130 回答