Одна из возможных проблем заключается в том, что ваш первый вызов memcpy()
не обязательно приведет к строке с завершающим нулем, поскольку вы не копируете терминатор '\0' из l->db.param_value.val
:
Поэтому, когда strlen(g->db_cmd)
вызывается во втором вызове memcpy()
, он может возвращать что-то совершенно фиктивное. Является ли это проблемой, зависит от того, инициализирован ли буфер 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()
).
person
Michael Burr
schedule
03.08.2011