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 qualified。"(该标准不是免费提供的,所以我无法链接到它。)此外,标准中给出的例子清楚地表明,该规则既适用于局部变量,也适用于参数。

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

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

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

如何读取C声明

由于C/c++声明的语法可能有点令人困惑,我的建议是从右向左阅读它们。所以原来的声明:

const char * query

读作";query是指向一个常量字符的指针"。我建议的修复中的声明:

const char * const query

读作";query是一个常量指针,指向一个常量字符。

<<h2>风格意见/h2>顺便说一下,如果这是我的代码(我必须遵守MISRA),我实际上会这样写:
char const * const query

这颠倒了开头的charconst的顺序,所以它现在读为&;query是一个指向常量字符的常量指针&;,这是一个更自然的英语描述。

最新更新