当我运行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
这颠倒了开头的char
和const
的顺序,所以它现在读为&;query是一个指向常量字符的常量指针&;,这是一个更自然的英语描述。