awk: malloc(): memory corruption 错误

问题如下:
*** glibc detected *** awk: malloc(): memory corruption: 0x080c67f8 ***
======= Backtrace: =========
/lib/tls/i686/cmov/libc.so.6[0xb7e35356]
/lib/tls/i686/cmov/libc.so.6[0xb7e3655a]
/lib/tls/i686/cmov/libc.so.6(realloc+0x10b)[0xb7e3875b]
awk[0x80569d5]
awk[0x805430a]
awk[0x805453c]
awk[0x805465e]
awk[0x8054a11]
awk[0x804dec1]
awk[0x804ce0d]
/lib/tls/i686/cmov/libc.so.6(__libc_start_main+0xe0)[0xb7ddf450]
awk[0x8048fa1]
======= Memory map: ========
08048000-0805e000 r-xp 00000000 08:02 7468 /usr/bin/mawk
0805e000-08060000 rw-p 00015000 08:02 7468 /usr/bin/mawk
08060000-080e6000 rw-p 08060000 00:00 0 [heap]
b7c00000-b7c21000 rw-p b7c00000 00:00 0
b7c21000-b7d00000 ---p b7c21000 00:00 0
b7dbc000-b7dc6000 r-xp 00000000 08:02 10377 /lib/libgcc_s.so.1
b7dc6000-b7dc7000 rw-p 0000a000 08:02 10377 /lib/libgcc_s.so.1
b7dc7000-b7dc9000 rw-p b7dc7000 00:00 0
b7dc9000-b7f12000 r-xp 00000000 08:02 2372 /lib/tls/i686/cmov/libc-2.7.so
b7f12000-b7f13000 r--p 00149000 08:02 2372 /lib/tls/i686/cmov/libc-2.7.so
b7f13000-b7f15000 rw-p 0014a000 08:02 2372 /lib/tls/i686/cmov/libc-2.7.so
b7f15000-b7f18000 rw-p b7f15000 00:00 0
b7f18000-b7f3b000 r-xp 00000000 08:02 6015 /lib/tls/i686/cmov/libm-2.7.so
b7f3b000-b7f3d000 rw-p 00023000 08:02 6015 /lib/tls/i686/cmov/libm-2.7.so
b7f52000-b7f54000 rw-p b7f52000 00:00 0
b7f54000-b7f55000 r-xp b7f54000 00:00 0 [vdso]
b7f55000-b7f6f000 r-xp 00000000 08:02 70920 /lib/ld-2.7.so
b7f6f000-b7f71000 rw-p 00019000 08:02 70920 /lib/ld-2.7.so
bfc1e000-bfc33000 rw-p bffeb000 00:00 0 [stack]

经过多次的调试,发现是由于访问array类型的数据时引起的问题。 array中可能存在元素没有值或者初始化,比如 array[100]没有赋值(或分配内存空间),如果程序访问array[100]时,就会导致内存溢出错误。

一般初始化array的值,就不会出现这类问题了。 不初始化会导致内存溢出out of bound,所以会memory corruption。因为awk中NUL和0是一样的,如果不初始化的话,整数类型的array中的空值为NUL,而不是0。 如果printf NUL,打印结果为0。

并且在awk中空值NUL或者空格,与0比较的话是小于0的。
BEGIN{
p =" "
}
END{
if(p < 0)
printf(" print: p%s p", p);
}

打印结果为: print: p p
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值