我试图制作一些代码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)] 合理 未指定从指针转换为不相关类型的结果。
有什么想法可以避免这种警告吗?
答案 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);