Polyspace (Mathworks) for static code analysis
-
wrote on 21 Feb 2012, 11:43 last edited by
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>()){
@ -
wrote on 22 Feb 2012, 00:47 last edited by
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. -
wrote on 22 Feb 2012, 15:56 last edited by
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); }@ -
wrote on 23 Jul 2012, 08:42 last edited by
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.
-