Переполнение буфера в c ++ или поврежденные переменные - PullRequest
0 голосов
/ 19 февраля 2019

Может ли этот код вызвать переполнение буфера при доставке неожиданных сообщений?Также ожидаемые сообщения - это простые «1» и «-1».

char rcv[64] {};
  int i = 0;
  while (modem.available()) {
    rcv[i++] = (char)modem.read();
  }
  String data_received = rcv;
  if (data_received == "") {
    Serial.println("Null");
  } else {
    correction_var = data_received.toInt();
  }

Поскольку RTC моего arduino внезапно начал вести себя странно, и я не могу найти подходящую причину для этого, за исключением того, что до того, как он сошел с умаочевидно, сообщение не удалось отправить в Arduino.Этот бит кода прямо здесь обрабатывает полученные сообщения, так что, возможно, что-то вышло за пределы того, что должно было быть, и перепуталось с переменными тревоги RTC?

Обновление: таким образом, ни одно из этого НЕ было проблемой переполнения буфера, RTC Ardunino, по-видимому, имеет какую-то проблему, поскольку даже после сброса кода проблема сохраняется, на этот раз с самого начала, и поэтому я решилсоздать новую тему Здесь .

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Если modem.available() возвращает true, когда i достигает 64, то у вас будет переполнение буфера.

Кроме того, String data_received = rcv; может искать нулевой терминатор (я не знаю, как выглядит строкареализовано) в rcv, который может отсутствовать и приводить к чтению String за концом буфера rcv.

0 голосов
/ 19 февраля 2019

Вы просто читаете неограниченное количество значений, не проверяя, заполнен ли ваш буфер.Из вашего кода:

char rcv[64] {};
int i = 0;
while (modem.available()) {
    rcv[i++] = (char)modem.read();
}

Совершенно очевидно, что ваш char-массив rcv переполнится после получения 64 символов.Может быть, вам следует прекратить чтение после заполнения буфера приема?

char rcv[64] {};
int i = 0;
while (modem.available() && i < 64) {
    rcv[i++] = (char)modem.read();
}

Или вы можете переписать самое старое значение после чтения новых.

char rcv[64] {};
int i = 0;
while (modem.available()) {
    rcv[i % 64] = (char)modem.read();
    ++i;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...