我正在寻找一个返回类型大小的 C++ 函数。例如 :
#include <stdint.h>
int16_t my_var;
int32_t size_of_var;
// magical_function is what I'm looking for
// size_of_var should be equal to 16 because my_var is a int16_t
size_of_var = my_var.magical_function() ;
Run Code Online (Sandbox Code Playgroud)
我知道 size() 的存在是为了获取字符串的长度,所以我猜也有一个函数表明了这一点。
此外,我正在使用 Clang 库,所以我可以获得一个类型(http://clang.llvm.org/doxygen/classclang_1_1Type.html),但我目前不知道比较 2 种类型并了解它们之间的较大值二。
我想确保这种类型的代码
void f1 (int32_t p[10]);
void f2 (int32_t *p);
void b ()
{
int_32_t a[10];
f1(a);
f2(a);
}
Run Code Online (Sandbox Code Playgroud)
当有人编码时不会发生,因为当使用f2()时,您可能会丢失有关数组边界的信息.它是MISRA标准规则之一.
但AST-dump在2个函数声明之间没有区别:
|-FunctionDecl 0x2204140 <test.cpp:3:1, col:23> f1 'void (int32_t *)'
| -ParmVarDecl 0x2204040 <col:10, col:22> p 'int32_t *'
|-FunctionDecl 0x2204280 <line:4:1, col:20> f2 'void (int32_t *)'
| -ParmVarDecl 0x2204200 <col:10, col:19> p 'int32_t *'
Run Code Online (Sandbox Code Playgroud)
我猜Clang确实记录了数组(10)的大小,但AST-dump似乎告诉了相反的情况.
有没有办法区分?
使用Clang库,是否有一些可用的方法来获取变量的大小(就像我sizeof()在常规的C/C++程序中使用的那样?
我能够(这是我想要做的)发现VarDecl,但目前我仍然无法在Clang命名空间中找到任何方法来获取当前发现的var的大小VarDecl
当我访问一个声明(在 Clang 库中)时,如何获取写入Decl该声明的文件的名称?Decl
有一个FileData类,但我找不到任何其他类可以让我得到这个FileData
我有一些代码行从静态代码分析器返回错误.
该分析器使用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;
}
Run Code Online (Sandbox Code Playgroud)
所以基本上,它只是在从指针到不同于整数的某些东西进行某些强制转换(隐式或显式)时添加违规.
以下是返回错误的表达式之一:
if(st_parametre_embarque.qs_nom.contains("PAR")){.
st_parametre_embarque只是一个结构,而这个领域qs_nom是一个QString.
方法Qstring :: contains()确实返回一个布尔值.
以下是代码分析器产生的违规消息:
禁止从指针转换为非整数类型的PointerToBoolean
所以我真的没有看到可能存在的地方castExpr,而且从指针 …
简单的一维数组被认为是一个指针,但矩阵的情况也是如此?
但是,立方体int[5][5][5]也会被认为是int ***?
使用std库和函数find,如何知道给定字符串中是否有任何转义字符?
例如 :
string line = "bla bla bla \n blabla";
bool hasEscapedSequence = (line.find("\n",0) < line.size());
Run Code Online (Sandbox Code Playgroud)
这显然是行不通的,因为\n在find将被转义.如果我尝试(line.find("\\n",0) < line.size());,它似乎没有改变任何东西
我应该怎么做 ?
我正在尝试在虚拟测试文件上制作一些 Clang AST 转储。这是我正在使用的命令行:
clang -Xclang -ast-dump -fsyntax-only test.cpp
Run Code Online (Sandbox Code Playgroud)
int * a = NULL;可以被我的 test.c 识别,但不能被我的 test.cpp 识别。
我也尝试过int * a = nullptr;,但这也不起作用。
我应该更改命令行中的一些选项吗?