Одной из возможных проблем является то, что ваш первый memcpy()
вызов не обязательно приведет к завершению строкой с нулевым символом, поскольку вы не копируете терминатор '\ 0' из l->db.param_value.val
:
Таким образом, когда во втором вызове memcpy()
вызывается strlen(g->db_cmd)
, он может возвращать что-то полностью поддельное. Является ли это проблемой, зависит от того, инициализирован ли буфер g->db_cmd
нулями или нет.
Почему бы не использовать strcat()
, который был сделан, чтобы делать именно то, что вы пытаетесь сделать с memcpy()
?
if (strlen(g->db_cmd) < MAX_DB_CMDS )
{
strcat( g->db_cmd, l->db.param_value.val);
strcat( g->db_cmd, l->del_const);
g->cmd_ctr++;
}
Это будет иметь преимущество в том, что кому-то будет легче читать. Вы можете подумать, что это будет менее производительно, но я так не думаю, поскольку вы делаете явно несколько вызовов strlen()
. В любом случае, я бы сначала сконцентрировался на правильном подходе, а потом беспокоился о производительности. Неправильный код настолько неоптимизирован, насколько вы можете его получить - сделайте это правильно, прежде чем быстро. На самом деле, моим следующим шагом было бы не улучшить производительность кода, а улучшить код, чтобы уменьшить вероятность переполнения буфера (я бы, вероятно, переключился на использование чего-то вроде strlcat()
вместо strcat()
).
Например, если g->db_cmd
является массивом символов (а не указателем), результат может выглядеть следующим образом:
size_t orig_len = strlen(g->db_cmd);
size_t result = strlcat( g->db_cmd, l->db.param_value.val, sizeof(g->db_cmd));
result = strlcat( g->db_cmd, l->del_const, sizeof(g->db_cmd));
g->cmd_ctr++;
if (result >= sizeof(g->db_cmd)) {
// the new stuff didn't fit, 'roll back' to what we started with
g->db_cmd[orig_len] = '\0';
g->cmd_ctr--;
}
Если strlcat()
не является частью вашей платформы, его можно легко найти в сети. Если вы используете MSVC, есть функция strcat_s()
, которую вы можете использовать вместо этого (но учтите, что она не эквивалентна strlcat()
- вам придется изменить способ проверки и обработки результатов вызова strcat_s()
).