2.3 KiB
Contributing
This page shows some hints about the coding conventions. Disclaimer: It is a work and progress and we will provide soon a fully documented API.
Coding advices
CutterCore class
This is the main class where every link with r2 is made. It is unique accross the whole process. To access it, simply call Core()
.
Example:
Core()->getOffset();
Calling a radare2 command
There are two ways to do it:
CutterCore::cmd()
(Discouraged) Only use it for commands which yells no outputCutterCore::cmdj()
To be used with json commands likecmdj("agj")
orcmdj("aflj")
. It is way easier to parse a json output.
Example:
QJsonArray array = Core()->cmdj("pdj 1 @ main").array();
Seek the current file
To modify radare2 seek use CutterCore::seek(const RVA offset)
. This is important because it will emit a CutterCore::seekChanged(RVA offset)
signal.
Never ever call cmd("s offset")
;
Example:
Core()->seek(0xdeadbeef);
Creating a widget
Make sure to connect the CutterCore::seekChanged(RVA offset)
signal so your widget refreshes its output when radare2 seek is modified (switching to another function, etc.).
General coding guidelines
Coding style
We follow these guidelines to format the code. If in doubt, you can use AStyle 2.06 to format the code. The command line for formatting the code according to the style is:
astyle --project=src/Cutter.astylerc src/filename.cpp
Loops
We use C++11 foreach loop style which means any "foreach" loop should look like:
for (QJsonValue value : importsArray) {
doSomething(value);
}
Nullptr
Please do not use 0
nor Q_NULLPTR
, only use nullptr
.
Example:
QObject *object = nullptr;
Connecting signals
To connect a signal to a slot, this is the preferred way to do it:
connect(sender, &QObject::destroyed, this, &MyObject::objectDestroyed);
The main reason is that this syntax allows the use of lambda functions.
Functions documentation
It's good to add some documentation to your functions when needed. To do so we follow these rules.