我的代码中有一行从静态代码分析器返回错误。
此分析器使用clang编程,违反规则的源代码非常简单:
// For each cast expression in the code
bool VisitCastExpr(CastExpr *castExpr){
string errorMsg;
string CastName = castExpr->getCastKindName();
// If cast is from pointer to everything different than an integer, add violation
if((castExpr->getCastKind() == CK_MemberPointerToBoolean)||(castExpr->getCastKind() == CK_PointerToBoolean)||(castExpr->getCastKind() == CK_CPointerToObjCPointerCast)||(castExpr->getCastKind() == CK_BlockPointerToObjCPointerCast)||(castExpr->getCastKind() == CK_AnyPointerToBlockPointerCast)){
errorMsg = "Forbidden cast "+CastName+" from pointer to non-integer type";
addViolation(castExpr,this,errorMsg);
}
return true;
}
所以基本上,它只是在从指针到不同于整数的某些东西进行某些强制转换(隐式或显式)时添加了一个违规。
以下是返回错误的表达式之一:
if(st_parametre_embarque.qs_nom.contains("PAR")){
。
st_parametre_embarque
只是一个结构,字段qs_nom
是QString
。
方法Qstring::contains()确实返回一个布尔值。
以下是代码分析器产生的违规消息:
从指针到非整数类型禁止强制转换PointerToBoolean
所以我真的看不到哪里有castExpr
,而且从指针到布尔值。
答案 0 :(得分:5)
在Qt5之前,QString::contains
返回了QBool
,而不是bool
。该值必须以某种方式转换为bool,静态分析器已经确定它是隐式转换。尝试与布尔常量进行显式比较(即调用operator==(QBool, bool)
)并查看静态分析器是否遵循它。