0

我正在尝试对 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)] 基本原理 从指针转换为不相关类型的结果未指定。

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

4

2 回答 2

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* 的内存,如果没有,您将缺少内存。

于 2018-10-11T19:50:02.377 回答
-1

Try to use static_cast instead of reinterpret_cast on the gpointer. I didn't get the warning, in my case it was a different class and not string but I don't think this is relevant, like this:

std::string * tmp = static_cast<std::string *>(user_data);
于 2015-11-04T12:00:44.457 回答