Хэш MD5 для Arduino Uno [-Wshift-count-overflow]?

Я пытался протестировать эту библиотеку MD5 (https://github.com/tzikis/ArduinoMD5) в качестве хеш-функции. на ардуино уно.

Я поместил MD5.cpp и MD5.h в папку ниже: C:\Program Files (x86)\Arduino\libraries\MD5

И запустил arduino IDE 1.8.9, чтобы протестировать предоставленный пример (https:// github.com/tzikis/ArduinoMD5/blob/master/examples/MD5_Hash/MD5_Hash.ino):

#include <MD5.h>
/*
Это пример использования моей библиотеки MD5. Он обеспечивает два
простые в использовании методы: один для генерации хеша MD5, а второй
один для генерации шестнадцатеричного кодирования хеша, который часто используется.
*/
void setup()
{
  //инициализируем последовательный порт
  Serial.begin(9600);
  // дайте этому секунду
  delay(1000);
  //генерируем хэш MD5 для нашей строки
  unsigned char* hash=MD5::make_hash("hello world");
  //генерируем дайджест (шестнадцатеричное кодирование) нашего хеша
  char *md5str = MD5::make_digest(hash, 16);
  free(hash);
  // распечатываем его на нашем последовательном мониторе
  Serial.println(md5str);
  //Вернем память системе, если вы запустите генерацию хеша md5 в цикле
  free(md5str);
}

void loop()
{
}

Однако при запуске проверки и компиляции все работает, но появляются следующие предупреждения:

...\sketch_may02a_MD5_test.ino.ino: In function 'void setup()':

sketch_may02a_MD5_test.ino.ino:15:51: 
warning: ISO C++ forbids converting a string constant to 'char*' [-Wwrite-strings]

   unsigned char* hash=MD5::make_hash("hello world");

                                                   ^

C:\Program Files (x86)\Arduino\libraries\MD5\MD5.cpp: 
In static member function 'static void MD5::MD5Update(void*, const void*, size_t)':

C:\Program Files (x86)\Arduino\libraries\MD5\MD5.cpp:207:21: 
warning: right shift count >= width of type [-Wshift-count-overflow]

  ctx->hi += size >> 29;

                     ^

Я мало знаю C++, может кто-нибудь помочь это исправить? Спасибо большое!!

, 👍0

Обсуждение

size имеет тип size_t, который в Uno выглядит как беззнаковое целое число, что означает 16 бит. Я думаю, что сдвиг на 29 бит всегда будет давать ноль. И это кажется сложным способом написать 0., @chrisl

@chrisl: Слишком большой сдвиг не приводит к 0. Это приводит к неопределенному поведению., @AnT

Вам лучше не связываться с системными файлами Arduino в C:\Program Files (x86)\Arduino. Можете ли вы удалить Arduino, удалить C:\Program Files (x86)\Arduino и переустановить его? Ваши эскизы находятся в папке «Documents\Arduino»? В этой папке рядом с папками ваших проектов есть папка «библиотеки». Эта папка libraries предназначена для размещения загруженных вами библиотек. При использовании менеджера библиотек Arduino и загрузке библиотеки она также будет помещена туда., @Jot

@Jot Спасибо за советы. Я заметил, что он также захватывает библиотеки из Document\Arduino\libraries, которые, как я думал, использовались только с Arduino, установленным из магазина приложений Windows. Как вы предлагаете, мне следует просто использовать его для всех библиотек, которые будут развернуты в будущем., @Harry


1 ответ


Лучший ответ:

0

....\sketch_may02a_MD5_test.ino\sketch_may02a_MD5_test.ino.ino:15:51: предупреждение: ISO C++ запрещает преобразование строковой константы в 'char*' [-Wwrite-strings]

Это недостаток библиотеки. Автор определил функцию как принимающую char * вместо const char *. Вы можете игнорировать это, это всего лишь предупреждение. Однако, возможно, было бы неплохо обсудить проблему с автором.

C:\Program Files (x86)\Arduino\libraries\MD5\MD5.cpp:207:21: предупреждение: счетчик смещения вправо >= ширина типа [-Wshift-count-overflow]

Это немного более неловко. Переменная size определяется как тип size_t. Его длина зависит от архитектуры, на которой скомпилировано программное обеспечение. На 8-битных Arduino это 16-битная переменная. На 32-битных ардуино, таких как Due, это 32-битная переменная.

Вполне вероятно, что автор разработал библиотеку, используя 32-битное устройство Arudino (или Arduino-совместимое) — в этом случае он никогда не увидит это предупреждение (поскольку 29 меньше 32). Однако любой, кто затем использует 8-битный Arduino, получит предупреждение и, возможно, поврежденный хэш.

Однако похоже, что проблема должна возникнуть только в том случае, если размер слишком велик, а на 8-битной Arduino это невозможно. Итак, вы можете проигнорировать это, но автор должен быть проинформирован о проблеме.

,

Хорошо, прежде чем я подумаю, что на этот вопрос дан ответ. Можно ли это исправить с помощью пары строк, например, заменив size_t чем-то другим из файла .cpp? Если да, то я бы, возможно, попробовал и выложил его в общедоступный проект на GitHub., @Harry

Сдвиг предыдущей разрядности является неопределенным поведением. Это не следует игнорировать., @Edgar Bonet

@EdgarBonet Хотя я согласен, что его не следует игнорировать в общих чертах, но в этой ситуации он все равно ничего не будет смещать, поэтому, если сдвигать нечего, это не имеет большого значения. Поднять вопрос с автором, конечно, все равно нужно., @Majenko

@Harry Вы можете выполнить поиск и заменить size_t на uint32_t и изменить параметр make_hash() на const char *., @Majenko