generator.visit pycparser 在 Ubuntu 16.04.3 中显示错误输出
generator.visit of pycparser displaying wrong output in Ubuntu 16.04.3
我使用 pycparser 和 pycparserext 编写了以下程序:
from pycparser import parse_file,c_parser, c_ast, c_generator
from pycparserext.ext_c_parser import GnuCParser
content="int main() { int x = 1; int y = 0; while (y < 1000 && __VERIFIER_nondet_int()) { x = x + y; y = y + 1; } __VERIFIER_assert(x >= y); return 0;}"
text = r""" """+content
parser = GnuCParser()
ast = parser.parse(text)
generator = c_generator.CGenerator()
print str(generator.visit(ast))
当我 运行 Mac 中的代码时,它 returns 正确的输出。但是当我 运行 Ubuntu 16.04.3 中的相同代码时 returns 以下不正确的输出(缺少 'main()':
int{
int x = 1;
int y = 0;
while ((y < 1000) && __VERIFIER_nondet_int())
{
x = x + y;
y = y + 1;
}
__VERIFIER_assert(x >= y);
return 0;
}
导致此错误输出的原因是什么?
这可能是 pycparserext
的问题。使用从 Github 克隆的香草 pycparser,我得到(运行 从主 pycparser 目录):
$ cat /tmp/2.c
int main() { int x = 1; int y = 0; while (y < 1000 && __VERIFIER_nondet_int()) { x = x + y; y = y + 1; } __VERIFIER_assert(x >= y); return 0;}
$ PYTHONPATH=. python examples/c-to-c.py /tmp/2.c
int main()
{
int x = 1;
int y = 0;
while ((y < 1000) && __VERIFIER_nondet_int())
{
x = x + y;
y = y + 1;
}
__VERIFIER_assert(x >= y);
return 0;
}
所以我建议你打开一个issue for pycparserext
我使用 pycparser 和 pycparserext 编写了以下程序:
from pycparser import parse_file,c_parser, c_ast, c_generator
from pycparserext.ext_c_parser import GnuCParser
content="int main() { int x = 1; int y = 0; while (y < 1000 && __VERIFIER_nondet_int()) { x = x + y; y = y + 1; } __VERIFIER_assert(x >= y); return 0;}"
text = r""" """+content
parser = GnuCParser()
ast = parser.parse(text)
generator = c_generator.CGenerator()
print str(generator.visit(ast))
当我 运行 Mac 中的代码时,它 returns 正确的输出。但是当我 运行 Ubuntu 16.04.3 中的相同代码时 returns 以下不正确的输出(缺少 'main()':
int{
int x = 1;
int y = 0;
while ((y < 1000) && __VERIFIER_nondet_int())
{
x = x + y;
y = y + 1;
}
__VERIFIER_assert(x >= y);
return 0;
}
导致此错误输出的原因是什么?
这可能是 pycparserext
的问题。使用从 Github 克隆的香草 pycparser,我得到(运行 从主 pycparser 目录):
$ cat /tmp/2.c
int main() { int x = 1; int y = 0; while (y < 1000 && __VERIFIER_nondet_int()) { x = x + y; y = y + 1; } __VERIFIER_assert(x >= y); return 0;}
$ PYTHONPATH=. python examples/c-to-c.py /tmp/2.c
int main()
{
int x = 1;
int y = 0;
while ((y < 1000) && __VERIFIER_nondet_int())
{
x = x + y;
y = y + 1;
}
__VERIFIER_assert(x >= y);
return 0;
}
所以我建议你打开一个issue for pycparserext