Хэш 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++, может кто-нибудь помочь это исправить? Спасибо большое!!
@Harry, 👍0
Обсуждение1 ответ
Лучший ответ:
....\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
- Как использовать SPI на Arduino?
- Как решить проблему «avrdude: stk500_recv(): programmer is not responding»?
- Как создать несколько запущенных потоков?
- Как подключиться к Arduino с помощью WiFi?
- avrdude ser_open() can't set com-state
- Как узнать частоту дискретизации?
- Что такое Serial.begin(9600)?
- Я закирпичил свой Arduino Uno? Проблемы с загрузкой скетчей на плату
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