c++ - 标记化和 AST

标签 c++ c static-analysis abstract-syntax-tree

有一个比较抽象的问题要问大家。我正在考虑参与静态代码分析项目。它使用 C 和 C++ 作为开发语言,因此如果您的回复中有任何代码可以使用这两种语言中的任何一种,那就太好了。

我的问题: 我需要了解一些用于处理静态分析代码的基本概念/结构。我听说人们使用 AST 和标记化等东西。我只是想知道是否有什么可以阐明这些东西是如何应用于创建静态分析工具的?我更喜欢对标记化的解释,因为我不太了解它。我知道这是一种处理字符串的方法,但我对这个答案没有信心。此外,我知道我正在查看的项目在分析代码之前通过预处理器传递代码。谁能解释一下?当然如果是静态代码分析就不需要预处理了吗?

希望有人能帮我解决这个问题。

干杯。

最佳答案

标记化是将源文本分解为语言元素(例如运算符、变量名、数字等)的行为。解析读取标记序列并构建 Abstract Syntax Trees ,这是一个特定的程序表示。标记化和解析对于静态分析来说是必要的,但几乎没有意义,就像底池赌注对于玩扑克牌来说是必要的,但无论如何都不是游戏中有趣的部分。

如果你正在构建一个静态分析器(你暗示你希望在一个用 C 或 C++ 实现的上工作),你将需要编译的基础知识(除非你正在构建一个静态语言的解析器,否则解析器不是那么多)分析),但肯定是关于程序表示(AST、三元组、控制和数据流图,...)、类型和属性推断以及分析准确性的限制(保守分析的原因。 程序表示是基础,因为它们是大多数静态分析器真正处理的数据结构;直接从程序文本中提取有用的信息实在是太难了。这些概念可用于在任何编程语言中实现静态分析功能,以实现分析类型工具;用 C 或 C++ 实现它们没有什么特别之处。

运行,不要走,到离你最近的编译器类的第一部分。如果你没有它,你将无法在工具构建方面做任何有效的事情。您更有可能在研究生计算机科学类(class)中找到第二部分。

如果您解决了这个基本知识问题,您将决定从头开始实现分析工具,或者在现有分析工具基础架构的基础上进行构建。很少有人决定从头开始构建一个;构建健壮的解析器、流分析器等需要大量工作(数年或数十年),作为任何特定静态分析的基础。大多数人尝试使用一些现有的基础设施。

有大量候选人名单:http://en.wikipedia.org/wiki/List_of_tools_for_static_code_analysis

如果您坚持处理 C 或 C++ 并构建您自己的自定义复杂分析,您真的真的需要一个可以处理真正的 C 和 C++ 代码的工具。恕我直言,优秀候选人的数量有限:

  • GCC(以及各种移植物,例如 Starynkevitch 的 MELT,对此我知之甚少)
  • Clang(非常出色的工具集)
  • DMS (及其 C and C++ front ends )[我公司的工具]
  • Open64 编译器基础设施
  • Rose 编译器基础架构(基于 EDG 的全行业前端)

其中每一个都是大系统,需要大量投资才能理解和开始使用。不要低估学习曲线。

还有很多其他工具可以处理 C 和 C++,但“有点”对于静态分析目的来说是毫无用处的。

如果您打算简单地使用静态分析工具,您可以避免学习大部分的解析和程序表示问题;相反,您需要尽可能多地了解您打算使用的特定分析工具。有了上面的编译器背景,你仍然会好很多,因为你会理解这个工具做什么,为什么这样做,以及为什么它会产生它所做的那种答案(通常它会产生很多不令人满意的答案由于对分析准确性的保守限制而导致的方法)。

最后,您应该清楚您了解静态分析动态分析 [使用运行时收集的数据来确定程序属性] 之间的区别。大多数最终用户根本不在乎您如何获取有关他们代码的信息,并且每种分析方法都有其优点和缺点。

关于c++ - 标记化和 AST,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8931927/

相关文章:

c - 在 C 的程序集中使用标签

c - 自动注释代码

c++ - 如何让 Coverity 静态分析兼容 C++0x 标准?

Java/SpotBugs,如果在接口(interface)中声明 "named static inner class",那么它是什么?

c++ - 'dummy' 可以在未初始化的情况下使用

c++ - 将对象写入文件和从文件读取对象

C fgets 语义错误

c - C 的污点分析

c++ - QML FontLoader 不工作

c++ - 在 MinGW 编译器中,-mwindows 命令是什么,它有什么作用?