如何解决Coverity 分析显示 const 类型错误如何解决这个问题?
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
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”,这是更自然的英文描述。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。