作者slinh (有)(闪)(光)
看板EE_DSnP
标题[问题] 怪bug
时间Tue Jan 5 12:59:33 2010
现在进行到testBdd的阶段
我的程式是跑到BddNodeInt的getLevel()里面
在return _level时segmentation fault
若在这一行前面加个cout字串是可以看到输出的
我完全没有概念这个问题是怎麽回事...
明明都可以进到getLevel()了
结果return时挂掉
ps. 我用64-bit machine
谢谢
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.112.4.192
1F:推 yangjiunru:用ddd或gdb看seg fault的时候this是不是0x0 01/05 13:01
2F:→ yangjiunru:是的话就是你用到空的BddNode 01/05 13:01
详细情况是这样
initBdd(5, 127, 61);
BddNode e(bm.getSupport(5));
e.getLevel();
所以我的理解是BddNode的getLevel先被呼叫
才去呼叫getBddNodeInt()->getLevel()
然後挂在BddNodeInt取得_level
应该不是空的BddNode吧
我试过把return _level改成 cout<<_level 也是爆炸
※ 编辑: slinh 来自: 140.112.4.192 (01/05 13:58)
3F:推 ric2k1:你的 getBddNodeInt() 是不是 NULL? 01/05 14:51
4F:→ slinh:还没check 不过若是NULL 应该在呼叫BddNodeInt->getLevel() 01/05 15:21
5F:→ slinh:就挂了不是吗? 01/05 15:21
6F:推 Neilhahaha:看看BddNode的Copy constructor之类的有没有错 01/05 15:35
7F:推 ric2k1:会挂在进去呼叫 getLevel() 时无法 dereference NULL 01/05 15:40
8F:→ ric2k1:真的, 把 debugger 叫出来一下就水落石出了! 01/05 15:40
9F:→ ric2k1:嫌 ddd 太慢可以试试 gdb 01/05 15:41
我发现是
BddNodeInt 转成_nodeV (用 _nodeV = size_t(n) + f;)
再转回来 用(BddNodeInt*)(_nodeV & BDD_NODE_PTR_MASK);
会变成0
阿...其实很想心虚的问一下_nodeV的功能和用法 因为好像找不到
为什麽这样转会错阿?
※ 编辑: slinh 来自: 140.112.4.192 (01/05 16:41)
10F:→ slinh:好像是UINT_MAX设错... 请问老师这要怎麽知道阿? 01/05 19:52
11F:推 ric2k1:cout 一下你的 UINT_MAX? 我觉得这里使用 UINT_MAX 好像 01/05 20:16
12F:→ ric2k1:不太好... 但是又没有 SIZE_T_MAX 之类的... 也许使用 01/05 20:17
13F:→ ric2k1:ULONG_MAX? 我来 research 一下... 01/05 20:18
14F:推 ric2k1:I mean if the pointer address of BddNodeInt* is greater 01/05 20:19
15F:→ ric2k1:than UINT_MAX, the (_nodeV & BDD_NODE_PTR_MASK) will 01/05 20:19
16F:→ ric2k1:result in invalid address. 01/05 20:20
17F:推 ric2k1:嗯, 如果你的 (_nodeV & BDD_NODE_PTR_MASK) 在 64-bit 01/05 20:23
18F:→ ric2k1:platform 有问题 (其实 ref code 这样写是不对的), 请试试 01/05 20:24
19F:→ ric2k1:看: #include <stdint.h>, 然後将 UINT_MAX 改成 SIZE_MAX 01/05 20:24
20F:推 timrau:#include <limits>, 然後用numeric_limits<size_t>::max() 01/05 20:42
21F:→ timrau:注意是<limits>不是<climits>喔,不一样的 01/05 20:42
22F:→ timrau:当然应该也可以直接~(size_t(0)) 01/05 20:43
23F:推 ric2k1:推 ~(size_t(0))... 想说不要那麽 hacky, 所以想找一个 01/05 20:54
24F:→ ric2k1:XX_MAX... 但是 SIZE_MAX 好像也不怎麽 portable... 01/05 20:54
25F:推 ric2k1:请试试 2561 篇之公告 01/05 22:00
26F:→ slinh:感谢老师的热心 不过我有搜INT, MAX找到之前某篇说要 01/06 00:11
27F:→ slinh:include <climits> 就ok了 01/06 00:11
28F:推 ric2k1:所以是改成 SIZE_MAX 吗? 01/06 01:00
29F:→ slinh:还是用UINT_MAX 01/06 12:48