2013-02-23 4 views
1

Я занимаюсь некоторыми работами на Olimex LPC2378-STK.strncpy вызывает LPC-2378, чтобы висеть/умереть

У меня есть следующее объявление.

unsigned char buffer[256]; 

Я затем попытаться сделать:

strncpy((char *)buffer, "CREATED_BY", 255); 

Кто-нибудь знает, почему это может вызвать проблему.

Если я прокомментирую строку кода, она работает без проблем, но использование ее, похоже, заставляет программу умереть.

У кого-нибудь есть идеи?

+1

Здесь нет смысла использовать 'strncpy'.Возможно, вы избежите потенциального переполнения буфера, но его буфер не достаточно велик, и у вас будет другая проблема. Однако не похоже, что это причина проблемы. –

+2

Я не вижу проблемы с этим, иначе это бессмысленность. Если вы собираетесь использовать 'strncpy()', вы должны помнить, что он всегда пишет N символов, где N - последний параметр. **. Если длина исходной строки, включая нулевой ограничитель, меньше N, то она будет заполнять оставшееся пространство до N с помощью 0. Если он длиннее, он копирует до N символов и НЕ устанавливает последний символ равным 0. Но он * всегда * пишет N символов так или иначе. Я думаю, что у вас может быть другая проблема, которая перегружается в * этот * буфер и, возможно, что 0-clear подвергает этой проблеме. – WhozCraig

+0

Спасибо, ребята, я удивленно почесывал голову. Точка о чем-то другом ovrrunning хороша. Учитывая ограничения платы и пространства стека, это, возможно, проблема. Время от времени отлаживается. – IainS

ответ

5

В коде, который вы опубликовали, ничего не происходит, но он не имеет контекста. Например, если buffer[] является локальной переменной, она будет создана в стеке, и возможно, что вы переполняете стек.

Вы можете объявить его статическим, чтобы узнать, не исчезла ли проблема, которая проверила бы переполнение стека. Если переменная должна быть временной, вам нужно будет выделить достаточно больший стек.

Обратите внимание, что переполнение стека может не происходить специально на strncpy. buffer может содержаться в стеке, но его размер может вытолкнуть другие объекты за стек, так что запись в их вызывает повреждение стека. Точка отказа обычно возникает, когда функция пытается вернуться с использованием поврежденного обратного адреса. Вы действительно должны использовать отладчик для ввода кода, чтобы узнать, что происходит с стеком вызовов, указателем стека и сбоем функции на strncpy или, вернее, при возврате вызывающей функции.

Один пункт о безопасности кода и ремонтопригодности, вы должны отдать предпочтение:

strncpy((char *)buffer, "CREATED_BY", sizeof(buffer) - 1); 

Вы могли бы также более удобно использовать Инициализатора:

unsigned char buffer[256] = "CREATED_BY" ; 
+0

+1 Я думаю, что он определенно переполняет что-то, что трудно сказать. Спекуляция - это что-то другое, «работающее» за счет заимствования этого пространства в этом буфере через UB, а 'strncpy()' (с его хвостом-заполнением .. = P ) перешагнул таинственный слизь, который был там. – WhozCraig

1

Много вещей может пойти не так с strncpy:

  1. Вы пытаетесь записать в память, которую вы не выделили, имеет NULL-адрес или у вас нет разрешения (отличное от char * очень подозрительно),
  2. Содержимое вашего буфера не завершено нулем
  3. Вы переполняете свой буфер, перезаписывая что-то.

Используйте отладчик.

0

Я занимался тем же вопросом, о котором вы сообщаете.

Что случилось со мной, так это то, что я не настроил код запуска (если используется keil), чтобы зарезервировать место для памяти HEAP. Функция семейства printf использует malloc и free, поэтому пространство HEAP является обязательным.

Если вы используете GCC, проблема в том, что вы неправильно настроили newlib. Проверьте кучу.

+0

Спасибо за ваш комментарий. Я фактически исправил проблему, это был конфликт между дополнительной библиотекой, которая мне больше не нужна, и реализацией sha-256. – IainS

+0

Да, это может быть проблемой со многими функциями встроенных таргетами с открытым металлом, но strncpy не является ни «функцией семейства printf», ни той, которая должна выделять память. –

+0

Очень умный @ ChrisStratton, я не заметил замешательство, которое я сделал. Благодарю. –

Смежные вопросы