Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Bug indétectable via printf() / cout

148 réponses
Avatar
AG
Bonjour =E0 tous,

Je travaille dans une =E9quipe de personnes pour lesquels le d=E9bugger
n'est pas l'outil qui tombe sous le sens lorsqu'il s'agit de trouver
les bugs des outils qu'ils ont d=E9velopp=E9.

Afin de les sensibiliser, je recherche un exemple de bug difficile
(voir impossible) a d=E9tecter via des printf()/cout qui n'afficheraient
que les contenus des variables. (Je me rends bien compte qu'on doit
pouvoir tout d=E9bugger avec printf()/cout, mais il faut parfois
afficher les adresses des variable (en plus de leur valeur), voir
parfois la m=E9moire =E0 certains endroits.)

Je voudrais construire un exemple simple (notions de C++ pas trop
compliqu=E9es) et court (un seul fichier, 100 lignes max) pour qu'on
puisse l'=E9tudier en un quart d'heure, mais le d=E9bugger en un temps
presque infini sans d=E9bugger.

Il est possible que l'exemple, puisqu'il y a un bug, d=E9pende de la
plateforme mais c'est un peu in=E9vitable.

L'id=E9al serait que le plantage ait lieu bien apr=E8s le bug...=E7a rajout=
e
du piment. Bref, vous voyez l'id=E9e quoi...

J'avais plusieurs pistes d'exploitation de bug:

Piste 1:
Boucle for d=E9croissante sur un entier non sign=E9 : for(size_t i =3D N;
0<=3D i; i--)

Piste 2:
comparaison de double : double x; ... ; x =3D=3D 0.0

Piste 3:
retour de malloc() non test=E9

Piste 4:
caract=E8re de fin de ligne non test=E9 (\0)

Mais jusque l=E0, je crains qu'il ne soit trop facile de d=E9tecter le
bug

J'ai donc ensuite pens=E9 aux r=E9f=E9rences. Mais ce code est encore un pe=
u
trop voyant. Dans le main(), on peut facilement se demander pourquoi
f1 et f2 sont des r=E9f=E9rences, ce qui met directement la puce =E0
l'oreille. Peut =EAtre trouvez vous ce code bien trop compliqu=E9, ou
auriez vous en t=EAte un mani=E8re de "l'am=E9liorer" :-)

A bon entendeur salut.

AG.




#include <iostream>

using namespace std;

#define BUFFER_LENGTH 10

template<int N, class T>
class fifo_circular
{
private:
T * position;
size_t pos_offset;
T buffer[N];

public:
fifo_circular() { pos_offset =3D N-1; position =3D buffer + pos_offset;
for(int i=3D0;i<N;i++) buffer[i]=3DT(0);};

T step(T &input)
{
*position =3D input;

if(pos_offset>0) // ici il y aurait peut =EAtre moyen de glisser le
bug de la piste 1
pos_offset--;
else
pos_offset =3D N-1;

position =3D buffer + pos_offset;
return *position;
};

template<int M, class U> friend ostream & operator<<(ostream & o,
const fifo_circular<M,U> &f);
};

template<int N, class T>
fifo_circular<N,T> & Init(T & value)
{
fifo_circular<N,T> & f =3D fifo_circular<N,T>(); // h=E9 h=E9 h=E9

for(size_t i =3D 0; i < N; i++)
f.step(value);
return f;
}

template<int M, class U>
ostream & operator<<(ostream & o, const fifo_circular<M,U> &f)
{
for(size_t i =3D 0; i < M; i++)
o << f.buffer[i] << " ";
return o;
}

int main(int argc, char * argv[])
{
int a =3D 1;
fifo_circular<5,int> & f1 =3D Init<5,int>(a); // ici, c'est un peu trop
voyant. On se demande pourquoi f1 est d=E9clar=E9 en tant que
r=E9f=E9rence...
a =3D 2;
fifo_circular<5,int> & f2 =3D Init<5,int>(a);

cout << "fifo f1: " << f1 << "\n";
cout << "fifo f2: " << f2 << "\n";

return 0;
}

10 réponses

Avatar
James Kanze
On Dec 1, 10:19 am, "Senhon" wrote:
"Fabien LE LEZ" a écrit dans le
message de groupe de discussion :

> On Mon, 30 Nov 2009 08:47:48 -0800 (PST), AG :



>>Oui, tu auras deviné que j'avais le C en tête lorsque j'ai
>>écrit cela...



> Je pense que tu as mis le doigt sur un point important : il
> y a pas mal d'outils qui servent presque exclusivement sur
> le code des autres.



>>Celui de Visual Studio l'est.



> Oui. Dommage qu'il faille subir, pour l'utiliser, le reste
> de l'IDE.



Ce n'est pas tout à fait vrai. Je ne me rappelle jamais la
séquence de clics qu'il faut -- il faut chaque fois que je le
recherche dans la doc. Mais c'est tout à fait possible à créer
un « projet » à partir d'un exécutable, sans rien faire de
particulier, simplement pour les besoins du déboggage.

> C'est d'ailleurs en partie pour ça que j'utilise peu le
> débogueur : démarrer le débogueur me force à lancer l'IDE et
> à y créer un projet, tâche désagréable à laquelle je ne me
> résoud que si je ne trouve pas d'autre solution.



C'est là que tu te trompes énormément.
Je comprends ta vision lorsque, au départ, tu "subis" l'IDE,
c'est d'un frustrant ... je me souviens encore de la mienne et
du rejet que cela induisait.



VisualStudio est énormément pratique quand tu utilises ( dans
mon cas ) les macros ( je ne saurai dire pour les "Modèle
objet d'extensibilité").



Il est possible de définir ses propres patrons : de projets [
ou pas de patron du tout ;-) ], de sources, de fonctions, de
classes, de présentation, .... En quelques clics ou raccourci
clavier, il réalise un travail considérable. C'est d'une
productivité INEGALEE.



À un moment ou à autre, il faut bien que tu précises à VS quels
fichiers sont dans le projet, etc. Travail qui est bien plus
facile sous vim que avec la souris.

--
James Kanze
Avatar
Senhon
"James Kanze" a écrit dans le message de groupe de
discussion :

On Dec 1, 9:02 am, "Senhon" wrote:
"James Kanze" a écrit dans le message
de groupe de discussion :




> On Nov 30, 2:28 pm, "Senhon" wrote:
>> "AG" a écrit dans le message de groupe de
>> discussion :
>>



>> GDB, rend d'énormes services.
>> Mais, je n'ai rien trouvé de mieux que Visual Studio, c'est
>> un plaisir que de travailler avec cette merveille. GDB en
>> comparaison fait outil d'un autre âge.



> Là, c'est de l'ironie, n'est-ce pas ? Parce que je me sers
> actuellement de Visual Studio (pour comprendre du code que
> je n'ai pas écrit, et pour lequel il n'y a aucune
> documentation), et je me heurte constamment à ses
> limitations.



Pas du tout, mais alors, loin de là.
Rien que l'usage de la touche F12, fonctionnalité que je n'ai
rencontré nulle part ailleurs, vaut le détour.



Et ça fait quoi, la touche F12 ? Personne ici ne la connaît (et
ils sont pour la plupart des spécialistes du dévelopement sous
Windows).



Cela te place directement sur la définition d'un élément.


Bon c'est sûr que dans ton cas, c'est pas ton prog, peut-être
pas ton OS de prédilection, c'est pas ton outils de debug
habituel, lorsque l'on est habitué à une interface
utilisateur, cela gêne pour passer à une autre : et
l'occurrence, entre GDB (commande ligne) et VisualStudio
(graphique), l'écart est déjà conceptuel.




Qu'il n'ait pas de ligne de commande:-). Sérieusement, c'est
plus ou moins ça. J'ai l'habitude de pouvoir afficher n'importe
quelle expression (y compris des expressions qui comporte des
appels de fonctions dans mon code), et de l'afficher
systematiquement, chaque fois que l'exécution s'arrête. Et
l'environement où je travaille fait que je suis bien obligé à me
servir d'un déboggueur ; même l'échec d'une assertion n'arrête
pas le programme.



Cela semble confirmer ce que je pressentais.
Il n'y pas d'échappatoire, maitriser VisualStudio c'est facile comme le C++
... tout dépend de la force de motivation.
Quelques lignes de C++ ne font pas de toi un connaisseur du langage, de
même, quelques clics dans VS ne te permettront pas de le connaitre .
Avatar
Senhon
"James Kanze" a écrit dans le message de groupe de
discussion :

On Nov 30, 6:17 pm, (Marc Espie) wrote:
In article
,
James Kanze wrote:



>Aux l ves, il faudrait plut t l'interdire. Il vaut mieux leur
>apprendre d' crire du code correctement, pourqu'ils n'en ont
>pas besoin d'un d boggueur.



Avec ma population actuelle d'etudiants, je leur montre un
debugger. Il faut voir qu'ils n'ecrivent pas forcement du
code correct, mais qu'ils debugguent a grands coups de printf.
Alors, quitte a debugguer, autant que ca soit efficace...



C'est sûr qu'entre des grands coups de printf et un déboggueur,
il n'y a pas grand choses à dire. Mais ne serait-il pas
préférrable de leur enseigner comment écrire du code d'une façon
à n'avoir besoin ni d'un ni de l'autre.




Oui il faudrait leur injecter l'expérience d'un programmeur averti en
intraveineuse.
Mais c'est vrai ça ! Pourquoi ces profs s'escriment-ils à leur enseigner
autre chose que la bonne façon d'écrire.

PS:
Plus sérieusement : A tous les profs ma profonde admiration pour leur
courage dans la tache incommensurable qu'ils assument, pris entre l'enclume
et le marteau, on leur tapent sur la tête de tous cotés.
Avatar
Marc Boyer
Le 01-12-2009, Senhon a écrit :
Rien que l'usage de la touche F12, fonctionnalité que je n'ai
rencontré nulle part ailleurs, vaut le détour.







Cf plus bas.


Et ça fait quoi, la touche F12 ? Personne ici ne la connaît (et
ils sont pour la plupart des spécialistes du dévelopement sous
Windows).



Cela te place directement sur la définition d'un élément.



M-. en [x]emacs/CEDET
Ctr-BtDroit en Eclipse

Oui, c'est super utile, mais c'est une fonctionnalité d'IDE,
pas de débogueur.

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0
Avatar
Senhon
"James Kanze" a écrit dans le message de groupe de
discussion :

On Dec 1, 10:19 am, "Senhon" wrote:
"Fabien LE LEZ" a écrit dans le
message de groupe de discussion :

> On Mon, 30 Nov 2009 08:47:48 -0800 (PST), AG :




À un moment ou à autre, il faut bien que tu précises à VS quels
fichiers sont dans le projet, etc.



He bien, non ! Les déclarations des fichiers dans les projets sont
automatisés.


Travail qui est bien plus facile sous vim que avec la souris.



C'est ce que je disais, tu essaies de faire comme avec vim. Le parallèle
programmation C et programmation C++ me parait fort à propos.
Utiliser VS comme vim n'a en soit pas d'intérêt.

Par contre j'ai compris que dans ton cas actuel il ne soit pas simple
d'appréhender tout le potentiel de VS.
Pour ce faire il faudrait être l'initiateur du projet. Et encore du premier
coup cela me semble très improbable, il faudra se casser la tête, faire
plusieurs tentatives, pour parvenir à un résultat significatif.

Les macros de VS c'est du VB, avec l'aide des "objet automation", tu
programmes ton outil comme tu le souhaites.
Avatar
Senhon
"Marc Boyer" a écrit dans le message de
groupe de discussion : hf3950$up0$
Le 01-12-2009, Senhon a écrit :
Rien que l'usage de la touche F12, fonctionnalité que je n'ai
rencontré nulle part ailleurs, vaut le détour.







Cf plus bas.


Et ça fait quoi, la touche F12 ? Personne ici ne la connaît (et
ils sont pour la plupart des spécialistes du dévelopement sous
Windows).



Cela te place directement sur la définition d'un élément.



M-. en [x]emacs/CEDET
Ctr-BtDroit en Eclipse

Oui, c'est super utile, mais c'est une fonctionnalité d'IDE,
pas de débogueur.



Lorsque l'on est dans l'IDE je ne voit pas comment on peut déterminer si une
fonctionnalité est à attribuer à une partie ou à une autre.
L'avantage de l'IDE : c'est d'être à la fois , et éditeur, et compilateur,
et debugger.
Avatar
Marc Boyer
Le 01-12-2009, Senhon a écrit :

"Marc Boyer" a écrit dans le message de
groupe de discussion : hf3950$up0$
Le 01-12-2009, Senhon a écrit :
Rien que l'usage de la touche F12, fonctionnalité que je n'ai
rencontré nulle part ailleurs, vaut le détour.



Et ça fait quoi, la touche F12 ? Personne ici ne la connaît (et
ils sont pour la plupart des spécialistes du dévelopement sous
Windows).



Cela te place directement sur la définition d'un élément.



M-. en [x]emacs/CEDET
Ctr-BtDroit en Eclipse

Oui, c'est super utile, mais c'est une fonctionnalité d'IDE,
pas de débogueur.



Lorsque l'on est dans l'IDE je ne voit pas comment on peut déterminer si une
fonctionnalité est à attribuer à une partie ou à une autre.



Disons que je suis habitué dans le monde Unix-like à ce que ce qui se
prétent IDE permette de paramétrer les différentes parties.
Tiens, mon client de mail, c'est Thunderbird, et mon editeur de mail,
c'est xemacs.
Mon compilo, c'est souvent gcc, et mon éditeur/IDE, xemacs.
Le client Usenet, c'est slrn, et l'éditeur de news, c'est vi.

L'avantage de l'IDE : c'est d'être à la fois , et éditeur, et compilateur,
et debugger.



Voui, le lien éditeur/compilateur est primordial.

En fait, sans rechercher spécialement la polémique, comme tu as l'air
de bien connaitre VC++, je me demandais quelles fonctionnalités
de son débogueur tu trouvais vraiment unique et qui pourrait me
faire sauter le pas.

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0
Avatar
Senhon
"Senhon" a écrit dans le message de groupe de discussion :
4b152a62$0$30345$

"Marc Boyer" a écrit dans le message de
groupe de discussion : hf3950$up0$
Le 01-12-2009, Senhon a écrit :
Rien que l'usage de la touche F12, fonctionnalité que je n'ai
rencontré nulle part ailleurs, vaut le détour.







Cf plus bas.


Et ça fait quoi, la touche F12 ? Personne ici ne la connaît (et
ils sont pour la plupart des spécialistes du dévelopement sous
Windows).



Cela te place directement sur la définition d'un élément.



M-. en [x]emacs/CEDET





Je parlais disposer de cette fonctionnalité directement dans un debugger, je
pensais GDB/DDD.



Ctr-BtDroit en Eclipse





Pour Eclipse je suis victime de ce que je disais.
J'ai connu Visual C, puis Visual Studio, et la seule fois ou j'ai été
confronté à Eclipse ( d'ailleurs c'était avec du java), j'ai fait un rejet,
habitué tel que je l'étais à la chaine VS, j'ai trouvé ça nul, pas pratique,
compliqué. Mais j'ai conscience de ce que le problème vient de mon
orientation d'esprit, forgé depuis des années par certains automatismes non
directement transposable dans Eclipse. Du coup je ne saurais dire si
Ctr-BtDroit correspond à F12 dans VS, je m'en remets à toi.
Avatar
Senhon
"Marc Boyer" a écrit dans le message de
groupe de discussion : hf3ajg$up0$
Le 01-12-2009, Senhon a écrit :




En fait, sans rechercher spécialement la polémique, comme tu as l'air
de bien connaitre VC++, je me demandais quelles fonctionnalités
de son débogueur tu trouvais vraiment unique et qui pourrait me
faire sauter le pas.




C'est ses possibilités de personnalisation.

Pardon pour la répétition: Grâce aux macros ( utilisation de l'interface
automation par du VB ) il est possible de réaliser TON outil de
programmation, qui agit comme tu le lui a programmé, suivant ta méthodologie
propre.

Malheureusement, je connais qu'un peu VS (VC++ étant la génération d'avant
automation, cependant disposant déjà de macros). Peut-être, un peu plus que
la moyenne dans ce NG.
Il reste tout ce qui concerne l'extension directement avec des compléments
en C++, ou des plug-ins, que je ne connais pas.
Avatar
Marc Boyer
Le 01-12-2009, Senhon a écrit :

"Marc Boyer" a écrit dans le message de
groupe de discussion : hf3ajg$up0$
Le 01-12-2009, Senhon a écrit :

En fait, sans rechercher spécialement la polémique, comme tu as l'air
de bien connaitre VC++, je me demandais quelles fonctionnalités
de son débogueur tu trouvais vraiment unique et qui pourrait me
faire sauter le pas.



C'est ses possibilités de personnalisation.

Pardon pour la répétition: Grâce aux macros ( utilisation de l'interface
automation par du VB ) il est possible de réaliser TON outil de
programmation, qui agit comme tu le lui a programmé, suivant ta méthodologie
propre.



Mais c'est le debogueur que tu personnalises ou l'éditeur ?

Sous [x]emacs, tu personnalises en emacs-lisp. Tu peux faire ta commande
'new-class' qui te demande le nom de la classe, crée le .hpp, le .cpp,
les #include, l'ajoute au svn, etc...
gdb se scripte assez bien, mais je ne sache pas qu'on puisse
y définir des fonctions.

Après, qu'on préfère écrire ses macros en VB ou en emacs-lisp,
c'est chacun son gout.

Marc Boyer
--
En prenant aux 10% des francais les plus riches 12% de leurs revenus,
on pourrait doubler les revenus des 10% les plus pauvres.
http://www.inegalites.fr/spip.php?article1&id_mot0