| 1046 | |
| 1047 | |
| 1048 | DbgRef<DebuggerController> DebuggerController::GetController(BinaryViewRef data) |
| 1049 | { |
| 1050 | for (size_t i = 0; i < g_controllerCount; i++) |
| 1051 | { |
| 1052 | DebuggerController* controller = g_debuggerControllers[i]; |
| 1053 | if (!controller) |
| 1054 | continue; |
| 1055 | if (controller->m_file.operator==(data->GetFile())) |
| 1056 | return controller; |
| 1057 | } |
| 1058 | |
| 1059 | if (data->GetTypeName() == "Debugger") |
| 1060 | return nullptr; |
| 1061 | |
| 1062 | auto controller = new DebuggerController(data); |
| 1063 | g_debuggerControllers = (DbgRef<DebuggerController>*)realloc(g_debuggerControllers, |
| 1064 | sizeof(DbgRef<DebuggerController>) * (g_controllerCount + 1)); |
| 1065 | |
| 1066 | // We must call the DbgRef ctor on the newly allocated space explicitly. If we do a |
| 1067 | // g_debuggerControllers[g_controllerCount] = controller; |
| 1068 | // The `=` operator on the next line will cause a call to `DbgRef<T>& operator=(T* obj)` on an uninitialized DbgRef |
| 1069 | // object, leading to a crash when `DbgRef::m_obj` is de-referenced. |
| 1070 | // In fact, this is how std::vector does things inside `push_back`. |
| 1071 | new (&g_debuggerControllers[g_controllerCount]) DbgRef<DebuggerController>(controller); |
| 1072 | g_controllerCount++; |
| 1073 | return controller; |
| 1074 | } |
| 1075 | |
| 1076 | |
| 1077 | void DebuggerController::DeleteController(BinaryViewRef data) |
no test coverage detected