如何在用sed或awk预处理C/C++代码时可靠地定位函数
how to target reliably functions when pre-processing C/C++ code with sed or awk?
我想通过使用sed/awk预处理源文件来直接插入我的代码。我不能使用其他方法,如调试器跟踪或gcc选项-finstrument-functions
。在最后一种情况下,地址以某种我无法管理的方式重新设置,并且我错过了与符号表的对应关系。这里介绍的其他方法(ptrace、etrace、callgraph等)或这里介绍的方法在一个简单的例子中效果很好,但在我的真实项目中却没有。
问题是,在处理大型开源项目时,函数的编写标准不同,不仅在C和C++文件之间,而且通常在同一个文件中。{
可能在参数列表的末尾,或者在另一行,结构或赋值可能使用起始{
,使得简单函数解析为false。
因此,上述链接中提出的在函数定义的开头插入宏的解决方案通常不起作用,而且用千行代码(KLOC)进行纠正是不可行的。
sed 's/^{/{ENTRY/'
那么,如何用sed或awk中可用的正则表达式可靠地针对C/C++代码中的函数定义呢?可能是通过使用gcc预编译器代码的一部分?我正在找一些可能是现成的东西。
sed
或awk
(或任何纯文本方法)是可靠处理C代码的错误工具(您可能应该处理预处理的表单)。
您想要处理某种形式的编译器的AST。当然,编译器内部的内部表示是特定于编译器的(甚至可能是特定于它的版本)。
如果使用最近的GCC,您可以使用MELT进行自定义(并将您的通行证添加到GCC),或者使用C++中自己的插件。
如果使用Clang/LLVM,您也可以通过添加通行证进行自定义。
Coccinelle工具也可能是相关的。
任何这样的方法都需要大量的工作(可能需要数周),因为您需要详细了解正在使用的特定编译器的内部表示。C足够复杂,可以使它变得不平凡。
您不能使用任何不了解代码所用C的特定版本的工具(例如C++、ANSI-C或C-99)来执行此操作。作为一个琐碎的例子,"//"在"C函数"中是什么意思?如果它在一个字符串中,它是一对斜杠,如果它在字符串之外,如果代码是C++或C-99,它可能是注释的开始,但它不是ANSI-C中注释的开始。如果它在/* ... // ... */
里面呢?如果一个函数定义后面跟着一个"//",那真的是一个函数吗?
你没有说你想做什么("预处理代码"并不能告诉我们任何事情),但你应该考虑使用我在Remove multi-line comments上发布的东西,使用gcc来去除代码中的注释,然后使用C美化器,如"indent"或"cb"来一致地重新格式化代码,和/或如果你只是在寻找列出函数的工具,请查看"cscope"或"ccalls"。
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 为cl.exe(Visual Studio代码)指定命令行C++版本
- 在Linux for Windows上编译C++代码时出错
- 我的字符计数代码计算错误.为什么
- 孤立代码块在结构中引发异常
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 为什么我的C#代码在调用回C++COM直到Task时会暂停.等待/线程.加入
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 此代码是否违反一个定义规则
- 为什么我的代码在输出中增加了93天
- 我的简单if-else语句是如何无法访问的代码
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么在这个代码结束循环中没有得到结束
- 在c代码之间共享数据的最佳方式
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值