Объект указателя типа gpointer приведен к несвязанному типу string *

Я пытаюсь сделать код жалобы 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 от обратного вызова

Он компилируется и работает нормально, но у меня есть следующее предупреждение MISRA при преобразовании строки из gpointer:
MISRA.CAST.PTR.UNRELATED: Объект указателя типа «gpointer» приведен к несвязанному типу «string *»

Правило таково:
MISRA-C ++ Правило 5-2-7 (обязательно): объект с типом указателя не должен быть преобразован в несвязанный тип указателя, ни прямо, ни косвенно.
[Не указано 5.2.10 (7)] обоснование
Результат преобразования из указателя в несвязанный тип не определен.

Есть идеи, чтобы избежать этого предупреждения?

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 *, если нет, вам не хватит памяти.

0

Другие решения

Попробуй использовать static_cast вместо reinterpret_cast на gpointer. Я не получил предупреждение, в моем случае это был другой класс, а не строка, но я не думаю, что это уместно, например:

std::string * tmp = static_cast<std::string *>(user_data);
-1

По вопросам рекламы [email protected]