SlideShare una empresa de Scribd logo
1 de 12
Descargar para leer sin conexión
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
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.
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 :)
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
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
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
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"
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 )
{
...
}
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);
Sebastian Kügler <sebas@kde.org>, FrOSCon 2006
Akademy-es 2016 – Madrid - Albert Astals Cid <aacid@kde.org> - @tsdgeos
Clazy
Más!
QMap<K*,T> a; → QHash<K*,T>
qgetenv → qEnvironmentVariable[IsSet|IsEmpty|IntValue]
qDeleteAll(hash/map/set.values() → qDeleteAll(hash/map/set)
QFileInfo(file).exists() → QFileInfo::exists(file)
QList<T> con sizeof(T) > sizeof(void*) → QVector<T>
Unused non-trivial (whitelist) Ejemplo Ejemplo2
Detaching of temporaries Ejemplo
QString → QStringLiteral, QLatin1String, etc
Sebastian Kügler <sebas@kde.org>, FrOSCon 2006
Akademy-es 2016 – Madrid - Albert Astals Cid <aacid@kde.org> - @tsdgeos
Clazy
Haciendo tu propio checker
Ejemplos:
 checks/qmapkey.cpp
 checks/qdeleteall.cpp
Sebastian Kügler <sebas@kde.org>, FrOSCon 2006
Akademy-es 2016 – Madrid - Albert Astals Cid <aacid@kde.org> - @tsdgeos
Clazy
¿Preguntas?

Más contenido relacionado

Más de kdeespana

Desarrollando software libre sin ser informático akademy es 2017
Desarrollando software libre sin ser informático akademy es 2017Desarrollando software libre sin ser informático akademy es 2017
Desarrollando software libre sin ser informático akademy es 2017kdeespana
 
Slimbook - Welcome to Freedom - Akademy-es 2017
Slimbook - Welcome to Freedom - Akademy-es 2017Slimbook - Welcome to Freedom - Akademy-es 2017
Slimbook - Welcome to Freedom - Akademy-es 2017kdeespana
 
KDE España: Qué es y para que sirve
KDE España: Qué es y para que sirve KDE España: Qué es y para que sirve
KDE España: Qué es y para que sirve kdeespana
 
Descubre plasma 5, el escritorio de la Comunidad KDE
Descubre plasma 5, el escritorio de la Comunidad KDEDescubre plasma 5, el escritorio de la Comunidad KDE
Descubre plasma 5, el escritorio de la Comunidad KDEkdeespana
 
La potencia del Terminal
La potencia del TerminalLa potencia del Terminal
La potencia del Terminalkdeespana
 
10 formas de colaborar akademy es 2016
10 formas de colaborar akademy es 201610 formas de colaborar akademy es 2016
10 formas de colaborar akademy es 2016kdeespana
 
Kool Desktop Environment
Kool Desktop EnvironmentKool Desktop Environment
Kool Desktop Environmentkdeespana
 
openQA y Open Build System
openQA y Open Build SystemopenQA y Open Build System
openQA y Open Build Systemkdeespana
 
KDE Frameworks, cuando Qt se nos queda corto
KDE Frameworks, cuando Qt se nos queda corto KDE Frameworks, cuando Qt se nos queda corto
KDE Frameworks, cuando Qt se nos queda corto kdeespana
 
Qt5 en distintas plataformas
Qt5 en distintas plataformasQt5 en distintas plataformas
Qt5 en distintas plataformaskdeespana
 
Next gen Desktop Apps
Next gen Desktop AppsNext gen Desktop Apps
Next gen Desktop Appskdeespana
 
KDE España: Qué es y para qué sirve
KDE España: Qué es y para qué sirveKDE España: Qué es y para qué sirve
KDE España: Qué es y para qué sirvekdeespana
 
KDE connect - Akademy-es 2014 por Albert Vaca
KDE connect - Akademy-es 2014 por Albert VacaKDE connect - Akademy-es 2014 por Albert Vaca
KDE connect - Akademy-es 2014 por Albert Vacakdeespana
 
Next gen-apps
Next gen-appsNext gen-apps
Next gen-appskdeespana
 
Kde experience - Akademy-es 2014
Kde experience - Akademy-es 2014Kde experience - Akademy-es 2014
Kde experience - Akademy-es 2014kdeespana
 
Baloo - Akademy-es 2014
Baloo - Akademy-es 2014Baloo - Akademy-es 2014
Baloo - Akademy-es 2014kdeespana
 
Es el momento de KDE - Akademy-es 2014
Es el momento de KDE - Akademy-es 2014Es el momento de KDE - Akademy-es 2014
Es el momento de KDE - Akademy-es 2014kdeespana
 
ASAN Un debugger de memoria en tu compilador - Akademy-es 2014
ASAN Un debugger de memoria en tu compilador - Akademy-es 2014ASAN Un debugger de memoria en tu compilador - Akademy-es 2014
ASAN Un debugger de memoria en tu compilador - Akademy-es 2014kdeespana
 
Mi momento kde Akademy-es 2014
Mi momento kde Akademy-es 2014Mi momento kde Akademy-es 2014
Mi momento kde Akademy-es 2014kdeespana
 

Más de kdeespana (20)

Desarrollando software libre sin ser informático akademy es 2017
Desarrollando software libre sin ser informático akademy es 2017Desarrollando software libre sin ser informático akademy es 2017
Desarrollando software libre sin ser informático akademy es 2017
 
Slimbook - Welcome to Freedom - Akademy-es 2017
Slimbook - Welcome to Freedom - Akademy-es 2017Slimbook - Welcome to Freedom - Akademy-es 2017
Slimbook - Welcome to Freedom - Akademy-es 2017
 
KDE España: Qué es y para que sirve
KDE España: Qué es y para que sirve KDE España: Qué es y para que sirve
KDE España: Qué es y para que sirve
 
Descubre plasma 5, el escritorio de la Comunidad KDE
Descubre plasma 5, el escritorio de la Comunidad KDEDescubre plasma 5, el escritorio de la Comunidad KDE
Descubre plasma 5, el escritorio de la Comunidad KDE
 
La potencia del Terminal
La potencia del TerminalLa potencia del Terminal
La potencia del Terminal
 
10 formas de colaborar akademy es 2016
10 formas de colaborar akademy es 201610 formas de colaborar akademy es 2016
10 formas de colaborar akademy es 2016
 
Kool Desktop Environment
Kool Desktop EnvironmentKool Desktop Environment
Kool Desktop Environment
 
openQA y Open Build System
openQA y Open Build SystemopenQA y Open Build System
openQA y Open Build System
 
Plasma Next
Plasma NextPlasma Next
Plasma Next
 
KDE Frameworks, cuando Qt se nos queda corto
KDE Frameworks, cuando Qt se nos queda corto KDE Frameworks, cuando Qt se nos queda corto
KDE Frameworks, cuando Qt se nos queda corto
 
Qt5 en distintas plataformas
Qt5 en distintas plataformasQt5 en distintas plataformas
Qt5 en distintas plataformas
 
Next gen Desktop Apps
Next gen Desktop AppsNext gen Desktop Apps
Next gen Desktop Apps
 
KDE España: Qué es y para qué sirve
KDE España: Qué es y para qué sirveKDE España: Qué es y para qué sirve
KDE España: Qué es y para qué sirve
 
KDE connect - Akademy-es 2014 por Albert Vaca
KDE connect - Akademy-es 2014 por Albert VacaKDE connect - Akademy-es 2014 por Albert Vaca
KDE connect - Akademy-es 2014 por Albert Vaca
 
Next gen-apps
Next gen-appsNext gen-apps
Next gen-apps
 
Kde experience - Akademy-es 2014
Kde experience - Akademy-es 2014Kde experience - Akademy-es 2014
Kde experience - Akademy-es 2014
 
Baloo - Akademy-es 2014
Baloo - Akademy-es 2014Baloo - Akademy-es 2014
Baloo - Akademy-es 2014
 
Es el momento de KDE - Akademy-es 2014
Es el momento de KDE - Akademy-es 2014Es el momento de KDE - Akademy-es 2014
Es el momento de KDE - Akademy-es 2014
 
ASAN Un debugger de memoria en tu compilador - Akademy-es 2014
ASAN Un debugger de memoria en tu compilador - Akademy-es 2014ASAN Un debugger de memoria en tu compilador - Akademy-es 2014
ASAN Un debugger de memoria en tu compilador - Akademy-es 2014
 
Mi momento kde Akademy-es 2014
Mi momento kde Akademy-es 2014Mi momento kde Akademy-es 2014
Mi momento kde Akademy-es 2014
 

Mejorando tu código con Clazy

  • 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);
  • 10. Sebastian Kügler <sebas@kde.org>, FrOSCon 2006 Akademy-es 2016 – Madrid - Albert Astals Cid <aacid@kde.org> - @tsdgeos Clazy Más! QMap<K*,T> a; → QHash<K*,T> qgetenv → qEnvironmentVariable[IsSet|IsEmpty|IntValue] qDeleteAll(hash/map/set.values() → qDeleteAll(hash/map/set) QFileInfo(file).exists() → QFileInfo::exists(file) QList<T> con sizeof(T) > sizeof(void*) → QVector<T> Unused non-trivial (whitelist) Ejemplo Ejemplo2 Detaching of temporaries Ejemplo QString → QStringLiteral, QLatin1String, etc
  • 11. Sebastian Kügler <sebas@kde.org>, FrOSCon 2006 Akademy-es 2016 – Madrid - Albert Astals Cid <aacid@kde.org> - @tsdgeos Clazy Haciendo tu propio checker Ejemplos:  checks/qmapkey.cpp  checks/qdeleteall.cpp
  • 12. Sebastian Kügler <sebas@kde.org>, FrOSCon 2006 Akademy-es 2016 – Madrid - Albert Astals Cid <aacid@kde.org> - @tsdgeos Clazy ¿Preguntas?