C Valgrind报告了snprintf调用的错误

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")

我有一个非常简单的程序,当我运行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");
    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: