我正在尝试进行一些代码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)));//最后一个pram是回调中的user_data
它编译并运行正常,但在从gpointer进行字符串转换时出现以下MISRA警告: MISRA.CAST.PTR.UNRELATED :指针类型为'gpointer‘的对象转换为不相关的类型' string *’
规则是: MISRA-C++规则5-2-7 (必需):指针类型的对象不能直接或间接转换成不相关的指针类型。未指定5.2.10(7)原理从指针转换为不相关类型的结果未指定。
有什么办法可以避免这个警告吗?
发布于 2018-10-12 03:50:02
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*的内存,如果不是这样,你就会缺乏内存。
发布于 2015-11-04 20:00:44
尝试在gpointer上使用static_cast而不是reinterpret_cast。我没有收到警告,在我的例子中,它是一个不同的类,而不是string,但我不认为这是相关的,如下所示:
std::string * tmp = static_cast<std::string *>(user_data);https://stackoverflow.com/questions/23680400
复制相似问题