1. Sebastian Kügler <sebas@kde.org>, FrOSCon 2006
Akademy-es 2016 – Madrid - Albert Astals Cid <aacid@kde.org> - @tsdgeos
Clazy
Clazy
mejorando tu código en tiempo de compilación
Albert Astals Cid
2. Sebastian Kügler <sebas@kde.org>, FrOSCon 2006
Akademy-es 2016 – Madrid - Albert Astals Cid <aacid@kde.org> - @tsdgeos
Clazy
¿Qué es clazy?
clazy es un analizador estático de código.
clazy es un plugin para clang.
clazy está centrado en Qt (aunque también tiene algún checker genérico)
clazy es un proyecto de KDE, herededo de krazy.
3. Sebastian Kügler <sebas@kde.org>, FrOSCon 2006
Akademy-es 2016 – Madrid - Albert Astals Cid <aacid@kde.org> - @tsdgeos
Clazy
¿Cómo uso clazy?
Ninguna distribución lo incluye
https://quickgit.kde.org/?p=clazy.git
Lo compiláis e instaláis
cmake . -DCMAKE_CXX_COMPILER=clazy
qmake -spec linux-clang QMAKE_CXX="clazy"
Y a compilar el código :)
4. Sebastian Kügler <sebas@kde.org>, FrOSCon 2006
Akademy-es 2016 – Madrid - Albert Astals Cid <aacid@kde.org> - @tsdgeos
Clazy
¿Cuantos checkers incluye?
12 de nivel 0 (stable, seguros, sin falsos positivos) (por defecto)
8 de nivel 1 (falso positivo excepcionalmente) (por defecto)
10 de nivel 2 (alrededor de 20% de falsos positivos) (bajo demanda)
4 de nivel 3 (alpha) (bajo demanda)
Fixit!
● Arregla el código directamente (bajo demanda)
● 3 de nivel 0
● 1 de nivel 1
● 2 de nivel 2
5. Sebastian Kügler <sebas@kde.org>, FrOSCon 2006
Akademy-es 2016 – Madrid - Albert Astals Cid <aacid@kde.org> - @tsdgeos
Clazy
container-anti-pattern
set.toList()[0]; // use set.constFirst() instead
hash.values().size(); // Use hash.size() instead
hash.keys().contains(); // Use hash.contains() instead
hash.values().contains(); // Use hash.find instead
map.values(k).foo ; // Use QMap::equal_range(k) instead
for (auto i : hash.values()) {} // Iterate the hash directly instead
QSet::intersect(other).isEmpty() // Use QSet::intersects() instead
6. Sebastian Kügler <sebas@kde.org>, FrOSCon 2006
Akademy-es 2016 – Madrid - Albert Astals Cid <aacid@kde.org> - @tsdgeos
Clazy
qstring-insensitive-allocation
if (str.toLower().contains("foo"))
deberia ser
if (str.contains("foo", Qt::CaseInsensitive))
Nota: en muy pocos casos es diferente si "foo" puede ser introducido por el usuario
quizás no quieres cambiarlo
7. Sebastian Kügler <sebas@kde.org>, FrOSCon 2006
Akademy-es 2016 – Madrid - Albert Astals Cid <aacid@kde.org> - @tsdgeos
Clazy
qstring-ref
1) s.mid(...).toInt(ok) -> s.midRef().toInt(ok)
Donde mid() puede ser: mid, left, right.
Y toInt() puede ser: compare, contains, count, startsWith, endsWith, indexOf,
isEmpty, isNull, lastIndexOf, length, size, to*, trimmed
FIXITS:
export CLAZY_FIXIT="fix-missing-qstringref"
8. Sebastian Kügler <sebas@kde.org>, FrOSCon 2006
Akademy-es 2016 – Madrid - Albert Astals Cid <aacid@kde.org> - @tsdgeos
Clazy
temporary-iterator
QList<type> getList()
{
QList<type> list;
// añadir algunos type a list
return list;
}
for ( auto it = getList().begin(); it != getList().end(); ++it )
{
...
}
9. Sebastian Kügler <sebas@kde.org>, FrOSCon 2006
Akademy-es 2016 – Madrid - Albert Astals Cid <aacid@kde.org> - @tsdgeos
Clazy
qstring-arg
QString a = "a";
QString b = "b";
QString c = QString("%1 %2").arg(a).arg(b);
// deberia ser
QString c = QString("%1 %2").arg(a, b);