CodeQL for c/c++(五):转换和类
转换在 C 和 C++ 中,转换会更改表达式的类型。它们可能是编译器生成的隐式转换,也可能是用户请求的显式转换
我们来看看标准库中的Conversion类:
Expr
Conversion
Cast
CStyleCast
StaticCast
ConstCastReinterpretCast
DynamicCast
ArrayToPointerConversion
VirtualMemberToFunctionPointerConversion
探索赋值的子表达式让我们考虑以下 C 代码:
1234567typedef signed int myInt;int main(int argc, char *argv[]){ unsigned int i; i = (myInt)1; return 0;}
以及这个简单的查询:
1234import cppfrom AssignExpr aselect a, a.getLValue().getType(), a.getRValue().getType()
查询检查赋值代码,并告诉我们它 ...
CodeQL for c/c++(四):表达式、类型和语句
前言C 中表达式的每个部分都成为 Expr 类的一个实例。 例如,C 代码 x = x + 1 变成了一个 AssignExpr、一个 AddExpr、两个 VariableAccess 实例和一个 Literal。所有这些 CodeQL 类都扩展了 Expr
查找赋值为零在以下示例中,我们找到了将常量值分配为零的 AssignExpr 实例:
12345import cppfrom AssignExpr ewhere e.getRValue().getValue().toInt() = 0select e, "Assigning the value 0 to something."
结果类似下面,将某个量赋值成了0:
)
此示例中的 where 子句获取赋值右侧的表达式 getRValue(),并将其与零进行比较。 请注意,没有检查以确保赋值的右侧是整数或它具有值(即,它是编译时常量,而不是变量)。对于这些假设中的任何一个错误的表达式,关联的谓词根本不返回任何内容并且 where 子句不会产生结果。 你可以把它想象成在这一行的开头有一个隐式的存在(e.getRV ...
CodeQL for c/c++(三):函数使用
前言C 和 C++ 的标准 CodeQL 库表示使用 Function 类的函数(请参阅 C 和 C++ 的 CodeQL 库)
本主题中的示例查询探索了一些用于查询函数的最有用的库谓词
查找所有静态函数使用成员谓词 Function.isStatic(), 我们可以列出数据库中的所有静态函数:
12345import cppfrom Function fwhere f.isStatic()select f, "This is a static function."
此查询非常通用,因此对于大多数重要项目而言,这个查询出的结果可能太多,而无法吸引人
查找未被调用的函数使用抽象语法树类别中的标准 CodeQL FunctionCall 类查找未被调用的函数可能更有趣(请参阅 C 和 C++ 的 CodeQL 库)。FunctionCall 类可用于标识函数实际使用的位置,它通过 FunctionCall.getTarget() 谓词与 Function 相关联
12345import cppfrom Function fwhere not exists(Functi ...
CodeQL for c/c++(二):codeQL库
关于codeQL的c/c++库有一个广泛的库,用于分析从 C/C++ 项目中提取的 CodeQL 数据库。 该库中的类以面向对象的形式呈现数据库中的数据,并提供抽象和谓词以帮助您完成常见的分析任务。 该库是作为一组 QL 模块实现的,即扩展名为 .qll 的文件。 模块 cpp.qll 导入所有核心 C/C++ 库模块,因此您可以通过以下方式开始查询来包含完整的库:
1import cpp
常用的库类下面列出了最常用的标准库类,该列表按功能细分。
每个库类都用它对应的 C/C++ 构造进行注释
声明类
示例语法
CodeQL 类
int var ;
GlobalVariable
namespace N { … float var ; … }
NamespaceVariable
int func ( void ) { … float var ; … }
LocalVariable
class C { … int var ; … }
MemberVariable
int func (const char ...
CodeQL for c/c++(一):基础查询语句
前言本章其实主要是codeQL官方c/c++文档的翻译:
CodeQL官方c/c++文档
关于本次搜索我们将要运行的查询的目的为,对冗余 的if 语句的代码执行基本搜索,因为它们有一个空的 then 分支。 例如,代码如:
1if (error) { }
即,if判断之后并未执行任何操作,即可被认定为我们的冗余语句
使用步骤在搜索之前,本次使用在线的搜索项目lgtm:
使用该平台的步骤为:
1.搜索并选择想要查询的项目
2.单击查询此项目
3.这将打开查询控制台
4.输入查询语句
5.点击运行,即可得到结果
查询语句解释本次使用到的查询语句为:
123456import cppfrom IfStmt ifstmt, Block blockwhere ifstmt.getThen() = block and block.getNumStmt() = 0select ifstmt, "This 'if' statement is redundant."
运行之后,查询结果类似以下所示:
这里找到了219个结果,点进去就可以 ...