【发布时间】:2021-05-28 08:20:56
【问题描述】:
我正在尝试解决 LeetCode 问题:#14 Longest Common Prefix。这是问题陈述:
编写一个函数来查找字符串数组中最长的公共前缀字符串。如果没有公共前缀,则返回一个空字符串“”。
在解决它时,我遇到了一些错误。从错误消息中,我了解到存在无效的内存操作。但是,仍然无法从错误消息中获得积分:
=================================================================
==29==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000110 at pc 0x55b10cc03190 bp 0x7fff30b617c0 sp 0x7fff30b617b0
READ of size 8 at 0x602000000110 thread T0
#1 0x7f5a70bb00b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
0x602000000111 is located 0 bytes to the right of 1-byte region [0x602000000110,0x602000000111)
allocated by thread T0 here:
#0 0x7f5a717f5bc8 in malloc (/lib/x86_64-linux-gnu/libasan.so.5+0x10dbc8)
#3 0x7f5a70bb00b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2)
Shadow bytes around the buggy address:
0x0c047fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff8000: fa fa 07 fa fa fa 05 fa fa fa 07 fa fa fa 07 fa
0x0c047fff8010: fa fa 04 fa fa fa 00 fa fa fa 04 fa fa fa 03 fa
=>0x0c047fff8020: fa fa[01]fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8060: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8070: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
Shadow gap: cc
==29==ABORTING
这是我的 C 代码:
#include <stdio.h>
#include <stdlib.h>
char *func(char ** strs, int strsSize){
char *ans = strs[0];
int n, i;
for(i = 1;i < strsSize;i++){
n = 0;
while(1){
if(ans[n] == strs[i][n]){
n++;
}
else{
break;
}
}
ans[n] = '\0';
}
return ans;
}
int main()
{
char *s[] = {"flower","flow","flight"};
printf("%s", func(s, 3));
return 0;
}
有谁知道我错在哪里?
【问题讨论】:
-
无法从错误信息中获得分数。什么错误信息?如果您询问具体错误,请显示它们。对于初学者,
s数组中的字符串是文字,不可写。所以ans[n] = '\0';在尝试写入文字时是未定义的行为。 -
开启编译器警告。他们会指出你的问题。如果您仍然遇到问题,请发表评论,我会提供更多帮助。
-
抱歉,这篇文章不允许我写太多代码内容。错误消息是关于堆缓冲区溢出的。或者有什么方法可以提供大量错误消息?
-
@scorerhsu 我可以看到带有错误消息的编辑。您发布的代码没有堆分配(malloc),所以我很困惑。您发布的代码是否显示错误?
标签: c memory runtime-error address-sanitizer