C Valgrind报告了snprintf调用的错误
我有一个非常简单的程序,当我运行valgrind进行堆栈溢出检测--tool=exp sgcheck时,它会在snprintf调用中报告“大小为1的无效读取”错误。我想不出原因 这是示例程序C Valgrind报告了snprintf调用的错误,c,valgrind,C,Valgrind,我有一个非常简单的程序,当我运行valgrind进行堆栈溢出检测--tool=exp sgcheck时,它会在snprintf调用中报告“大小为1的无效读取”错误。我想不出原因 这是示例程序 #include<string.h> #include<stdio.h> int main( void) { char path[128]; char cmd[128]; char cmd2[128]; strcpy(cmd,"Command 1")
#include<string.h>
#include<stdio.h>
int main( void)
{
char path[128];
char cmd[128];
char cmd2[128];
strcpy(cmd,"Command 1");
strcpy(cmd2,"Command 2");
snprintf(path, sizeof(path),"%s/%s", cmd , cmd2);
return 0;
}
我使用gcc(gcc)4.8.3和-g标志在CentOS 7上编译程序(gcc-g test.c-o test)
当在堆而不是堆栈上分配cmd和cmd2时,错误也会消失
谢谢 注意这是实验性的。这意味着它可能包含bug。我看你的代码是正确的。如果cmd和cmd2被声明为静态(
static char cmd[128];
)会发生什么?如果将sizeof(path)
替换为sizeof(path)/2
,会发生什么情况?如果path
声明为静态,或在堆上分配,会发生什么情况?snprintf()的返回值是多少?我希望是19岁。然而,这是一个值得怀疑的问题,这只是另一个容易辨别的事实。将cmd和cmd2声明为static(static char cmd[128])仍然会导致错误,路径也会发生同样的错误,无论路径是在堆或堆栈上创建的,还是在static valgrind上创建的,都会抛出相同的错误。只有在堆上创建cmd和cmd2时,错误才会消失。这意味着它可能包含bug。我看你的代码是正确的。如果cmd和cmd2被声明为静态(static char cmd[128];
)会发生什么?如果将sizeof(path)
替换为sizeof(path)/2
,会发生什么情况?如果path
声明为静态,或在堆上分配,会发生什么情况?snprintf()的返回值是多少?我希望是19岁。然而,这是一个值得怀疑的问题,这只是另一个容易辨别的事实。将cmd和cmd2声明为static(static char cmd[128])仍然会导致错误,路径也会发生同样的错误,无论路径是在堆或堆栈上创建的,还是在static valgrind上创建的,都会抛出相同的错误。只有在堆上创建cmd和cmd2时,错误才会消失。
58 --112952-- REDIR: 0x4eb72d0 (libc.so.6:__GI_strrchr) redirected to 0x4c2b0d0 (__GI_strrchr)
59 ==112952== Invalid read of size 1
60 ==112952== at 0x4E77A94: vfprintf (in /usr/lib64/libc-2.17.so)
61 ==112952== by 0x4EA4078: vsnprintf (in /usr/lib64/libc-2.17.so)
62 ==112952== by 0x4E80CB1: snprintf (in /usr/lib64/libc-2.17.so)
63 ==112952== by 0x4005B1: main (test.c:13)
64 ==112952== Address 0xffefffc40 expected vs actual:
65 ==112952== Expected: stack array "cmd" of size 128 in frame 3 back from here
66 ==112952== Actual: stack array "cmd2" of size 128 in frame 3 back from here
67 ==112952== Actual: is 128 before Expected
68 ==112952==
69 --112952-- REDIR: 0x4eaf550 (libc.so.6:free) redirected to 0x4c299c6 (free)
70 ==112952==
71 ==112952== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 0 from 0)
72 ==112952==
73 ==112952== 1 errors in context 1 of 1: