g ++ + strncat: может переполнить целевой буфер - PullRequest
1 голос
/ 12 декабря 2010

Мне нужно включить функцию C в мою программу C ++, при компиляции кода с помощью g ++ я получаю следующее предупреждение:

In function ‘char* strncat(char*, const char*, size_t)’,
    inlined from ‘int get_usage(pid_t, pstat*)’ at src/getusage.c:24:
/usr/include/bits/string3.h:154: warning: call to
char* __builtin___strncat_chk(char*, const char*, long unsigned int,
long unsigned int) might overflow destination buffer

Код:

int pidof(const char* process_name){
char cmd[50] ="pidof ";
strncat(cmd, process_name, sizeof(cmd) - strlen(cmd) -1); 
[..]

Как мне избавиться от этого предупреждения?

Ответы [ 2 ]

1 голос
/ 13 декабря 2010

Из оставленного комментария:

ошибка была при другом использовании strncat, когда я только передал размер буфера в качестве параметра размера => исправлено

strlcat() представляет более простой интерфейс для типа выполняемой конкатенации, разработанный для предотвращения именно такого типа ошибок (забывая учитывать длину строки, уже находящейся в буфере) .

Если ваш набор инструментов не имеет его, версия OpenBSD имеет довольно либеральную лицензию, и если вы по какой-либо причине не можете включить ее, это довольно простая функция для реализации самостоятельно (просто убедитесь, что тестировали условия, если вы идете по этому маршруту). Сделайте это один раз, и вы сможете избежать ошибок, вызванных неправильным использованием strncat() навсегда. Типы ошибок, с которыми вы можете столкнуться при неправильном использовании strlcat(), вероятно, будут менее серьезными (забывать проверять усечение обычно меньше проблем, чем переполнения буфера).

1 голос
/ 12 декабря 2010

Ваш код безопасен (я думаю), но функцию strncat() безопасно использовать, только если вы знаете длину:

  1. буфер
  2. материал уже в буфере

Если вы также знаете длину добавляемого материала и она меньше доступного пространства, вы можете просто использовать memmove(); если он длиннее, вы должны сообщить, что его усекаете; если вы не знаете длину добавляемого материала, возможно, вам следует (так что вы можете сообщить, что что-то усекаете), но если это неудобно, вы все равно можете использовать memmove() и добавить ноль в конец буфера для обеспечения нулевого завершения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...