gpt4 book ai didi

c++ - 解析 C++ 和控制流程

转载 作者:搜寻专家 更新时间:2023-10-31 01:46:46 25 4
gpt4 key购买 nike

有一个巨大 C++ 项目是使用 CMake 和 gcc 4.2.3 构建的。该应用程序采用多个进程。

最终目标是列出所有可能写入日志文件的错误消息。信息和调试消息也写入此文件。

我发现在某些 main.cpp(一切开始的文件)中有一个 catch 表达式,其中写入文件。所以我需要找到满足以下条件的throw表达式:

  1. throw 表达式中使用的某些错误类型之一(例如 runtime_error、logic_error 等)。
  2. 在位于 main.cpp 中的 catchthrow 表达式之间的堆栈中没有其他 catch。如果有 catch,它可能会附加附加信息(这很重要)并重新抛出。此外,它可能会使用不同的错误类型重新抛出,甚至是静默。

项目很大,很难判断这部分代码是否会在这次构建中执行。一些构建使用某些库,而另一些则不使用。

也许我的方法有误,但我认为解决方案是一个两步过程:

  1. 按照编译器的方式解析所有 C++ 代码(确保 throw 不在注释部分,不是宏等)
  2. 在编译树中找到所有抛出表达式并模拟抛出。实际上,我在这里看到了一个问题,因为可能真的涉及到条件,例如:

    string error_msg;
    enum Condition condition;
    switch(condition)
    {
    CONDITION1: error_msg = "sadasda"; break;
    CONDITION2: error_msg = "sadasds1111a"; break;
    CONDITION3: error_msg = "sasdasadasda"; break;
    default: error_msg = "sadasda"; break;
    }
    throw logic_error(error_msg);

也许这一切都是错误的,应该采取不同的方法。我很高兴看到您的建议。

最佳答案

至少可以说,编写 C++ 有效解析器确实是一项艰巨的任务,而且可能不是到达所需位置的更快方法。

基本上,您想要的是为您的目的重用现有的解析器,这也不容易。您需要研究各种编译器插件和静态分析工具。例如 clang static analyzer似乎(相对!)容易扩展。也许更简单的方法是使用现有的静态 C++ 分析器,例如 lint ,并检测未捕获的异常。然后,您修改 main 以停止捕获您感兴趣的异常,并查看未捕获的异常列表。你还远未完成,但你可以从那里开始工作。 C++ lint 不是免费软件,但 AFAIK 免费替代品( cppcheck ,clang anlyzer)没有高级异常分析。也许coverity也可能有兴趣,他们有用于编写扩展的脚本和/或 SDK。

另一种方法是在你的异常对象中故意泄漏内存,任何好的静态分析器都会在创建异常对象的点找到泄漏源,即抛出点,甚至可能是你添加的点异常的信息。我不知道这对您的代码是否现实,但在此设置中,我认为免费分析器可以工作。

无论如何,祝你好运,使用大型代码库绝非易事;)

关于c++ - 解析 C++ 和控制流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20199882/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com