Здравствуйте!
Пишу прогу на Си и иногда встречаюсь с такой ситуацией, что
локальная переменная меняет свое значение «сама по себе». Ну т.е. явно я ей ничего не присваиваю, а значение «чудесным образом» меняется:). Я так понимаю, что в эту область памяти записывается какое-то другое значение, но почему? Есть ли какой-нить более-менее универсальный способ следить и отлавливать такие ошибки? Заранее спасибо.
Вот фрагмент Си-шного кода, где переменная delta неожиданно меняет свое значение:
——————————————————————————————————————————————————
int len= 0, I = 0, delta = 0;
while (len < length — 11 — 4*I)
{
delta = 17 + len + 4*I;
vCodeman.ServiceType_id = WordFromArray(vResultBuf, delta — 2);
vCodeman.Datalen = StrFromArray(vResultBuf, delta, vCodeman.ManualData);
//вот тут значение delta одно
DateTimeFromArray(vResultBuf, delta + vCodeman.Datalen + 2, &vCodeman.UpdateDate);
//а тут уже другое значение delta
CodemanToFlash( &vCodeman );
memset( &vCodeman, 0, sizeof(struct CodemanData));
len += WordFromArray(vResultBuf, delta — 4);
I++;
}
Код ф-ции DateTimeFromArray следующий(эта ф-ция берет из байтовой послед-ти 12 байтов — дату и время, хотя это неважно:)):
void DateTimeFromArray(const char *aData, const int aFromPos, DateTime *vDateTime)
{
char arr[1], year[3];
memset(arr, 0, 2);
memset(year, 0, 4);
year[0]=50;
year[1]=48;
year[2]=aData[aFromPos];
year[3]=aData[aFromPos + 1];
vDateTime->dt.TM_YEAR = atoi(year);
arr[0]=aData[aFromPos + 2];
arr[1]=aData[aFromPos + 3];
vDateTime->dt.TM_MONTH = atoi(arr);
arr[0]=aData[aFromPos + 4];
arr[1]=aData[aFromPos + 5];
vDateTime->dt.TM_DAY = atoi(arr);
arr[0]=aData[aFromPos + 6];
arr[1]=aData[aFromPos + 7];
vDateTime->tt.TM_HOUR = atoi(arr);
arr[0]=aData[aFromPos + 8];
arr[1]=aData[aFromPos + 9];
vDateTime->tt.TM_MINUTE = atoi(arr);
arr[0]=aData[aFromPos + 10];
arr[1]=aData[aFromPos + 11];
vDateTime->tt.TM_SECOND = atoi(arr);
}
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
Скомпилируй без оптимизации, пройдись GDB по коду и найди строку на которой это происходит. И никогда, запомни, никогда не пользуйся camelCase.
Правда я не думаю, что переполнение на один байт может достать до дельты. Даже если -fomit-frame-pointer указано. В лучшем случае из-за этого можно получить какой-нибудь SEGFAULT при возврате из функции.
Такое переполнение может быть причиной, по-моему, лишь в одном случае: если DateTimeFromArray заинлайнится, чтобы четырёх-байтовый адрес возврата (а то и восьмибайтовый) не разделял бы стековые фреймы DateTimeFromArray и вызывающей функции.