Derniers messages sur Zeste de Savoirhttps://zestedesavoir.com/forums/2015-04-28T20:11:12+02:00Les derniers messages parus sur le forum de Zeste de Savoir.Segmentation fault, message #543292015-04-28T20:11:12+02:00anonyme/@anonymehttps://zestedesavoir.com/forums/sujet/3003/segmentation-fault/?page=1#p54329<p>Voilà le backtrace :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6
7</pre></div></td><td class="code"><div class="codehilite"><pre><span class="o">(</span>gdb<span class="o">)</span> backtrace
<span class="c">#0 0x6fc5e26c in libstdc++-6!_ZNKSs7_M_dataEv ()</span>
from E:<span class="se">\_</span>Logiciels<span class="se">\P</span>rogrammation<span class="se">\L</span>ogiciels<span class="se">\M</span>inGW<span class="se">\b</span>in<span class="se">\l</span>ibstd
<span class="c">#1 0x6fc5df93 in libstdc++-6!_ZNKSs5c_strEv ()</span>
from E:<span class="se">\_</span>Logiciels<span class="se">\P</span>rogrammation<span class="se">\L</span>ogiciels<span class="se">\M</span>inGW<span class="se">\b</span>in<span class="se">\l</span>ibstd
<span class="c">#2 0x00401734 in yyparse () at parser.y:32</span>
<span class="c">#3 0x00402b32 in main (argc=1, argv=0x6a2f88) at jess.cpp:10</span>
</pre></div>
</td></tr></table>
<p>Edit : J'ai commencé à lire la doc de Spirit, comment ai-je pu passer à côté de ça ? <img alt=":D" src="/static/smileys/heureux.png"> Tu as raison, je laisse tomber ces vieilleries de Lex et Yacc, je vais faire du vrai C++. Merci pour le tuyau !</p>Segmentation fault, message #543192015-04-28T18:56:05+02:00Davidbrcz/@Davidbrczhttps://zestedesavoir.com/forums/sujet/3003/segmentation-fault/?page=1#p54319<p>GDB t'indique quoi dans les détails (pile d'appel, instruction mise en cause) ?</p>Segmentation fault, message #543172015-04-28T18:44:23+02:00anonyme/@anonymehttps://zestedesavoir.com/forums/sujet/3003/segmentation-fault/?page=1#p54317<p>C'est alloué par Flex quand il rencontre la macro SAVE_TOKEN (cf. tokens.l ligne 5).
Je jette un oeil à boost::spirit.</p>Segmentation fault, message #543132015-04-28T18:34:08+02:00Davidbrcz/@Davidbrczhttps://zestedesavoir.com/forums/sujet/3003/segmentation-fault/?page=1#p54313<p>Pourquoi utiliser des outils préhistoriques quand il y a plus modernes et moins prompt à filer une segfault (boost::spirit par exemple) ?</p>
<p>Sinon, pointeur sur string, c'est dégeulasse et surtout, tu l'alloues quand ? Car ton appel à c_str sur un truc non alloué à toute les chances de faire kabooum</p>Segmentation fault, message #543082015-04-28T17:45:51+02:00anonyme/@anonymehttps://zestedesavoir.com/forums/sujet/3003/segmentation-fault/?page=1#p54308<p>Salut à tous,</p>
<p>Je suis en train d'écrire un petit parseur en C++ à l'aide de Flex et Bison (équivalents libres de Lex et Yacc).</p>
<p>J'obtiens une segmentation fault et je n'arrive pas à voir d'où ça vient (gdb m'indique que ça vient de libstdc++6.dll mais ne donne pas plus de détails).</p>
<p>Quelqu'un voit-il la solution ? <img alt=":)" src="/static/smileys/smile.png"></p>
<p>Voici mon code :</p>
<p><em>tokens.l</em></p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20</pre></div></td><td class="code"><div class="codehilite"><pre><span class="o">%</span><span class="p">{</span>
<span class="cp">#include <string></span>
<span class="cp">#include "ast.h"</span>
<span class="cp">#include "parser.hpp"</span>
<span class="cp">#define SAVE_TOKEN yylval.string=new std::string(yytext,yyleng)</span>
<span class="cp">#define TOKEN(t) (yylval.token=t)</span>
<span class="k">extern</span> <span class="s">"C"</span> <span class="kt">int</span> <span class="n">yywrap</span><span class="p">()</span> <span class="p">{</span> <span class="p">}</span>
<span class="o">%</span><span class="p">}</span>
<span class="o">%%</span>
<span class="p">[</span><span class="mi">0</span><span class="o">-</span><span class="mi">9</span><span class="p">]</span><span class="o">+</span> <span class="n">SAVE_TOKEN</span><span class="p">;</span> <span class="k">return</span> <span class="nf">TOKEN</span><span class="p">(</span><span class="n">TNUMBER</span><span class="p">);</span>
<span class="n">heat</span> <span class="k">return</span> <span class="nf">TOKEN</span><span class="p">(</span><span class="n">THEAT</span><span class="p">);</span>
<span class="n">on</span><span class="o">|</span><span class="n">off</span> <span class="n">SAVE_TOKEN</span><span class="p">;</span> <span class="k">return</span> <span class="nf">TOKEN</span><span class="p">(</span><span class="n">TSTATE</span><span class="p">);</span>
<span class="n">target</span> <span class="k">return</span> <span class="nf">TOKEN</span><span class="p">(</span><span class="n">TTARGET</span><span class="p">);</span>
<span class="n">temperature</span> <span class="k">return</span> <span class="nf">TOKEN</span><span class="p">(</span><span class="n">TTEMPERATURE</span><span class="p">);</span>
<span class="err">\</span><span class="n">n</span> <span class="p">;</span>
<span class="p">[</span> <span class="err">\</span><span class="n">t</span><span class="p">]</span><span class="o">+</span> <span class="p">;</span>
<span class="o">%%</span>
</pre></div>
</td></tr></table>
<p><em>parser.y</em></p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39</pre></div></td><td class="code"><div class="codehilite"><pre><span class="o">%</span><span class="p">{</span>
<span class="cp">#include "ast.h"</span>
<span class="k">extern</span> <span class="kt">int</span> <span class="n">yylex</span><span class="p">();</span>
<span class="kt">void</span> <span class="nf">yyerror</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">s</span><span class="p">)</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="s">"ERROR: %s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="n">s</span><span class="p">);</span> <span class="p">}</span>
<span class="o">%</span><span class="p">}</span>
<span class="o">%</span><span class="k">union</span>
<span class="p">{</span>
<span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="o">*</span><span class="n">string</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">token</span><span class="p">;</span>
<span class="p">}</span>
<span class="o">%</span><span class="n">token</span> <span class="o"><</span><span class="n">string</span><span class="o">></span> <span class="n">TNUMBER</span> <span class="n">TSTATE</span>
<span class="o">%</span><span class="n">token</span> <span class="o"><</span><span class="n">token</span><span class="o">></span> <span class="n">THEAT</span> <span class="n">TTARGET</span> <span class="n">TTEMPERATURE</span>
<span class="o">%</span><span class="n">start</span> <span class="n">commands</span>
<span class="o">%%</span>
<span class="nl">commands</span>
<span class="p">:</span> <span class="cm">/*empty*/</span>
<span class="o">|</span> <span class="n">commands</span> <span class="n">command</span>
<span class="p">;</span>
<span class="nl">command</span>
<span class="p">:</span> <span class="n">heat_switch</span>
<span class="o">|</span> <span class="n">target_set</span>
<span class="p">;</span>
<span class="nl">heat_switch</span>
<span class="p">:</span> <span class="n">THEAT</span> <span class="n">TSTATE</span> <span class="p">{</span> <span class="n">printf</span><span class="p">(</span><span class="s">"%s</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="err">$</span><span class="mi">2</span><span class="o">-></span><span class="n">c_str</span><span class="p">());</span> <span class="k">delete</span> <span class="err">$</span><span class="mi">2</span><span class="p">;}</span>
<span class="p">;</span>
<span class="nl">target_set</span>
<span class="p">:</span> <span class="n">TTARGET</span> <span class="n">TTEMPERATURE</span> <span class="n">TNUMBER</span> <span class="p">{</span> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"Temperature set to "</span> <span class="o"><<</span> <span class="p">(</span><span class="o">*</span><span class="err">$</span><span class="mi">3</span><span class="p">)</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span> <span class="k">delete</span> <span class="err">$</span><span class="mi">3</span><span class="p">;</span> <span class="p">}</span>
<span class="p">;</span>
<span class="o">%%</span>
</pre></div>
</td></tr></table>
<p><em>ast.h</em></p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3</pre></div></td><td class="code"><div class="codehilite"><pre><span class="cp">#include <iostream></span>
<span class="cp">#include <vector></span>
<span class="cp">#include <cstdio></span>
</pre></div>
</td></tr></table>
<p><em>jess.cpp</em></p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre> 1
2
3
4
5
6
7
8
9
10
11
12
13
14</pre></div></td><td class="code"><div class="codehilite"><pre><span class="cp">#include <iostream></span>
<span class="cp">#include "ast.h"</span>
<span class="k">extern</span> <span class="kt">FILE</span><span class="o">*</span> <span class="n">yyin</span><span class="p">;</span>
<span class="k">extern</span> <span class="kt">int</span> <span class="nf">yyparse</span><span class="p">();</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span><span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span>
<span class="p">{</span>
<span class="kt">FILE</span><span class="o">*</span> <span class="n">input</span><span class="o">=</span><span class="n">fopen</span><span class="p">(</span><span class="s">"test.txt"</span><span class="p">,</span><span class="s">"r"</span><span class="p">);</span>
<span class="n">yyin</span><span class="o">=</span><span class="n">input</span><span class="p">;</span>
<span class="n">yyparse</span><span class="p">();</span>
<span class="n">fclose</span><span class="p">(</span><span class="n">input</span><span class="p">);</span>
<span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o"><<</span> <span class="s">"Done."</span> <span class="o"><<</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</pre></div>
</td></tr></table>
<p><em>test.txt</em></p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3
4
5
6</pre></div></td><td class="code"><div class="codehilite"><pre>heat on
heat off
heat on
target temperature 23
target temperature 19
heat off
</pre></div>
</td></tr></table>
<p>tokens.l est le fichier Flex, parser.y est le fichier Bison, ast.h est vide, jess.cpp est le point d'entrée (main), et le parseur prend en entrée le fichier test.txt.</p>
<p>Dès le parsing de la première commande, j'obtiens un segfault, cela vient de quand j'essaye d'accéder au contenu de string pour l'afficher.</p>
<p>Voici mes commandes de build (je suis sous windows) :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3</pre></div></td><td class="code"><div class="codehilite"><pre>bison -d -o parser.cpp parser.y
flex tokens.l
g++ -g -o jess.exe parser.cpp lex.yy.c jess.cpp
</pre></div>
</td></tr></table>
<p>Voici la sortie de gdb :</p>
<table class="codehilitetable"><tr><td class="linenos"><div class="linenodiv"><pre>1
2
3</pre></div></td><td class="code"><div class="codehilite"><pre>Program received signal SIGSEGV, Segmentation fault.
0x6fc5e26c in libstdc++-6!_ZNKSs7_M_dataEv <span class="o">()</span>
from E:<span class="se">\(</span>...<span class="o">)</span><span class="se">\M</span>inGW<span class="se">\b</span>in<span class="se">\l</span>ibstdc++-6.dll
</pre></div>
</td></tr></table>
<p>Help ! <img alt="^^" src="/static/smileys/hihi.png"></p>