Я пытаюсь сделать код жалобы 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)]
обоснование
Результат преобразования из указателя в несвязанный тип не определен.
Есть идеи, чтобы избежать этого предупреждения?
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 *, если нет, вам не хватит памяти.
Попробуй использовать static_cast
вместо reinterpret_cast
на gpointer. Я не получил предупреждение, в моем случае это был другой класс, а не строка, но я не думаю, что это уместно, например:
std::string * tmp = static_cast<std::string *>(user_data);