Polyspace (Mathworks) for static code analysis
-
Has anyone successfully used Polyspace (for static code analysis) with their -QT- Qt project? Ive encountered a few difficulties with the configuration. Im currently getting a compilation error related with -QT- Qt's foreach statement which stops the analysis. Any hints would be really appreciated!
Here's the error Im getting:
@
Limitation: A compound statement cannot be used where an expression is expected
| (e.g.: #define maxint(a,b) ({int _a = (a), _b = (b); _a > _b ? _a : _b; }))
| (use : #define max(a,b) ((a) > (b) ? (a) : (b))).
|This construction is not supported by PolySpace Verifier.
|The computation has been halted.
@
for the code:
@
Q_FOREACH(infoVariant, response.value<QVariantList>()){
@ -
You could probably trick it into reading something different, with the goal to make the result digestible for the tool (even if it's not functional code). Something like #undef Q_FOREACH and
#define Q_FOREACH(variable, container) for (variable;;) might already be sufficient. -
Polyspace for C++ does not accept actually GNU extension compound statement expressions.
Replace your macro @#define maxint(a,b) ({int _a = (a), _b = (b); _a > _b ? _a : _b; })@ by an inline function:
@inline int maxint(int a, int b) {int _a = (a), _b = (b); return (_a > _b ? _a : _b); }@ -
Facing the limitation when using Q_FOREACH MACRO and a Qt gnu compiler (Q_CC_GNU), it could be possible to replace the MACRO by another:
-
Copy from QtCore/qglobal.h in the configuration file folder
and rename it mygglobal.h -
Search for the MACRO Q_FOREACH around line 2244 and replace it with MACRO (use flag of compilation to encapsulate new MACRO definition):
@#define Q_FOREACH(variable, container)
QForeachContainer<typeof(container)> container(container);
for (variable = *container.i;
!container.brk && container.i != container.e;
++container.i)@ -
Relaunch using -include myqglobal.h. Note that it does not work if Q_FOREACH MACRO is used more than one time in same statement.
-