2013-04-03 11 views
8

Sto progettando un sistema in C/C++ che è estendibile con tutti i tipi di plugin. Esiste una API pubblica C ben definita che funziona principalmente con (const) char* e altri tipi di puntatore. I plug-in sono compilati in file .so o .dll e l'applicazione principale li carica all'avvio e successivamente li scarica o li ricarica su richiesta.Plugin in esecuzione in una sandbox

I plugin possono venire in da varie fonti, affidabili o non così :)

Ora, vorrei fare in modo che, se un plug-in fa qualcosa di stupido (come tenta di liberare una memoria che è stato non dovrebbe liberare), questa azione non abbatte l'intero sistema, ma si limita a notare il sistema principale relativo al plug-in non funzionante per rimuoverlo dalla coda.

Il codice chiamate sono stato fatto nel modo seguente:

const char* data = get_my_data(); 
for(int i = 0; i<plugins; i++) 
{ 
    plugins[i]->execute(data); 
} 

ma se plugin[0] frees "per caso" la stringa di dati o sovrascrive o per errore salti per affrontare 0x0 questo avrebbe portato l'intero sistema e io non voglio questo Come posso evitare questo tipo di catastrofe. (Lo so, posso duplicare la stringa data ... questo non risolve il mio problema :))

+0

La mia risposta ti ha aiutato a risolvere questo? Se è così, ti preghiamo di accettarlo come risposta corretta. –

risposta

12

Creare un processo di wrapper per plugin e comunicare con tale wrapper tramite IPC. In caso di errore del plug-in, il processo principale non verrebbe modificato

0

In poche parole, non è possibile farlo nello stesso processo. Se i plugin sono scritti in C o C++, possono contenere numerose fonti di comportamento non definito, ovvero fonti di arresti inevitabili non rilevabili. Quindi dovresti avviare i plugin nei loro processi come suggerito da kassak e lasciarli andare in crash se lo desiderano, o usare un altro linguaggio per i tuoi plugin, ad es. un linguaggio di scripting interpretato come lua.

-1

Dai un'occhiata alla http://msdn.microsoft.com/en-us/library/1deeycx5(v=vs.90).aspx

io uso/EHA in uno dei miei progetti per aiutarmi a intercettare le eccezioni da librerie che fanno stupide cose. Se si compila il codice con questa impostazione, un normale blocco di prova rileverà eccezioni come deviazione per zero, ecc.

Non so se ci sia un equivalente per questo su Linux - per favore fatemi sapere se c'è ..

Problemi correlati