Как этот фрагмент C мог быть записан более безопасно?

это также иногда помогает мне:

adb kill-server 
adb start-server

и телефон или эмулятор переподключается к adb

5
задан HostileFork 28 September 2012 в 01:01
поделиться

10 ответов

char   somestring[] = "Send money!\n";
char   *copy;
size_t copysize;

copysize = strlen(somestring)+1;
copy = (char *) malloc(copysize);
if (copy == NULL)
    bail("Oh noes!\n");

strncpy(copy, somestring, copysize);
printf("%s", copy);

Отличия, отмеченные выше :

  • Результат malloc () должен быть проверен!
  • Вычислить и сохранить размер памяти!
  • Используйте strncpy () , потому что strcpy () непослушный. В этом надуманном примере это не повредит, но не входите в привычку его использовать.

РЕДАКТИРОВАТЬ:

Тем, кто думает, что я должен использовать strdup () ... работает только в том случае, если вы занимаетесь самым узким взглядом на вопрос. Это не только глупо, это

4
ответ дан 18 December 2019 в 06:36
поделиться

Я не могу комментировать ответы выше, но в дополнение к проверке код возврата и использование strncpy , вы никогда не должны делать:

printf(string)

Но используйте:

printf("%s", string);

ref: http://en.wikipedia.org/wiki/Format_string_attack

7
ответ дан 18 December 2019 в 06:36
поделиться
char somestring[] = "Send money!\n";
char *copy = strdup(something);

if (copy == NULL) {
    // error
}

или просто поместите эту логику в отдельную функцию xstrdup :

char * xstrdup(const char *src) 
{
    char *copy = strdup(src);

    if (copy == NULL) {
       abort();
    }

    return copy;
}
6
ответ дан 18 December 2019 в 06:36
поделиться

Крик ... используйте strdup () , как все сказали, и напишите его сами, если нужно. Поскольку у вас есть время подумать об этом сейчас ... ознакомьтесь с 25 наиболее опасными ошибками программирования в Mitre , а затем подумайте, почему фраза printf (copy) не должна никогда появляются в коде. Это прямо там с malloc (strlen (str)) с точки зрения абсолютного зла, не говоря уже о головной боли, связанной с отслеживанием того, почему это вызывает много горя, когда копия выглядит как "% s% n " ...

3
ответ дан 18 December 2019 в 06:36
поделиться
  1. strlen + 1, для терминатора \ 0
  2. malloc может не работать; всегда проверяйте возвращаемое значение malloc
3
ответ дан 18 December 2019 в 06:36
поделиться

Я бы прокомментировал предыдущие решения, но мне не хватает репутации. Использование strncpy здесь так же неправильно, как и использование strcpy (поскольку нет абсолютно никакого риска переполнения). В есть функция memcpy , и она предназначена именно для этого. Это не только значительно быстрее, но и правильная функция, которую можно использовать для копирования строк известной длины в стандарте C.

Из принятого ответа:

char   somestring[] = "Send money!\n";
char   *copy;
size_t copysize;

copysize = strlen(somestring)+1;
copy = (char *) malloc(copysize);
if (copy == NULL)
    bail("Oh noes!\n");

memcpy(copy, somestring, copysize); /* You don't use str* functions for this! */
printf("%s", copy);
1
ответ дан 18 December 2019 в 06:36
поделиться

, чтобы добавить больше к способам Адриана Маккарти сделать более безопасный код,

Используйте статический анализатор кода, они очень хороши для обнаружения ошибок такого рода

1
ответ дан 18 December 2019 в 06:36
поделиться

Лучший способ написать это более безопасно, если кто-то действительно заинтересован в этом, - это написать его на Аде.

somestring : constant string := "Send money!";
declare
   copy : constant string := somestring;
begin
   put_line (somestring);
end;

Тот же результат, так каковы различия ?

  • Все делается в стеке (без указателей). Перераспределение автоматический и безопасный.
  • Все автоматически проверяется по дальности, поэтому нет возможности переполнения буфера exploits
  • Обе строки являются константами, так что нет шансов облажаться и модифицируя их.
  • Вероятно, он будет быстрее , чем C, не только из-за отсутствия динамического распределения, но и потому, что не будет дополнительного сканирования строки, требуемого strlen () .

Обратите внимание, что в Аде «строка» не является какой-то специальной динамической конструкцией. Это встроенный массив символов. Однако массивы Ada могут иметь размер при объявлении по массиву, который вы им назначаете.

0
ответ дан 18 December 2019 в 06:36
поделиться

Более безопасным способом было бы использовать strncpy вместо strcpy . Эта функция принимает третий аргумент: длину копируемой строки. Это решение не выходит за рамки ANSI C, так что это будет работать во всех средах (тогда как другие методы могут работать только в POSIX-совместимых системах).

char somestring[] = "Send money!\n";
char *copy;

copy = (char *) malloc(strlen(somestring));

strncpy(copy, somestring, strlen(somestring));
printf(copy);
-2
ответ дан 18 December 2019 в 06:36
поделиться

Способы сделайте код более безопасным (и более правильным).

  1. Не делайте ненужную копию. В этом примере нет очевидного требования, что вам действительно нужно копировать somestring . Вы можете вывести его напрямую.
  2. Если вам нужно сделать копию строки, напишите функцию для этого (или используйте strdup, если она у вас есть). Тогда вам нужно только исправить это в одном месте.
  3. По возможности инициализируйте указатель на копию сразу после ее объявления.
  4. Не забудьте выделить место для нулевого терминатора.
  5. Не забудьте проверить возвращаемое значение из malloc .
  6. Не забудьте освободить память malloc .
  7. Не вызывать printf с ненадежной строкой формата. Используйте printf ("% s", copy) или put (copy) .
  8. Используйте объектно-ориентированный язык со строковым классом или любой язык со встроенной поддержкой строк чтобы избежать большинства этих проблем.
1
ответ дан 18 December 2019 в 06:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: