【发布时间】: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 也禁止函数指针,所以你也不能做
&DBusCallback... -
@user3458705 它适用于您的特定实现,但不能保证在另一个编译器甚至您的新版本上。这就是 unspecified 的意思,但如果您不想接受 Lindydancer 的建议,则需要创建偏差并记录您的理由。
标签: c++ pointers type-conversion reinterpret-cast misra