Forum Programmation.c++ Tiled pour CatchChallenger

Posté par  (site web personnel) . Licence CC By‑SA.
Étiquettes : aucune
2
29
fév.
2024

Bonjour,
J'ai besoin d'un coup de main pour actualiser la lib tiled sur CatchChallenger (open source, creer en 2011, on est a la 3eme version), je manque de temps, j'ai viré la lib tiled embeded de 2011 et je link sur la de debian 12, je pense avoir bien corrigé tout les problèmes de compilation, mais:
- https://github.com/alphaonex86/CatchChallenger/blob/master/tools/map2png/map2png.cpp#L823 l'activation de ces lignes fait un crash (et actuellement les bots ne sont pas sur le nouveau layer généré donc au mauvais niveau)
- https://github.com/alphaonex86/CatchChallenger/blob/master/client/qtopengl/catchchallenger-qtopengl.pro le client principal ne centre plus la vu sur le joueur (et il y as peu être d'autre bug graphique lié a tiled)
Si quelqu'un se motive ca aiderai fortement le projet un coup de main sur la partie tiled
Il y as eu pas mal d'avancé ces dernières années, je ferai peu être une news compléte. Modularisation et API, nettoyage, …

  • # manque de précision

    Posté par  . Évalué à 4. Dernière modification le 01 mars 2024 à 13:14.

    -> l'activation de ces lignes fait un crash

    sans message c'est pas clair, segmentation fault ? une exception qui est lancée et non gérée ? un dépassement de pile ? Ça crash au niveau de ces lignes ? Ça crache plus loin?

    que dit valgrind sur le code ? (oui c'est lent)

    je remarque par ailleurs que l'objet est initialisé à NULL dans le constructeur, mais comparé setté et comparé nullptr, ça ne devrait pas avoir d'impact, mais faudrait changer ça.

    Et que dit une compilation avec -Wall, souvent ça donne de belle pistes.

    Il ne faut pas décorner les boeufs avant d'avoir semé le vent

    • [^] # Re: manque de précision

      Posté par  . Évalué à 4.

      J'ajouterai que y'a des potentialité de fuite la ligne 854 fait un return sans avoir libéré l'objet temporaire, et de ce que je lis de la ligne commenté du dessus ne doit pas avoir de destructeur décent

      Utiliser un scope_ptr ou uniq_ptr me semble bien plus adapté; quitte à le release au moment de l'affecter au tableau; ça simplifie la gestion des erreurs

      Porter tout ce code en C++11 risque d'être compliqué, mais le faire pour les partie qui plantent me semblent pas une mauvaise idée.

      la encore j'ai une fuite potentielle :

      Map_full *tempMapObjectFull=new Map_full();

      le pointeur est perdu
      sauf si Map2Png::layerChangeLevelAndTagsChange(tempMapObjectFull,hideTheDoors);
      prend la possession du pointeur, mais sémantiquement y'a rien qui l'indique et à première vue, ce n'est pas le cas.

      je remarque aussi que Map2Png::~Map2Png() est intégralement commenté, si y'a des soucis lors des delete, c'est pas les commenter qui va corriger le problème, ça veut dire

      1) qu'on accède a des donnée qui ont déjà été détruite (dans le destructeur, double free)
      2) qu'on accède a des données qui ont déjà été détruite (après le passage du destructeur problème d'ownership)

      dans le vieux code 1 new -> (au moins 1) delete, si ce n'est pas le cas donner un commentaire pour l'expliquer.

      Il ne faut pas décorner les boeufs avant d'avoir semé le vent

      • [^] # Re: manque de précision

        Posté par  (site web personnel) . Évalué à 2. Dernière modification le 02 mars 2024 à 13:56.

        Ne maîtrisant pas scope_ptr ou uniq_ptr j'ai préféré évité utiliser pour ne pas mal l'utiliser.

        Le code devrai pouvoir être compiler en --std=c++17, mais j'ai pas changer le code pour rester compatible avec les compilateurs c++11 (MIPS oblige).

        La lib tiled prennais pas mal possession des pointeurs, et perdre quelque pointeur (memleak) dans ce code n'as pas d'importance (génération de preview et fermeture du processus).

        Map2Png::~Map2Png() -> commenter car tiled delete lui même et cela fesais un double free.

        Mon projet libre: http://ultracopier-fr.first-world.info/, mon jeu libre: http://catchchallenger.first-world.info/

        • [^] # Re: manque de précision

          Posté par  . Évalué à 4.

          commenter car tiled delete lui même et cela fesais un double free.

          et

          Ne maîtrisant pas scope_ptr ou uniq_ptr j'ai préféré évité utiliser pour ne pas mal l'utiliser.

          C'est tout le problème les scoped et uniq servent justement :

          1) a expliciter la porté d'un pointeur et qui le possède
          2) gérer la libération (delete) des pointeurs.

          Dans le code j'ai vu pas mal de delete commenté, au moins un autre oublié, des destructeurs d'objets contenant des pointeurs null sans destructeurs.

          La lib tiled prennais pas mal possession des pointeurs, et perdre quelque pointeur (memleak) dans ce code n'as pas d'importance (génération de preview et fermeture du processus).

          si la lib prends l'ownership des pointeurs c'est à elle de gérer la libération; mais une fuite mémoire n'est en aucun cas 'sans importance' dans un projet perenne. ça complique la compréhension.

          pour que valgrind donne des information plus pertinentes, il faut compiler avec -g

          Il ne faut pas décorner les boeufs avant d'avoir semé le vent

          • [^] # Re: manque de précision

            Posté par  (site web personnel) . Évalué à 2. Dernière modification le 03 mars 2024 à 01:24.

            Hélas je n'ai plus de temps d'apprendre.

            Le projet est déjà compiler avec -g mais pas le système.

            Mon projet libre: http://ultracopier-fr.first-world.info/, mon jeu libre: http://catchchallenger.first-world.info/

    • [^] # Re: manque de précision

      Posté par  (site web personnel) . Évalué à 2. Dernière modification le 02 mars 2024 à 13:47.

      SEGFAULT, objGrou->removeObject(objects.at(index2));

      Valgrind ne me donne pas d'info utile:
      host stacktrace:
      ==1310747== at 0x580429AA: show_sched_status_wrk (m_libcassert.c:406)
      ==1310747== by 0x58042AC7: report_and_quit (m_libcassert.c:477)
      ==1310747== by 0x58042C57: vgPlain_assert_fail (m_libcassert.c:543)
      ==1310747== by 0x5804C708: get_bszB_as_is (m_mallocfree.c:303)
      ==1310747== by 0x5804C708: is_inuse_block (m_mallocfree.c:331)
      ==1310747== by 0x5804C708: vgPlain_describe_arena_addr (m_mallocfree.c:1604)
      ==1310747== by 0x5803B31A: vgPlain_describe_addr (m_addrinfo.c:185)
      ==1310747== by 0x58039A1E: vgMemCheck_update_Error_extra (mc_errors.c:1185)
      ==1310747== by 0x5803E1F5: vgPlain_maybe_record_error (m_errormgr.c:822)
      ==1310747== by 0x58038CF8: vgMemCheck_record_address_error (mc_errors.c:765)
      ==1310747== by 0x5800F063: mc_LOADVn_slow (mc_main.c:1557)
      ==1310747== by 0x1004A3B1D4: ???
      ==1310747== by 0x10038C6F2F: ???
      ==1310747== by 0x10038C6F17: ???
      ==1310747== by 0x10038C6F2F: ???
      ==1310747== by 0x1C0F: ???
      ==1310747== by 0x100200833F: ???

      sched status:
        running_tid=1
      
      Thread 1: status = VgTs_Runnable (lwpid 1310747)
      ==1310747==    at 0x484A354: memmove (vg_replace_strmem.c:1382)
      ==1310747==    by 0x5885948: QListData::remove(int) (in /usr/lib/x86_64-linux-gnu/libQt5Core.so.5.15.8)
      ==1310747==    by 0x48E50B8: Tiled::ObjectGroup::removeObjectAt(int) (in /usr/lib/x86_64-linux-gnu/libtiled.so.1.0.0)
      ==1310747==    by 0x48E511B: Tiled::ObjectGroup::removeObject(Tiled::MapObject*) (in /usr/lib/x86_64-linux-gnu/libtiled.so.1.0.0)
      ==1310747==    by 0x314851: Map2Png::loadOtherMap(QString const&) (map2png.cpp:805)
      ==1310747==    by 0x317650: Map2Png::viewMap(bool const&, QString const&, QString const&) (map2png.cpp:1006)
      ==1310747==    by 0x29EA1C: main (main.cpp:249)
      client stack range: [0x1FFEFF6000 0x1FFF000FFF] client SP: 0x1FFEFFF438
      valgrind stack range: [0x10037C7000 0x10038C6FFF] top usage: 18792 of 1048576
      

      Wall -> rien, tout est clean en Warning, NULL<>nullptr aucun changement…

      Mon projet libre: http://ultracopier-fr.first-world.info/, mon jeu libre: http://catchchallenger.first-world.info/

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.