C - 条件跳转 (valgrind)
C - conditional jump (valgrind)
我不明白 valgrind 的条件跳转,我做了这个小函数,但即使它很小,也有这个条件跳转
函数如下:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char *function(char *str)
{
int i = 0;
int a = 0;
char *cpy;
cpy = malloc(100);
while (str[i] != '[=10=]')
{
if (str[i] == 'a')
cpy[a++] = 'b';
i++;
}
return (cpy);
}
int main(int ac, char **av)
{
char *str;
str = function(av[1]);
printf("%s\n", str);
}
当我像这样使用 valgrind 时
valgrind ./a.out "aa aa aaaaaaaaaaa"
它给了我 1 个错误
==3397== Conditional jump or move depends on uninitialised value(s)
==3397== at 0x4C2E4E8: strlen (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==3397== by 0x4EA1531: puts (in /lib64/libc-2.24.so)
==3397== by 0x400609: main (in /home/benoit.pingris/train/a.out)
这是什么意思?
谢谢
首先,它有助于使用调试符号编译程序(使用 -g
选项)。这样,Valgrind 就能够产生更有帮助的诊断。
条件跳转不会发生在您的代码中,而是在 main()
末尾调用 printf()
时发生。原因是您分配了变量 cpy
,但这并没有初始化它的内存。然后,对于在 str
中看到的每个 'a'
,您将字符 'b'
复制到 cpy
。但是,您没有在 cpy
的末尾添加 NUL-terminator。当您尝试打印 cpy
时,C 库中的某些内容将因此读取超过 cpy
的初始化部分,从而触发来自 Valgrind 的错误消息。
要么自己添加一个NUL-terminator(在return
之前添加cpy[a] = '[=21=]';
),要么使用calloc()
代替malloc()
。
我不明白 valgrind 的条件跳转,我做了这个小函数,但即使它很小,也有这个条件跳转
函数如下:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
char *function(char *str)
{
int i = 0;
int a = 0;
char *cpy;
cpy = malloc(100);
while (str[i] != '[=10=]')
{
if (str[i] == 'a')
cpy[a++] = 'b';
i++;
}
return (cpy);
}
int main(int ac, char **av)
{
char *str;
str = function(av[1]);
printf("%s\n", str);
}
当我像这样使用 valgrind 时
valgrind ./a.out "aa aa aaaaaaaaaaa"
它给了我 1 个错误
==3397== Conditional jump or move depends on uninitialised value(s)
==3397== at 0x4C2E4E8: strlen (in /usr/lib64/valgrind/vgpreload_memcheck-amd64-linux.so)
==3397== by 0x4EA1531: puts (in /lib64/libc-2.24.so)
==3397== by 0x400609: main (in /home/benoit.pingris/train/a.out)
这是什么意思? 谢谢
首先,它有助于使用调试符号编译程序(使用 -g
选项)。这样,Valgrind 就能够产生更有帮助的诊断。
条件跳转不会发生在您的代码中,而是在 main()
末尾调用 printf()
时发生。原因是您分配了变量 cpy
,但这并没有初始化它的内存。然后,对于在 str
中看到的每个 'a'
,您将字符 'b'
复制到 cpy
。但是,您没有在 cpy
的末尾添加 NUL-terminator。当您尝试打印 cpy
时,C 库中的某些内容将因此读取超过 cpy
的初始化部分,从而触发来自 Valgrind 的错误消息。
要么自己添加一个NUL-terminator(在return
之前添加cpy[a] = '[=21=]';
),要么使用calloc()
代替malloc()
。