此代码中的演员阵容在哪里?

时间:2014-08-26 07:56:08

标签: c++ qt casting clang

我的代码中有一行从静态代码分析器返回错误。

此分析器使用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_nomQString

方法Qstring::contains()确实返回一个布尔值。

以下是代码分析器产生的违规消息:

从指针到非整数类型禁止强制转换PointerToBoolean

所以我真的看不到哪里有castExpr,而且从指针到布尔值。

1 个答案:

答案 0 :(得分:5)

在Qt5之前,QString::contains返回了QBool,而不是bool。该值必须以某种方式转换为bool,静态分析器已经确定它是隐式转换。尝试与布尔常量进行显式比较(即调用operator==(QBool, bool))并查看静态分析器是否遵循它。