【发布时间】:2014-09-02 11:26:35
【问题描述】:
我有一个 C++ 程序,它调用一些由 Flex / Bison 生成的 C 例程。
当我以 Windows 8.1 64 位平台为目标时,我在运行时遇到以下异常:
Unhandled exception at 0x0007FFFA70F2C39 (libapp.dll) in application.exe: 0xC0000005:
Access violation writing location 0x000000005A818118.
我将此异常追溯到以下代码:
YY_BUFFER_STATE yy_create_buffer( FILE *file, int size )
{
YY_BUFFER_STATE b;
b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) );
if ( ! b )
YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" );
b->yy_buf_size = size; // This access is what throws the exception
}
作为参考,在代码的其他地方(也由 Flex / Bison 生成),我们有:
typedef struct yy_buffer_state *YY_BUFFER_STATE;
struct yy_buffer_state
{
FILE *yy_input_file;
char *yy_ch_buf;
char *yy_buf_pos;
yy_size_t yy_buf_size;
// ... other fields omitted,
// total struct size is 56 bytes
}
static void *yy_flex_alloc( yy_size_t size )
{
return (void *) malloc( size );
}
我回溯到malloc 调用并观察到malloc 本身正在返回地址0x000000005A818118。我也查了errno,但是调用malloc之后没有设置。
我的问题是:为什么malloc 给我一个我无法访问的地址,我怎样才能让它给我一个正确的地址?
注意:我只在 Windows 8.1 64 位中观察到这种行为。它与其他 32 位 Windows 变体以及 Windows 7 32 位一起通过。
编译信息:我在使用 Visual Studio 2012 的 64 位 Windows 8.1 机器上编译。
如果有帮助,这里是反汇编代码:
// b = (YY_BUFFER_STATE) yy_flex_alloc( ... )
0007FFFA75E2C12 call yy_flex_alloc (07FFFA75E3070h)
0007FFFA75E2C17 mov qword ptr [b],rax
// if ( ! b ) YY_FATAL_ERROR( ... )
0007FFFA75E2C1C cmp qword ptr [b],0
0007FFFA75E2C22 jne yy_create_buffer+30h (07FFFA75E2C30h)
0007FFFA75E2C24 lea rcx,[yy_chk+58h (07FFFA7646A28h)]
0007FFFA75E2C2B call yy_fatal_error (07FFFA75E3770h)
// b->yy_buf_size = size
0007FFFA75E2C30 mov rax,qword ptr [b]
0007FFFA75E2C35 mov ecx,dword ptr [size]
0007FFFA75E2C39 mov dword ptr [rax+18h],ecx
谢谢!
【问题讨论】:
-
我多次重新运行该段,
malloc要么返回00000000--------要么返回FFFFFFFF--------以获得“分配”空间的地址。 -
很可能,其他一些看似无关的代码部分已经设法破坏了堆(例如,通过溢出堆分配的缓冲区)。您正在查看的代码部分是无辜的受害者。
-
您的程序遇到堆损坏情况。你可以参考这篇文章的帖子:stackoverflow.com/a/22074401/2724703
-
定义
yy_flex_alloc的文件是否包含stdlib?如果不是,它很可能会将来自malloc的返回值视为一个 int 并且强制转换隐藏它。 -
@Art:定义
yy_flex_alloc()的文件确实包含#include <stdlib.h>。该文件由 Flex 自动生成。
标签: c++ c visual-studio-2010 malloc flex-lexer