2014-05-15 15 views
0

我试图做一些代码MISRA投诉,我有如下一段代码:对象指针类型“gpointer”投给无关的类型“字符串*”

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))); 

//最后PRAM是从回调

它编译并运行正常中的用户数据,但我有以下MISRA的字符串转换,从gpointer警告: MISRA.CAST.PTR.UNRELATED:指针类型'gpointer'的对象转换为无关类型'字符串*'

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

任何想法,以避免此警告?

+0

你确定它工作正常?什么是'gpointer'?我看不出它是如何工作的,除非它是一个指向'std :: string'的指针。 – juanchopanza

+0

是的,它的工作原理。我创建了新的std :: string,将其转换为void *,然后在回调函数中再次转换为std :: string。 Gpointer是:typedef void * gpointer; – user3458705

+2

那么,MISRA旨在阻止你做这样的事情。因此,摆脱警告的最好方法是确保您始终具有相同的正确类型。此外,MISRA也禁止函数指针,所以你不能执行'&DBusCallback' ... – Lindydancer

回答

-1

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

std::string * tmp = static_cast<std::string *>(user_data); 
相关问题