代码之家  ›  专栏  ›  技术社区  ›  waffleman

用于查找C型铸件的工具

c c++
  •  26
  • waffleman  · 技术社区  · 14 年前

    有人知道我可以用一个工具在代码中查找显式的C样式转换吗?我正在重构一些C++代码,并希望在可能的情况下替换C样式的铸件。

    C样式的转换示例如下:

    Foo foo = (Foo) bar;
    

    相比之下,C++风格的例子将是:

    Foo foo = static_cast<Foo>(bar);
    Foo foo = reinterpret_cast<Foo>(bar);
    Foo foo = const_cast<Foo>(bar);
    
    9 回复  |  直到 11 年前
        1
  •  31
  •   jonner    14 年前

    如果您使用的是g c c/g++,只需为C样式的强制转换启用一个警告:

    g++ -Wold-style-cast ...
    
        2
  •  8
  •   anon    14 年前

    这种类型的铸件很难找到,这是最早引入新型铸件的原因之一。如果代码正常工作,这看起来是一个毫无意义的重构——只要我修改了周围的代码,我就把它们改成新的类型转换。

    话虽如此,事实上,在C++代码中有C样式的转换将指示代码的问题,这些代码应该是固定的——即使不是可能的话,我也不会只做一个全局替换。

        3
  •  6
  •   sth ACP    14 年前

    正在搜索正则表达式 \)\w 结果令人惊讶。

        4
  •  6
  •   grrussel    14 年前

    这个 Offload C++ compiler 支持将所有此类强制转换报告为编译时错误的选项,并将此类强制转换的语义限制为与静态强制转换更安全地等效。

    相关选项包括:

    -cp_nocstylecasts   
    

    编译器将在所有C样式转换上发出错误。C++代码中的C样式转换可能是不安全的,导致不希望的或未定义的行为(例如,将指针指向无关的结构/类类型)。这个选项对于重构来说是有用的,以找到所有这些转换,并用更安全的C++转换(如StasyType)替换它们。

    -cp_c2staticcasts   
    

    编译器将C++ STATICE-CAST的更为受限的语义应用到C样式的转换。使用此选项打开代码,确保C样式的转换至少与C++静态模型一样安全。

    如果现有代码中有大量C样式的转换和重构,则每个选项都是非常有用的。

        5
  •  1
  •   Ira Baxter    14 年前

    一种工具,可以准确地分析C++源代码并执行自动自定义更改(例如,您的CAST替换) DMS Software Reengineering Toolkit .

    DMS有一个完整的C++解析器,构建了AST和符号表,因此可以导航您的代码以可靠地找到C样式的铸件。通过使用模式匹配和重写,您可以提供一组规则,这些规则可以将所有这样的C样式转换转换成所需的C++等价物。

    DMS已经被用于为波音和一般动力学执行大规模的自动化C++重构任务,每个任务涉及数千个文件。

        6
  •  0
  •   Alex Martelli    14 年前

    C样式的强制转换的一个问题是,由于它们依赖于超负荷的括号,因此它们并不容易被发现。不过,regex(例如,在python语法中):

    r'\(\s*\w+\s*\)'
    

    是一个开始——它将括号中的单个标识符与括号中的可选空白相匹配。但当然不会,例如, (void*) 强制转换——也可以获取尾随的星号,

    r'\(\s*\w+[\s*]*\)'
    

    你也可以从一个选项开始 const 进一步扩大网络等。

    一旦你有了一个好的资源,很多工具(从 grep vim ,从 awk sed 加上 perl , python ,请 ruby 等)允许您应用它来标识源中的所有匹配项。

        7
  •  0
  •   Frunsi    14 年前

    如果使用某种匈牙利风格的符号(例如 iInteger , pPointer 等),然后您可以搜索例如 )p ) p 等等。

    即使对于大型代码库,也应该可以在合理的时间内找到所有这些位置。

        8
  •  0
  •   Ira Baxter    14 年前

    我已经回答过一次,描述了一个工具 改变 如果你想的话,所有的演员都可以。

    如果你只想做 找到 在这种类型转换中,还有另一个工具可以轻松完成这一任务,实际上是对这里提出的所有“正则表达式”建议的极端概括。那就是 SD Source Code Search Engine . 这个工具可以根据构成每种语言的语言元素来搜索大型代码库。它提供了一个图形用户界面,允许您输入查询、查看单个点击,并通过鼠标单击在点击点显示文件文本。再单击一次,您就可以在一个文件的编辑器中[对于许多编辑器]。该工具还将记录上下文中的点击列表,以便您以后可以重新访问它们。

    在您的案例中,以下搜索引擎查询可能会获取大部分强制转换:

    '(' I ')'  | '(' I ... '*' ')'
    

    这意味着,找到一个标记序列,第一个是(,第二个是任何标识符,第三个是'),或者一个类似的序列,包含以'*'结尾的内容。

    您没有指定任何空白管理,因为工具了解语言空白规则;它甚至会忽略转换中间的注释,并且仍然与上面的内容匹配。

    [我是这家公司的首席技术官。]

        9
  •  -1
  •   Community kfsone    7 年前

    我在Visual Studio(2010)的“文件”搜索框中使用了此正则表达式: :i\):i

    感谢某事物的启发( his post )