... | ... | @@ -92,82 +92,6 @@ enum EventIDs { |
|
|
EV_ID_2
|
|
|
}
|
|
|
```
|
|
|
|
|
|
Best Practices
|
|
|
-------------------
|
|
|
### Logging
|
|
|
|
|
|
Per il logger, date un'occhiata [Log.cpp](https://the.al/share/_/pqyewIt6b4r.txt)
|
|
|
e [Log.h](https://the.al/share/_/pWoTjUhaN.txt)
|
|
|
|
|
|
Di pro rispetto a quello di gabriele c'è che non usa ostream, il quale ha un peso non
|
|
|
indifferente sulla code size. L'idea sarebbe di riuscire a levare completamente
|
|
|
iostream e amici dalla code base.
|
|
|
|
|
|
Altro pro del mio, si usa con la sintassi della printf, che personalmente
|
|
|
trovo 100k volte più comoda degli operatori << e >>. (lo so, non si può fare
|
|
|
l'overload per altre classi... si può sempre creare un metodo toString() :P)
|
|
|
|
|
|
Ultimo pro, LOG_DEBUG(), LOG_INFO(), ... son piu' veloce da scrivere rispetto a
|
|
|
Logger::Logger::Antani\<Antani::lol::blabla\>().
|
|
|
|
|
|
### Debugging
|
|
|
|
|
|
Secondo me il modo migliore e fare una serie di macro in stile
|
|
|
|
|
|
```C++
|
|
|
#ifndef NDEBUG
|
|
|
#define DEB(x) x
|
|
|
#else
|
|
|
#define DEB(x)
|
|
|
#endif
|
|
|
```
|
|
|
|
|
|
da usare con `DEB(printf("..."))`
|
|
|
|
|
|
O comunque usare questo metodo per usare il logger (come scritto ieri su slack)
|
|
|
oppure per le assert. Tra l'altro son quasi sicuro che le assert non vengono
|
|
|
compilate se si usa -DNDEBUG.
|
|
|
|
|
|
Il problema di questo approccio e' che bisogna ricordarsi di non fare mai
|
|
|
init dentro le assert:
|
|
|
|
|
|
```cpp
|
|
|
assert( init_blabla(...) == true ); // non viene invocata init_blabla
|
|
|
// se NDEBUG e' definito.
|
|
|
```
|
|
|
|
|
|
|
|
|
### Error Handling
|
|
|
|
|
|
Per evitare inconsistenze, abbiamo fatto un csv con tutti i fault counters,
|
|
|
descriizoni e altro (apribile tranquillamente con excel) e lanciando
|
|
|
./sbs -g, questo csv viene convertito in un header file che viene incluso
|
|
|
nella cartella dei fault counter.
|
|
|
|
|
|
Durante la generazione il csv viene modificato; c'e 'Generated name' (colonna)
|
|
|
che viene impostata e non viene piu toccata se è gia scritta, questo implica
|
|
|
che se non vi piace un nome generato lo potete cambiare (todo: da verificare
|
|
|
se ho fatto veramente cosi lol)
|
|
|
|
|
|
|
|
|
|
|
|
### Assertions
|
|
|
|
|
|
A typical use of an assertion would be as follows:
|
|
|
```c
|
|
|
if (!c_assert(p >= 0) == true) {
|
|
|
return ERROR;
|
|
|
}
|
|
|
```
|
|
|
with the assertion defined as follows:
|
|
|
```c
|
|
|
#define c_assert(e) ((e) ? (true) : \
|
|
|
tst_debugging(”%s,%d: assertion ’%s’ failed\n”, \
|
|
|
__FILE__, __LINE__, #e), false)
|
|
|
```
|
|
|
|
|
|
|
|
|
What's Next
|
|
|
-------------
|
|
|
You will find more specific best practices in [Writing a Driver](../wiki/Writing-a-driver)
|
... | ... | |