IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Outils Discussion :

Sortie de Clazy 1.5


Sujet :

Outils

  1. #1
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 591
    Points
    188 591
    Par défaut Sortie de Clazy 1.5
    Clazy est un outil d’analyse statique prévu spécifiquement pour Qt. Ses versions précédentes ont déjà permis d’inciter les développeurs à suivre moult meilleures pratiques, mais ne se sont pas encore attaquées aux signaux, slots et connexions : Clazy 1.3 vient combler ce manque.

    Un premier cas géré est celui où quelque chose qui n’est pas un signal est pourtant connecté comme s’il en était un. Cependant, sans Clazy, un code comme celui-ci compilerait sans problème, puisqu’il n’y a pas d’erreur de syntaxe C++ — juste une erreur de sémantique Qt.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    // warning: MyObj::mySlot is not a signal [-Wclazy-connect-non-signal]
    connect(obj, &MyObj::mySlot, &MyObj::mySlot2);
    Une variable locale ne peut pas être capturée dans une fonction anonyme si elle est utilisée dans une connexion : en effet, quand le signal correspondant sera appelé, le contexte courant sera probablement détruit… et le code plantera lamentablement.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    void myFunction() {
        int localVar = ...;
     
        // program will crash when signal is emitted!
        connect(m_object, &MyObj::mySignal, [&localVar] { ... }); 
    }
    La forme de connect() avec trois arguments ne devrait pas être utilisée, puisque celle avec un argument de contexte permet d’effectuer certaines vérifications à l’exécution et donc d’éviter certains plantages (dans l’exemple suivant, si m_receiver est supprimé).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    connect(m_widget, &MyWidget::textChanged, [this] (const QString &text) {
        m_receiver->update(text, false);
    });
    connect(m_widget, &MyWidget::textChanged, m_receiver,
            [this] (const QString &text) { (....) });
    Qt::UniqueConnection ne peut pas être garanti quand le receveur du signal est un foncteur, une fonction anonyme ou une fonction globale, mais aucun avertissement ne peut être généré par le compilateur, d’où l’apport de Clazy.

    Ajouter des slots dans une classe qui hérite de QThread n’est pas forcément un problème en soi, mais est souvent un signe de code mal conçu : en effet, ces slots sont exécutés dans le fil d’exécution correspondant à l’objet QThread, mais pas dans le fil QThread. Il vaut souvent mieux utiliser des objets travailleurs.

    Toute utilisation de l’ancienne syntaxe avec SIGNAL() et SLOT() est aussi signalée : en effet, elle ne permet pas au compilateur d’effectuer beaucoup de vérifications, contrairement à celle utilisant des pointeurs vers des fonctions membres.

    Si certains types ne sont pas normalisés avec les macros SIGNAL(), SLOT(), Q_ARG() ou Q_RETURN_ARG(), quelques allocations de mémoire inutiles sont effectuées.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    // warning: Signature is not normalized. Use void mySlot(int) instead of void mySlot(const int) [-Wclazy-connect-not-normalized]
    o.connect(&o, SIGNAL(mySignal(int, int)),
              &o, SLOT(void mySlot(const int)));
    Les API surchargeant les signaux d’une classe de base sont souvent difficiles à utiliser et causent des défauts difficiles à trouver. De plus, syntaxiquement, Qt permet de surcharger un signal avec une méthode qui n’en est pas un et vice-versa. Clazy signale tous ces cas, ainsi que ceux où un signal est marqué comme virtuel (moc affichait déjà un avertissement à l’exécution dans ces cas).

    Souvent, un slot n’est pas une méthode constante (comme pourrait l’être un accesseur). Un signal n’a pas besoin d’être marqué comme constant. Ces cas arrivent cependant fréquemment lors d’une interaction avec du code QML, mais il vaut mieux utiliser Q_PROPERTY ou Q_INVOKABLE qu’un slot.

    Pour des raisons de lisibilité, les signaux devraient toujours être émis avec le mot clé emit (ou la macro Q_EMIT), non comme de simples méthodes. De même, ces mot clé et macro ne devraient être utilisés qu’avec des signaux.

    Les connexions par nom sont une vieille fonctionnalité, qui n’a jamais été très populaire et ne devrait plus être utilisée. De fait, simplement renommer un objet pourrait casser des connexions — ces constructions sont donc extrêmement fragiles. La nouvelle syntaxe de connexion rend les choses explicites à la compilation.

    Les propriétés Q_PROPERTY non constantes devraient toujours avoir une méthode NOTIFY, pour prévenir de tout changement de valeur. Bien que les utilisations de ces méthodes ne se soient réellement popularisées que depuis QML, n’importe qui pourrait en avoir besoin — GammaRay, par exemple.

    Source : Nailing 13 signal and slot mistakes with clazy 1.3.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  2. #2
    Membre éclairé Avatar de Matthieu76
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2013
    Messages
    568
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2013
    Messages : 568
    Points : 890
    Points
    890
    Par défaut
    Qt est vraiment très bien, il évolue souvent et il y a sans cesse de nouvelles versions, ajouts et correctifs. De plus Qt a une grande communauté.
    Je considère quasiment Qt comme un language à part entier.

    Je ne m'y connais pas beaucoup en framework C++ mais je trouve qu’actuellement c'est la seule alternative viable à Microsoft Visual Studio.

  3. #3
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 618
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 618
    Points : 188 591
    Points
    188 591
    Par défaut Sortie de Clazy 1.5
    L'outil d'analyse statique pour Qt, Clazy, est arrivé en version 1.5. Celle-ci détecte trois nouveaux cas potentiellement problématiques. Tout d'abord, les types Qt Quick enregistrés avec
    qmlRegisterType ou qmlRegisterUncreatableType qui ne commencent pas par une capitale sont signalés — puisqu'ils ne sont pas utilisables avec le moteur QML.
    Dans les gardes d'inclusion et autres constructions mêlant #ifndef et #define, une typo est vite arrivée. Clazy détecte maintenant quand les noms indiqués ne correspondent pas, mais uniquement s'ils sont assez proches. Malgré cette précaution, ce test peut générer un grand nombre de faux positifs et est donc désactivé par défaut (ce qui n'est pas forcément une bonne idée, puisqu'il a permis de trouver un défaut dans le code source de Qt).
    La troisième détection concerne le marqueur [[nodiscard]], apporté par C++17. Il sert à indiquer que le résultat de l'appel d'une fonction ne devrait pas être ignoré. Pour la compatibilité entre compilateurs, Qt définit la constante Q_REQUIRED_RESULT. Clazy utilise comme critères le caractère constant des fonctions, notamment celles qui retournent un type de la classe dans laquelle ces méthodes sont définies.
    Source : Clazy 1.5 released.
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

Discussions similaires

  1. Réponses: 16
    Dernier message: 18/07/2003, 17h16
  2. Comment rediriger la sortie vers /dev/null
    Par dclink dans le forum C
    Réponses: 4
    Dernier message: 24/06/2003, 18h23
  3. [LG]Entrées et sorties redirigée
    Par Lady dans le forum Langage
    Réponses: 17
    Dernier message: 10/05/2003, 18h33
  4. Rediriger le plux de sortie
    Par Groove dans le forum C
    Réponses: 5
    Dernier message: 17/04/2003, 17h16
  5. récupérer la valeur de sortie d'un thread
    Par jakouz dans le forum Langage
    Réponses: 3
    Dernier message: 31/07/2002, 11h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo