【发布时间】:2013-07-16 05:23:52
【问题描述】:
我编写了一个命令行实用程序,用于从 DXF 文件中提取文本。我的实用程序被命名为drawingtotext。假设这样的目录结构(Linux OS):
/home/dave/dxfs/
在 dxfs 文件夹中有一堆 DXF 文件。从那个位置,假设存在一个名为“P1-1522-YI-WD-0403r1.dxf”的文件,像这样运行drawingtotext会失败:
drawingtotext P1-1522-YI-WD-0403r1.dxf
有错误:Segmentation fault (core dumped)
运行 drawingtotext ~/dxfs/P1-1522-YI-WD-0403r1.dxf 给了我我期望的结果,最后加上这个:
*** Error in 'drawingtotext': free(): invalid next size (fast): 0x0000000002031170 ***
带有回溯和巨大的内存映射。
现在,将该文件向上移动到一个目录(/home/dave/ 而不是 /home/dave/dxfs/)会得到我正在寻找的结果而没有错误。将文件重命名为“mydxf.dxf”之类的名称并将其保存在 /home/dave/dxfs/ 中也可以解决此问题。
我的问题是文件的位置如何以及为什么会改变我的程序的行为,我该如何解决?
代码在这里:http://www.github.com/davidworkman9/drawingtotext/
主文件名为“AutoCADConverter.cpp”
【问题讨论】:
-
一个明显的问题是您没有正确管理资源,使用 RAII。您正在使用拥有原始指针和
new/delete。请改用std::unique_ptr。 -
大部分代码不是我写的,它是我修改的一个实用程序,让它做我想做的事情,它是在智能指针成为标准的一部分之前编写的。话虽如此,我的问题是如何简单地更改文件名来解决问题?
-
程序很可能在某处有未定义的行为,因此看似无害的输入差异会导致出乎意料的不同输出。例如,更改输入文件名长度可能会更改缓冲区的大小,并且根据缓冲区的大小,可能会发生或不发生一些潜在的越界访问。
-
有一些工具可以帮助找出问题所在;您可以将编译器上的警告级别调高以捕捉一些简单的事情;如果您的编译器提供或您可以访问静态分析器,它可能会发现更复杂的问题。还有一些工具可以让您的程序动态检测 UB,例如 clang's
-fsanitizetools 或 valgrind。
标签: c++ linux command-line command-line-arguments dxf