Partage
  • Partager sur Facebook
  • Partager sur Twitter

Changement de valeurs non voulue

13 février 2019 à 23:26:12

Sans l'utilisation des références au pointeur, le code ne fonctionnait pas et avait un UB.

En passant le pointeur par référence, cela a résolu le problème

  • Partager sur Facebook
  • Partager sur Twitter
13 février 2019 à 23:37:47

Dans le premier code de tenn004, ces paramètres étaient immuables et donc il n'etait pas nécessaire de les passer par référence. C'est toi qui a introduit ce nouveau problème. Et tu as choisis une mauvaise solution (mélange de references et pointeurs) pour résoudre ce problème. Rien de correct là dedans.
  • Partager sur Facebook
  • Partager sur Twitter
13 février 2019 à 23:39:12

Voici le résultat de ton code Yes,man:

problème
0test sur n : 0


Lecture de A quand on est dans la fonction lectura
jacobi
Lecture de A quand on est dans la fonction jacobi

x0= 
on commence la boucle sur l
x=
AddressSanitizer:DEADLYSIGNAL
=================================================================
==15215==ERROR: AddressSanitizer: SEGV on unknown address 0x55da8a8b1360 (pc 0x55da8a7697d5 bp 0x55da8a8b6860 sp 0x7ffdc366bf40 T0)
==15215==The signal is caused by a WRITE memory access.
    #0 0x55da8a7697d4 in __asan::Allocator::Deallocate(void*, unsigned long, unsigned long, __sanitizer::BufferedStackTrace*, __asan::AllocType) (/home/jonathan/rawdisk2/a.out+0x2b7d4)
    #1 0x55da8a871876 in operator delete[](void*) (/home/jonathan/rawdisk2/a.out+0x133876)
    #2 0x55da8a8748fe in main /home/jonathan/rawdisk2/test.cpp:36:5
    #3 0x7f7016e57222 in __libc_start_main (/usr/lib/libc.so.6+0x24222)
    #4 0x55da8a76022d in _start (/home/jonathan/rawdisk2/a.out+0x2222d)

AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV (/home/jonathan/rawdisk2/a.out+0x2b7d4) in __asan::Allocator::Deallocate(void*, unsigned long, unsigned long, __sanitizer::BufferedStackTrace*, __asan::AllocType)
==15215==ABORTING

S'il te plaît, arrête de prétendre faire un code qui fonctionne.

EDIT: je le refais avec le fichier jacobi.txt. Quelle idée de faire continuer le programme lorsque le fichier n'est pas lu...

AddressSanitizer:DEADLYSIGNAL
=================================================================
==15366==ERROR: AddressSanitizer: SEGV on unknown address 0x55cd5c2e3370 (pc 0x55cd5c2a78f8 bp 0x7ffd00d00990 sp 0x7ffd00cffde0 T0)
==15366==The signal is caused by a WRITE memory access.
    #0 0x55cd5c2a78f7 in lectura(double**&, double*&, double*&, int*&) /home/jonathan/rawdisk2/test.cpp:60:13
    #1 0x55cd5c2a5eb0 in main /home/jonathan/rawdisk2/test.cpp:26:5
    #2 0x7ffb730f1222 in __libc_start_main (/usr/lib/libc.so.6+0x24222)
    #3 0x55cd5c19222d in _start (/home/jonathan/rawdisk2/a.out+0x2222d)

AddressSanitizer can not provide additional info.
SUMMARY: AddressSanitizer: SEGV /home/jonathan/rawdisk2/test.cpp:60:13 in lectura(double**&, double*&, double*&, int*&)
==15366==ABORTING

-
Edité par jo_link_noir 13 février 2019 à 23:45:39

  • Partager sur Facebook
  • Partager sur Twitter
14 février 2019 à 0:11:15

Ca devient grave, là...
Franchement, si c'est pour proposer du code comme ça, je pense qu'il vaut mieux t'abstenir "d'aider" les autres.

A et n non initialisés, et t'es pas choqué ?
Tu prétends utiliser "le concept plus avancé de référence sur des pointeurs pour le passage dans la fonction", mais tu ne comprends même pas que tu dois initialiser tes pointeurs.

Tu n'as pas les bases, n'essaie pas d'expliquer aux autres des concepts que tu ne comprends pas.
N'essaie pas non plus de contredire des personnes comme gbdivers qui sont autrement plus compétentes que toi.
Tu n'as pas la rigueur nécessaire pour faire du "C++ scientifique" (pour reprendre tes termes, même si ça ne veut rien dire...)

  • Partager sur Facebook
  • Partager sur Twitter

Si vous ne trouvez plus rien, cherchez autre chose.

14 février 2019 à 0:30:50 - Message modéré pour le motif suivant : Message complètement hors sujet


14 février 2019 à 0:35:16

YES, man a écrit:

Ce code marche sur codeblocks avec gcc

Après ma capture d'ecran qui montre que ce n'est pas valide et le copié-collé de jo_link_noir sur les messages d'asan, tu oses encore prétendre que ton code "marche" ?

Ouch. A ce point ?

  • Partager sur Facebook
  • Partager sur Twitter
14 février 2019 à 0:36:13

"Ca marche chez moi" n'est pas une preuve de fonctionnement.

Comme te l'a montré jo_link_noir, ton code est pétri d'UB, donc ne viens pas dire qu'il fonctionne, je n'ai même pas besoin de le lancer pour le voir.
A et n ne sont pas initialisés avant leur première utilisation -> UB.
Il n'y a rien à redire là-dessus, il n'y a pas d'argumentation possible.
Maintenant, il vaut mieux que tu arrêtes de t'enfoncer.

Pour reprendre ta formulation : Ton code est inadapté pour un forum C++.

-
Edité par dragonjoker 14 février 2019 à 0:39:27

  • Partager sur Facebook
  • Partager sur Twitter

Si vous ne trouvez plus rien, cherchez autre chose.

14 février 2019 à 0:39:57 - Message modéré pour le motif suivant : Le point Godwin a été atteint


14 février 2019 à 0:45:59

dragonjoker a écrit:

"Ca marche chez moi" n'est pas une preuve de fonctionnement.

  • Partager sur Facebook
  • Partager sur Twitter

Si vous ne trouvez plus rien, cherchez autre chose.

14 février 2019 à 0:47:34 - Message modéré pour le motif suivant : Message complètement hors sujet


14 février 2019 à 0:56:53

Salut,

Au cas ou tu aurais besoin d'un avis supplémentaire, ton code est faux, pour les raisons citées par tes harceleurs.

Ce n'est pas abstrait la programmation, une erreur n'est pas un point de vue mais un fait.

  • Partager sur Facebook
  • Partager sur Twitter
14 février 2019 à 0:57:28

Ok suivant ta théorie, imaginons que ces quelques personnes soient dans le faux.

Comment explique tu que ton code, passé dans un sanitizer retourne des erreur, donc preuve de mauvais fonctionnement ? (CF message de jo_link_noir )
Il a très certainement utilisé valgrin ou drmemory, qui sont des outils très largement rependu, utilisé et testé par la communauté toute entière du C++.
Comment est il possible qu'un programme qui fonctionne parfaitement, ne passe pas les tests sur ces outils ?
Tu ne trouve pas qu'il y a un probleme quelque part ?
  • Partager sur Facebook
  • Partager sur Twitter
"Tout devrait être rendu aussi simple que possible, mais pas plus." A.Einstein
14 février 2019 à 0:59:01

Ton code, il ne marche pas, pourquoi tu ne l'acceptes pas ?

C'est si difficile de se remettre en question ?

C'est pas compliqué pourtant : tu utilises un pointeur avant même de l'avoir alloué, donc bon, c'est d'une logique implacable, indiscutable même, il y a un ***GROS*** problème !

Ce n'est pas notre comportement qui va y changer quelque chose, ni le fait que tu édites tes messages pour mettre en emphase ton point de vue, ton code est faux, c'est tout, accepte le, pleure un bon coup, sèche tes larmes et avance !


EDIT: (c'est comme ça qu'on fait)


Le code de ton edit est toujours aussi faux...

-
Edité par dragonjoker 14 février 2019 à 1:04:31

  • Partager sur Facebook
  • Partager sur Twitter

Si vous ne trouvez plus rien, cherchez autre chose.

14 février 2019 à 1:08:33

Voici ce que j'ai à l'exécution avec gcc sur codeblocks :

  • Partager sur Facebook
  • Partager sur Twitter
14 février 2019 à 1:08:58

dragonjoker a écrit:

dragonjoker a écrit:

"Ca marche chez moi" n'est pas une preuve de fonctionnement.


EDIT:

/*
A=new double*[*n];
*/
Je suppose que tu as commenté ce bout de code parce qu'il crashait ?
Oh !! Ce ne serait pas parce que "n" n'est pas initialisé ?
Comme de par hasard !

-
Edité par dragonjoker 14 février 2019 à 1:14:02

  • Partager sur Facebook
  • Partager sur Twitter

Si vous ne trouvez plus rien, cherchez autre chose.

14 février 2019 à 1:20:05

YES, man a écrit:

Voici ce que j'ai à l'exécution avec gcc sur codeblocks 

On se répète et on tourne en rond...

gbdivers a écrit:

Comme tu l'as constaté, un code qui compile n'est pas forcément un code valide (ie un code qui fait correctement ce qu'on attend de lui. Cf https://fr.wikipedia.org/wiki/Qualit%C3%A9_logicielle )

En particulier, les UB (comportement indéfinis) font n'importe quoi (comme le nom l'indique). Donc ca peut crasher, ca peut retourner une valeur fausse. Parfois, ca peut même fonctionner correctement chez quelqu'un et faire n'importe quoi chez une autre personne.

Dis autrement, "ça marche chez moi" n'a aucune valeur pour savoir si un code est valide. Pour écrire un code valide, on va donc se baser sur des "bonnes" pratiques (un exemple : http://isocpp.github.io/CppCoreGuidelines/CppCoreGuidelines ), sur des diagnostiques du compilateurs, sur des outils externes, sur des tests et des preuves, etc. On a pleins d'outils, il faut les utiliser.

Ce que tu fais, c'est conduire sur l'autoroute en disant "vous voyez qu'on peut conduire sans les mains, a contresens, les yeux fermés, sans avoir d'accident" et ne pas comprendre quel est le problème quand on le met en prison.

  • Partager sur Facebook
  • Partager sur Twitter
14 février 2019 à 1:23:38

Le sanitizer (ici ASan) est intégré dans les compilateurs et s'active avec l'option -fsanitize=address. Je crois que ça ne fonctionne pas sur Windows, mais msvc possède une option de protection de la mémoire qui pourrait faire pareil: /sdl ou /guard ou des options de débug spécifique. Je ne bosse pas avec cette plateforme alors je dis peut-être n'importe quoi :).

Sinon, Valgrind aussi lève des erreurs. Je ne doute pas un instant que Dr. Memory fasse de même.

@Yes, man: reposter le même code que la page précédente donnera toujours la même chose: le code est faux. Quand vas-tu comprendre qu'une UB peut avoir comme résultat un programme qui peut fonctionner, comme un programme qui ne va pas fonctionner ? Cela fonctionne sur ta machine, mais pas sûr que ce soit encore le cas demain, ni dans 1h: une variable non-initialisée est dépendante du contenu de la mémoire dans le contexte d’exécution courant. Ainsi que plein d'autre facteur au bon vouloir du compilateur.

Mais va-y, continue d'écrire n'importe quoi et de dénigrer les membres du forum.

  • Partager sur Facebook
  • Partager sur Twitter
14 février 2019 à 1:36:22

(sans option particulière)

-
Edité par dragonjoker 14 février 2019 à 1:37:10

  • Partager sur Facebook
  • Partager sur Twitter

Si vous ne trouvez plus rien, cherchez autre chose.

14 février 2019 à 4:30:59

YES, man a écrit:

L'histoire du 20ème siècle, a montré que les groupes sont souvent dans le faux, et sont souvent animés par les idées les plus extrémistes et dangereuses. Donc je n'ai aucune confiance en vous, avec votre manière autoritariste de vous exprimer. 

omg, Mr Godwin avait raison xD

  • Partager sur Facebook
  • Partager sur Twitter

Eug

14 février 2019 à 7:23:37

Je crois qu'on a assez perdu de temps à essayer d'expliquer pourquoi utiliser un pointeur non initialisé est incorrect. Ca n'a juste aucun sens de discuter de ca. 

Désolé pour tenn004, qui a vu sa discussion partir dans tous les sens. Je remets ici la dernière réponse utile, pour qu'on puisse avancer.

gbdivers a écrit:

Ok, même en utilisant les pointeurs, on peut faire les choses un peu mieux.

Pour commencer, une evidence : si on a des etapes A, B, C, etc, on ne commence pas par corriger l'etape K. On fait dans l'ordre : on verifie etape par etape que les choses se passent correctement.

Et pour simplifier les vérifications, on sépare le code en partie plus simple a verifier. Avec des classes ou des fonctions, peut importe. Mais on découpe le code dans tous les cas.

Dans ton code, on a un ensemble fonctionnel très clair : ce tableau 2D. Sans classe, il faut quand même séparer les manipulations de ce tableau dans des fonctions. Donc la première chose a faire :

- écrire les fonctions pour allouer, initialiser, libérer et accéder a ce tableau 2D

- écrire les tests pour vérifier que les fonctions sont correctes

Ecrire ces fonctions est un exercice très classique en C. C'est la première etape.

C'est, je pense, la première étape.

  • Partager sur Facebook
  • Partager sur Twitter
14 février 2019 à 8:48:37

Juste pour expliquer à tenn004, YES man est une personne ayant posé énormément de questions sur le forum ces derniers mois, dont la progression est douteuse et dont les sujets font débat car il n'écoute pas les conseils qui lui sont donnés. :D Voilà pourquoi tout le monde lui a sauté dessus et ton sujet s'est enflammé. ;) Et ici tu as eu droit à sa première intervention sur le sujet de quelqu'un d'autre.

Ça paraissait ptet évident mais pour un nouveau venu sur le forum, ça peut faire bizarre. :lol:

  • Partager sur Facebook
  • Partager sur Twitter
14 février 2019 à 9:54:00

Je suis passé sur Microsoft Visual 2017, et là, cela est devenu dysfonctionnel alors que tout se passait bien sur gcc avec codeblocks.

Avec l'option suggérée par joe_link_noir dans le compilateur

-fsanitize=address

effectivement, le résultat devient problématique.

Je ne connaissais pas cette option fort intéressante pour détecter les fuites de mémoire. Merci Joe_link_noir. 

EDIT : apparemment, ça ne fonctionne pas avec codeblocks et gcc

La lecture du fichier jacobi.txt ne se fait pas  correctement avec la ligne de code de Tenn004 :

	ifstream datos("jacobi.txt");
	if (!datos) {
		cout << "problème";
	}

alors que tout se passait bien sous gcc avec codeblocks

Savez-vous pourquoi la lecture du fichier jacob.txt ne se fait pas avec cette ligne de code alors que le fichier jacobi.txt est bien placé dans le projet de MSCV 2017 ?

Modéré par Benzouye : Hors sujet

-
Edité par Benzouye 14 février 2019 à 14:43:47

  • Partager sur Facebook
  • Partager sur Twitter
14 février 2019 à 13:59:32 - Message modéré pour le motif suivant : Non respect des règles du forum


14 février 2019 à 14:22:15

Hello.

Je vais essayer d'être constructif.

YES, man a écrit:

Je suis passé sur Microsoft Visual 2017, et là, cela est devenu dysfonctionnel alors que tout se passait bien sur gcc avec codeblocks.

Avec l'option suggérée par joe_link_noir dans le compilateur

-fsanitize=address

Il y a une autre option qui va de pair, c'est la sanitization undefined. Et il faut coupler le tout avec des warnings max. Plus une autre option pour avoir une bonne pile, ce qui donne:

-Wall -Wextra -Werror -g -fno-omit-frame-pointer -fsanitize=address,undefined (et bientôt on aura le -Wlifetime, et ça ça va déchirer!)

Ces options je les utilise régulièrement avec clang++ sous linux -- je pratique peu l'écosystème Windows (je m'en sers uniquement comme terminal X...), du coup il peut y avoir des petites différences.

Pourquoi c'est important? Le C et le C++ font le choix de la vitesse avant tout et qui si on écrit du code dont le comportement n'est pas officiellement défini par la norme alors les compilateurs ont le droit d'en faire ce qu'il en veulent (envoyer des chats en orbite, renvoyer 42, bref rien d'utile). C'est un peu comme si à la boulangerie on demande une baguette et que l'on paie avec des billets de monopoly, c'est hors contrat, on va repartir avec deux torgnoles, une autre forme de pain, mais certainement pas celle demandée.

Ces comportements non définis et autres mauvaises manipulations de la mémoire sont critiques. Ils sont la source de nombreux plantages, et surtout de nombreuses failles de sécurité quand on les laisse dans notre code. Les laisser ou les introduire sur des systèmes critiques, c'est un mélange d'incompétence et de criminalité, de la pure faute professionnelle. Pragmatiquement ils sont la conséquence de mauvaises pratiques qui perdurent: que cela soit dans les habitudes de développement comme d'enseignement.

C'est pour cela que mes petits camarades insistent sur l'importance d'écrire du code correct. Certes leurs mots sont ce qu'ils sont et à force le débat tourne en rond, mais il est important de comprendre le message sous-jacent: il est inacceptable d'écrire et de promouvoir du code incorrect quand il est facile d'en écrire du correct. Ici nous avons un problème fort trop récurrent de professeur qui ne veut pas sortir de sa zone de confort et qui n'a probablement pas conscience des soucis induits par son approche pédagogique. J'ai vu passer la recommandation d'écrire une classe Matrice pour centraliser/encapsuler les gestions d'invariants. Si ce n'est toujours pas acceptable... tant pis. Il y a d'autres soucis qui avaient été trouvés visiblement.

  • Partager sur Facebook
  • Partager sur Twitter
C++: Blog|FAQ C++ dvpz|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS| Bons livres sur le C++| PS: Je ne réponds pas aux questions techniques par MP.
Anonyme
14 février 2019 à 14:22:39 - Message modéré pour le motif suivant : Message complètement hors sujet


14 février 2019 à 14:29:02

Dois-je signaler l'usage d'un multi-compte YES, man/WESH, man ? :colere2:

EDIT Benzouye : Pas de multi-compte, mais plutôt un bon/mauvais farceur, le compte a été supprimé depuis ...

-
Edité par Benzouye 15 février 2019 à 15:05:05

  • Partager sur Facebook
  • Partager sur Twitter
Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
14 février 2019 à 14:43:18

@lmghs : effectivement, c'est important

J'ai voulu essayer de limiter les changements à apporter à ce code, mais finalement c'est vrai que c'est pas du tout clair, d'avoir des pointeurs non initialisés à passer en arguments de fonction.

Là, sur MSVC 2017 je me retrouve avec des exceptions à tout bout de champ sur le code de Tenn004 que j'essaie de modifier sans trop toucher à sa structure initiale parce que effectivement, je n'ai pas voulu sortir de cette zone de confort.

EDIT : sauriez-vous pourquoi sous MSVC la lecture du fichier ne se fait même pas avant que les problèmes d'allocation mémoire ne se présentent  comme je l'avais demandé avant ?

Merci

-
Edité par pseudo-simple 14 février 2019 à 14:49:19

  • Partager sur Facebook
  • Partager sur Twitter
14 février 2019 à 14:57:58

Bonjour à tous,

@tenn04 : désolé pour la tournure qu'a pris ton sujet, je vais donc le clore et t'encourage à recréer un sujet tout neuf pour y poster ton code repris selon les conseils valables qui t'ont été donné au début de ce sujet.

@YES, man : merci de ne pas venir polluer une discussion lorsque tu n'en maîtrises clairement pas les tenants et aboutissants, et surtout merci de reconnaître lorsque tu as tort et que tu as atteint le point Godwin très rapidement ...

@YES, man : Pour la deuxième fois, merci de ne pas créer d'autres comptes, c'est contraire aux règles de ce forum, et tu me donnes déjà assez de boulot avec un seul compte ...

EDIT Benzouye : Pas de multi-compte, mais plutôt un bon/mauvais farceur, le compte a été supprimé depuis ...

Maluna34 a écrit:

Depuis quand on peut éditer des messages modérés ?

Il y a un bug actuellement sur les outils de modération du forum donc ... c'est un peu aléatoire ...

-
Edité par Benzouye 15 février 2019 à 15:04:54

  • Partager sur Facebook
  • Partager sur Twitter
Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL