问题描述
当我运行 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
这把开头的 char
和 const
的顺序颠倒了,所以现在读作“query is an constant pointer to a constant character”,这是更自然的英文描述。