【问题标题】:Are there any C++ tools that detect misuse of static_cast, dynamic_cast, and reinterpret_cast?是否有任何 C++ 工具可以检测对 static_cast、dynamic_cast 和 reinterpret_cast 的滥用?
【发布时间】:2011-01-28 18:53:44
【问题描述】:

以下问题的答案描述了 C++ 中 static_castdynamic_castreinterpret_cast 的推荐用法:

When should static_cast, dynamic_cast, const_cast and reinterpret_cast be used?

你知道有什么工具可以用来检测这些演员阵容的滥用吗?像 PC-Lint 或 Coverity 静态分析这样的静态分析工具可以做到这一点吗?

提示这个问题的特殊情况是不恰当地使用static_cast 来向下转换一个指针,编译器不会对此发出警告。我想使用一个工具来检测这种情况,而不是假设开发人员永远不会犯这个错误。

【问题讨论】:

  • 使用 static_cast 来向下转换指针很好,如果你知道它是你要转换到的正确子类,建议使用它。
  • 这是对 static_cast 的适当使用。我正在寻找一种能够检测不当使用的工具(我要转换的子类是错误的)。
  • 问题是static_cast scape 代码中可用信息的特殊情况(您可能从设计中的不变量中知道,即使信息不存在于代码中,转换也是正确的)

标签: c++ casting static-analysis downcast dynamic-analysis


【解决方案1】:

Boost 提供了 polymorphic_pointer_downcast() 和 polymorphic_downcast() 函数,它们的作用类似于 static_cast 但如果等效的 dynamic_cast 失败会断言(通常仅在调试版本中)。

详情请见http://www.boost.org/doc/libs/1_61_0/libs/conversion/cast.htm

【讨论】:

    【解决方案2】:

    Visual Studio 对其中一些有警告。例如,C4946。不过,它们大多默认关闭。

    http://msdn.microsoft.com/en-us/library/23k5d385.aspx

    【讨论】:

      【解决方案3】:

      鉴于在编译时没有可靠的方法来判断指针指向的类型,这是一个在编译时很难捕捉到的问题。

      最简单的方法是在运行时进行捕获,使用宏“safe_cast”编译为带有调试中断言的动态转换和发布中的静态转换。

      现在,在调试过程中,如果转换不合适,动态转换将返回 NULL,并断言。发布期间也没有开销。

      【讨论】:

        猜你喜欢
        • 2010-09-24
        • 2011-01-16
        • 2018-07-17
        • 1970-01-01
        • 1970-01-01
        • 2013-10-21
        • 1970-01-01
        相关资源
        最近更新 更多