指针类型'gpointer'的对象强制转换为不相关的类型'string *'

时间:2014-05-15 13:56:47

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

我试图制作一些代码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)));

// last pram是回调中的user_data

它编译并运行正常,但我在gpointer的字符串转换时发出以下MISRA警告: MISRA.CAST.PTR.UNRELATED:指针类型的对象&#39; gpointer&#39;转换为不相关的类型&#39;字符串*&#39;

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

有什么想法可以避免这种警告吗?

2 个答案:

答案 0 :(得分:0)

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 *的内存,否则,您将缺少内存。

答案 1 :(得分:-1)

尝试在gpointer上使用static_cast代替reinterpret_cast。我没有得到警告,在我的情况下,它是一个不同的类而不是字符串,但我不认为这是相关的,如下所示:

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