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
Jean-Marc Bourguet
"Senhon" writes:

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.



C'est le strict minimum pour un editeur de programmeur. On a ca au moins
depuis teco... je ne sais pas quand. Pour rappel, emacs a commence comme
un ensemble de macros teco et le developpement du PDP-10 -- sur lequel
emacs a ete concu -- a ete arrete en 1983.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
AG
On Dec 1, 2:27 pm, James Kanze wrote:
Si on se trouve avec une erreur qui n'est pas détectée par les
tests unitaires,


Mais avant ça, comment trouver cette erreur ? -> débuggeur ou ajout de
nouveau code de débug...

Alexandre.
Avatar
Marc Boyer
Le 01-12-2009, Senhon a écrit :

"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.



Il faut alors faire GDB/DDD/[x]emacs

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.



En fait, je me remets au C++, et je me demandais s'il y avait des
choses plus pertinentes que mon xemacs/ctags.
Les deux trucs de base, c'est la completion automatique, et
retrouver la declaration et la définition d'un symbole.
Voilà, en eclipse, c'est Ctrl-Espace et Ctrl-ClicDroit.
En xemacs/ctags, c'est M-/ et M-.
En emacs/CEDET, ils ont visiblement pas choisi les raccourcis, et
il faut se les choisir.

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
"Jean-Marc Bourguet" a écrit dans le message de groupe de
discussion :
"Senhon" writes:

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.



C'est le strict minimum pour un editeur de programmeur. On a ca au moins
depuis teco... je ne sais pas quand. Pour rappel, emacs a commence comme
un ensemble de macros teco et le developpement du PDP-10 -- sur lequel
emacs a ete concu -- a ete arrete en 1983.



VS n'est pas qu'un éditeur.
Avec emacs tu debugges ?

Bon tant pis je ne suis pas payé pour vendre VS.
Et je ne me sens pas de taille pour défendre MS envers et contre tous.
En fait, que vous trouviez emacs, vim voir même ed, comme outil de
développement adéquat pour vos besoins, je trouve ça très bien.
Avatar
Senhon
"Marc Boyer" a écrit dans le message de
groupe de discussion : hf3h76$1ge$
Le 01-12-2009, Senhon a écrit :

"Senhon" a écrit dans le message de groupe de discussion :
4b152a62$0$30345$






En fait, je me remets au C++, et je me demandais s'il y avait des
choses plus pertinentes que mon xemacs/ctags.
Les deux trucs de base, c'est la completion automatique, et
retrouver la declaration et la définition d'un symbole.
Voilà, en eclipse, c'est Ctrl-Espace et Ctrl-ClicDroit.
En xemacs/ctags, c'est M-/ et M-.
En emacs/CEDET, ils ont visiblement pas choisi les raccourcis, et
il faut se les choisir.



Pardon d'avoir laisser dériver le fil, mais je ne saurais répondre à tes
questions.
Pour recadrer, mon intervention faisait suite à un post de James Kanze, qui
se trouvais aux prises avec VS et un programme dont il n'est pas l'auteur.
Avatar
Jean-Marc Bourguet
"Senhon" writes:

"Jean-Marc Bourguet" a écrit dans le message de groupe de
discussion :
> "Senhon" writes:
>
>> 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.
>
> C'est le strict minimum pour un editeur de programmeur. On a ca au moins
> depuis teco... je ne sais pas quand. Pour rappel, emacs a commence comme
> un ensemble de macros teco et le developpement du PDP-10 -- sur lequel
> emacs a ete concu -- a ete arrete en 1983.

VS n'est pas qu'un éditeur.
Avec emacs tu debugges ?



Je lance gdb dans emacs et c'est de tout ceux que j'ai essaie le plus
confortable des environnements (mais c'est un choix par defaut, je
travaille comme je travaillais il y a quinze ans et je suis surpris du
manque de progres dans les outils). J'utilise beaucoup moins le debuggeur
que certains, mais plus que James ne pretend le faire.

Bon tant pis je ne suis pas payé pour vendre VS. Et je ne me sens pas de
taille pour défendre MS envers et contre tous. En fait, que vous
trouviez emacs, vim voir même ed, comme outil de développement adéquat
pour vos besoins, je trouve ça très bien.



Je ne connais pas VS. VS n'est certainement pas adequat pour mes besoins:
il n'est disponible que sur une plateforme qui ne fait pas partie de mes
cibles. Je n'ai aucune idee sur ce qu'il peut apporter ou pas -- j'ai une
liste des choses que j'aimerais bien dans mon environnement et que je n'ai
pas, il est certain que VS en propose certaines(*) --, mais quand je vois
"vendre" des choses que j'ai depuis avant que VS existe dans mon
environnement comme des progres sans pareil (que ce soit les macros, les
templates ou autre chose), j'ai l'impression que tout le monde n'a pas les
memes scrupules que moi a ne comparer que des choses qu'ils connaissent.

A+

(*) La vraie question, c'est si ce que VS m'apporterait compenserait ce que
je n'aurais plus. Pour le moment, la reponse est non puisque le support
d'au moins une de mes cibles est quand meme la premiere exigence que j'ai
pour essayer un nouvel outil. (La deuxieme est la capacite a l'essayer
sans changer la maniere de travailler de mes collegues et sans passer 3
semaines a chercher a le configurer pour cela -- chose qui a elimine pas
mal d'autres IDE sous Linux).

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
Avatar
James Kanze
On Dec 1, 2:27 pm, Marc Boyer
wrote:
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



Et Ctr-] in vim. (Pas que je ne l'ai jamais trouvé si important
que ça.)

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



C'est surtout une fonctionalité de l'éditeur, je crois.

--
James Kanze
Avatar
James Kanze
On Dec 1, 2:38 pm, "Senhon" wrote:
"Marc Boyer" a écrit dans le message de
groupe de discussion : hf3950$
> 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.



C'est aussi le désavantage. On a un outil qui fait moyenement
tout, mais rien très bien. (Je ne crois pas qu'il faut que ce
soit le cas, mais dans la pratique, ou bien c'est le cas, ou
bien l'integration montre ses coutures.)

--
James Kanze
Avatar
James Kanze
On Dec 1, 3:26 pm, "Senhon" wrote:
"Marc Boyer" a écrit dans le message de
groupe de discussion : hf3ajg$



> 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.



Alors, c'est emacs qu'il te faut.

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.



En emacs, pratiquement tout est un « macro », ou plutôt une
fonction lisp. Y compris les bindings du clavier.

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.



L'avantage éventuel de VS, c'est qu'il y en a des plug-ins.
C'est évidemment la première plateforme ciblée pour ce genre de
chose.

--
James Kanze
Avatar
James Kanze
On Dec 1, 3:41 pm, Marc Boyer
wrote:
Le 01-12-2009, Senhon a écrit :
> "Marc Boyer" a écrit dans le messa ge de
> groupe de discussion : hf3ajg$
>> 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 ?



C'est le IDE:-).

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...



Et quand tu ouvres un nouveau fichier, il te génère le
boilerplating. De même que vim.

gdb se scripte assez bien, mais je ne sache pas qu'on puisse y
définir des fonctions.



Selon la doc, tu peux, mais je ne connais pas jusqu'où.

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



Moi, dès qu'ils deviennent compliqués, je les écris en bash, awk
ou C++. La commande vim qui me sers le plus dans les macros, je
crois, c'est ! (pipe la région en question à travers une
commande shell). C'est un avantage de VS que de pouvoir utiliser
le même langage de customisation de a jusqu'à z, mais tous les
outils Unix qui se respectent connaissent le !, pour ensuite
pouvoir exploiter tout ce qu'il y a sur la machine.

--
James Kanze