new char[1024] manualmente. Si se lanza una excepción entre el constructor y el destructor, habrá memory leak. Viola RAII.fclose(file_) se llama sin verificar si fopen retornó nullptr. En sistemas IoT con disco lleno esto ocurre con frecuencia, causando crash por undefined behavior.strcpy(buffer_, name) con un buffer de 1024 bytes no tiene protección. El nombre de dispositivo pasado en main supera los 50 caracteres, y en producción puede venir de red (>1 KB).printf(msg) y fprintf(file_, msg) con input controlado por el usuario permiten ataques de format string: lectura/escritura arbitraria de memoria. CWE-134.fwrite lanza una excepción (o se añade código entre lock/unlock), el mutex queda bloqueado permanentemente. Usar std::lock_guard con std::mutex es la solución RAII.malloc no llama constructores, no es type-safe y su pareja free no aparece en ningún lado. Combinar con delete es undefined behavior.join() ni detach(). Destruir un std::thread joinable sin join/detach llama a std::terminate(). El nodo IoT crashea.running_ es un bool normal leído desde el hilo worker y escrito desde el hilo principal sin sincronización. Comportamiento indefinido según el memory model de C++11.float* al interior del buffer rompe la encapsulación y permite al llamador escribir fuera de límites o retener un puntero inválido.argv[2] se interpola directamente en un comando de shell via sprintf + system(). Un atacante puede pasar "; rm -rf /" para ejecutar código arbitrario en el nodo IoT. CWE-78.argv[1] o argv[2] es nullptr. El crash en producción dejaría el nodo sin logging.new SensorReader(42) nunca se libera. En un daemon de larga duración, las reinicios parciales acumulan leaks.