le-greem 0 4 июля, 2011 Опубликовано 4 июля, 2011 · Жалоба Добрый день. У меня при работе со строками в контроллере LPC2378 время от времени возникает ошибка "Can't access memory at <адрес строки> " и контроллер зависает. Работа осуществляется, в основном, с помощью библиотечных функций "string.h". Изначально грешил на watchdog, пробовал отключать его следующим образом: #define WATCHDOG_BASE 0x40000000 // Watchdog`s define base address #define WDT_O_LOCK 0x00000C00 // Lock register #define HWREG(x) (*((volatile unsigned long *)(x))) void WatchdogLock(void) { HWREG(WATCHDOG_BASE + WDT_O_LOCK) = WDT_LOCK_LOCKED; } Но действие эффекта не возымело. Может кто-нибудь сталкивался с этой проблемой. В чем может быть дело? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 4 июля, 2011 Опубликовано 4 июля, 2011 · Жалоба В чем может быть дело? На 90% в параметрах, которые получают функции из библиотеки "string.h". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
le-greem 0 4 июля, 2011 Опубликовано 4 июля, 2011 · Жалоба На 90% в параметрах, которые получают функции из библиотеки "string.h". Библиотека стандартная, компилятор Кейла, все параметры тоже соответствуют описанным в библиотеке. Вызов осуществляется: strcmp(RcvSipSettings.RequestType, cOK) , где const char cOK[] = "200"; и struct //параметры принятые из порта { ... char RequestType[20]; ... } strcpy(RcvSipSettings.RequestType, RequestIdentify(FindStr)); Все сравнивается нормально первые раз-два(смотрел дебаггером), но, как правило, на третий происходит ошибка и возникает зависание. Не могли бы Вы пояснить каких параметрах может быть ошибка? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 4 июля, 2011 Опубликовано 4 июля, 2011 · Жалоба каких параметрах может быть ошибка? 1. Зря Вы занялись замусориванием форума кросспостами. 2. RcvSipSettings.RequestType не является указателем на существующую область памяти или не является указателем на строку в результате чего при поиске вылетает за пределы существующей памяти. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
le-greem 0 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба 1. Зря Вы занялись замусориванием форума кросспостами. Честно говоря мыслей "замусоривать" не было, но раз уж так получилось то примите мои извинения. :) 2. RcvSipSettings.RequestType не является указателем на существующую область памяти или не является указателем на строку в результате чего при поиске вылетает за пределы существующей памяти. Не могли бы Вы поподробнее объяснить ситуацию, ибо способа как побороть ее я не нашел... Дело в том, что ошибка возникает при выходе из функции вида: char *RequestIdentify(char *Request) { char RsvStr[150]; char *RsvdStr = RsvStr; strcpy(RsvStr, Request); ....... return RsvdStr; } При этом отладчиком выдается следующее: ***JLink Error: Failed to read current instruction. На первый взгляд, все должно работать, но этого почему то не происходит. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
toweroff 0 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба То есть Вы возвращаете указатель на локальный массив? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
le-greem 0 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба в данном случае да. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба в данном случае да. Этот массив перестанет существовать сразу после выхода из RequestIdentify, так что возвращать указатель на него смысла не имеет. Но проблема возникает еще раньше: бесконтрольным копированием в RsvStr может быть уничтожен стек. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slavka012 0 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба То есть Вы возвращаете указатель на локальный массив? ха, это классика. Один раз в студенчестве неделю протрахавшись над таким багом, усвоил урок на всю жизнь :) ОП, я вам рекомендую прикладной код на PC отлаживать - это и быстрее, и легче. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
sergeeff 1 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба ха, это классика. Один раз в студенчестве неделю протрахавшись над таким багом, усвоил урок на всю жизнь :) ОП, я вам рекомендую прикладной код на PC отлаживать - это и быстрее, и легче. Если вы начнете отлаживать этот жуткий код на PC в среде, например vs2008 и выше, первое, за что вам компилятор надает по башке, это за использованiе strcpy. Посмотрите, например, ее более надежный аналог strlcpy из мира Linux. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба Если вы начнете отлаживать этот жуткий код на PC в среде, например vs2008 и выше, первое, за что вам компилятор надает по башке, это за использованiе strcpy. Просто ПО ЛЮБОМУ надо думать, прежде чем засовывать башку куда-то. И одетая на голову панамка ввиде ctrncpy()/strlcpy() поможет только там, где ее правильно используют. Подчеркиваю, поможет реализовать идею, а не защитить от бездумного копирования строк. Какую из функций использовать надо решать по поставленной задаче, а не по тому, что какая-то из них "лучше" а другая так-же безусловно "хуже". Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
slavka012 0 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба Если вы начнете отлаживать этот жуткий код на PC в среде, например vs2008 и выше, первое, за что вам компилятор надает по башке, это за использованiе strcpy. Посмотрите, например, ее более надежный аналог strlcpy из мира Linux. Вообще-то с тех пор компиляторы поумнели и выдают ошибку на возврат указателя на локальную переменную. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба Вообще-то с тех пор компиляторы поумнели и выдают ошибку на возврат указателя на локальную переменную. Вообще-то давноооо не приходилось так писать :) - рука уже не поднимается :),но помнится,что даже в середине 80x борландячий компилер ругался скорее всего warning-ом. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 68 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба даже в середине 80x борландячий компилер ругался скорее всего warning-ом. Варнингом - оно правильно, нельзя лишать человека права на ошибку :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
zltigo 0 5 июля, 2011 Опубликовано 5 июля, 2011 · Жалоба Варнингом - оно правильно, нельзя лишать человека права на ошибку :) Скорее всего на извращения :(. Я почему про warning помню - вроде когда-то зачем-то извращался в сишно-ассемблерной связке с и использовал содержимое стека. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться