После запуска программы через Valgrind я получил следующее сообщение:Valgrind - snprintf: Условный переход или шаг зависит от неинициализированного значения (ов)
==9290== Conditional jump or move depends on uninitialised value(s)
==9290== at 0x4E82A03: vfprintf (vfprintf.c:1661)
==9290== by 0x4EA9578: vsnprintf (vsnprintf.c:119)
==9290== by 0x4E8B531: snprintf (snprintf.c:33)
==9290== by 0x400820: _function (in /home/snp/prog/TEST)
==9290== by 0x4006D5: start (in /home/snp/prog/TEST)
==9290== by 0x40085C: main (in /home/snp/prog/TEST)
==9290== Uninitialised value was created by a heap allocation
==9290== at 0x4C2AB80: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==9290== by 0x400715: init (in /home/snp/prog/TEST)
==9290== by 0x400857: main (in /home/snp/prog/TEST)
Следующий код воспроизвести ошибку:
#include <net/if.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <syslog.h>
#define TARGET "8.8.8.8"
#define DEVICE "eth0"
static int _function(void);
struct remote
{
char *target;
char device[IFNAMSIZ];
};
struct remote * st_args;
int start(void)
{
return (_function());
}
int init(void)
{
st_args = malloc (sizeof (struct remote));
if (st_args == NULL)
return (-1);
st_args->target = malloc (sizeof (TARGET)+1);
if (st_args->target == NULL)
{
free (st_args);
return (-1);
}
strncpy(st_args->target, TARGET , sizeof(TARGET)-1);
strncpy(st_args->device, DEVICE, IFNAMSIZ-1);
return 0;
}
void stop(void)
{
if (st_args != NULL)
{
free (st_args->target);
free (st_args);
}
}
static int _function(void)
{
char cmd[256];
memset(cmd, 0, sizeof(cmd));
snprintf(cmd, sizeof(cmd), "ping -I %s %s", st_args->device, st_args->target);
return 0;
}
int main(int argc, char **argv)
{
init();
start();
stop();
return 0;
}
Я до сих пор не понимаю, почему valgrind не принимает команду snprintf
. Кроме того, массив содержит ожидаемую строку после выполнения строки.
Я полагаю, что valgrind не знает о состоянии 'st_args'? Возможно, попробуйте использовать локальный 'st_args'. – Jeremy
'strncpy (st_args-> target, TARGET, sizeof (TARGET) -1);' плохие привычки. (malloc делает ** не ** инициализирует память для всех нулей!) ... и аналогично для 'IFNAMSIZ-1' – joop
. Вы как-то недоумеваете, что используете подходящий инструмент для работы (' snprintf') и неправильный инструмент для любого задания ('strncpy'). –