【问题标题】:Object of pointer type 'gpointer' cast to unrelated type 'string*'指针类型“gpointer”的对象转换为不相关类型“string*”
【发布时间】:2014-07-04 00:40:48
【问题描述】:

我正在尝试对 MISRA 进行一些代码投诉,并且我有以下代码:

static void DBusCallback(GObject *object, GAsyncResult *res, gpointer user_data) {
    std::string * const tmp = reinterpret_cast<std::string*>(user_data);
    ...

其中 DBusCallback 是 call_DBus 的回调:

   (void)call_DBus(proxy, NULL, &DBusCallback, reinterpret_cast<void*>(new std::string(user_data)));

//最后一个婴儿车是回调中的user_data

它编译并运行正常,但是在从 gpointer 进行字符串转换时出现以下 MISRA 警告: MISRA.CAST.PTR.UNRELATED:指针类型“gpointer”的对象转换为不相关的类型“string*”

规则是: MISRA-C++ 规则 5-2-7(必需):具有指针类型的对象不应直接或间接转换为不相关的指针类型。 [未指定 5.2.10(7)] 基本原理 从指针转换为不相关类型的结果是未指定的。

有什么办法可以避免这个警告吗?

【问题讨论】:

  • 你确定它工作正常吗? gpointer 是什么?除非它是指向 std::string 的指针,否则我看不出它是如何工作的。
  • 是的,它有效。我创建了新的 std::string,它被强制转换为 void*,然后在回调中再次转换为 std::string。 Gpointer 是:typedef void* gpointer;
  • 嗯,MISRA 旨在阻止您做类似的事情。因此,消除警告的最佳方法是确保您始终输入相同、正确的类型。另外,MISRA 也禁止函数指针,所以你也不能做&amp;DBusCallback...
  • @user3458705 它适用于您的特定实现,但不能保证在另一个编译器甚至您的新版本上。这就是 unspecified 的意思,但如果您不想接受 Lindydancer 的建议,则需要创建偏差并记录您的理由。

标签: c++ pointers type-conversion reinterpret-cast misra


【解决方案1】:

reinterpret_cast 通常对 MISRA 不友好。

MISRA 希望确保可以进行转换,并且此转换不会出现运行时错误。因此,您需要一个函数以安全的方式执行转换,这可能会使您创建另一个获取 gpointer 并返回字符串的类或函数。

另一个选项(如果可能的话)是在这个级别(离硬件很近),您可以禁用 reinterpret_cast 对访问它的函数的警告。

最后一个是忘记 std::string 并使用 const char*:

static void DBusCallback(GObject *object, GAsyncResult *res, gpointer user_data) {
    std::string * const tmp = reinterpret_cast<std::string*>(user_data);

   (void)call_DBus(proxy, NULL, &DBusCallback, reinterpret_cast<const char*>(user_data));

顺便说一句,我假设您正在删除或管理 std::string* 的内存,如果没有,您将缺少内存。

【讨论】:

    【解决方案2】:

    尝试在 gpointer 上使用 static_cast 而不是 reinterpret_cast。我没有收到警告,在我的情况下,它是一个不同的类而不是字符串,但我认为这不相关,就像这样:

    std::string * tmp = static_cast<std::string *>(user_data);
    

    【讨论】:

    • 您仍然会收到警告。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 2021-11-07
    • 2014-08-01
    • 2011-12-29
    相关资源
    最近更新 更多