| Summary: | Нет предупреждений о записи в программную память | ||
|---|---|---|---|
| Product: | Sisyphus | Reporter: | Dmitry A. Kharitonov <kharpost> |
| Component: | avr-gcc | Assignee: | Grigory Milev <week> |
| Status: | CLOSED FIXED | QA Contact: | qa-sisyphus |
| Severity: | normal | ||
| Priority: | P3 | CC: | erthad, kharpost, viy, week |
| Version: | unstable | ||
| Hardware: | all | ||
| OS: | Linux | ||
А какие варианты фикса имеются? Я не gcc писатель, если имеются готовые решения, я с радостью приложу патчик к пакету :) я, честно говоря, даже не в курсе где их искать, вернее не понятно по каким ключевым словам. В первом приближении достаточно в <avr/pgmspace.h> во все типы программной памяти добавить модификатор static. const добавлять не стоит (хотя очень хочется для строчки 6) -- будут проблемы с указателями и ссылками. PS.: На днях сделаю тест для баги с обработкой логических операций в операторе if, надо только вспомнить в каком месте я с ним боролся. Если правки относятся к avr/pgmspace.h, то багу стоит перенести на avr-libc + проверить с последней сборкой avr-libc! Не воспроизводится с: avr-gcc-4.5.1-alt2 avr-libc-1.7.0-alt2 |
1 #include <avr/io.h> 2 #include <avr/pgmspace.h> 3 4 int main() { 5 prog_uint8_t p=44,t; // ошибка пропущен обязательный модификатор static 6 t=pgm_read_byte_near(&p); // будет прочитан не p 7 } В строке 5 переменные должны располагаться в программной памяти, но всё совсем криво и никаких ошибок или предупреждений не возникает. Компилятор резервирует место в программной памяти, но значения туда не помещает. Значения туда копируются на этапе инициализации переменных, но тк программная память доступна только для чтения, данные в эту область фактически не копируются и там оказываются случайные данные. В строке 6 происходит копирование данных в переменную, которая расположена в программной памяти, а фактически происходит копирование в озу, по тому же адресу, где в это время расположена совсем другая переменная. При этом нет даже предупреждений (хотя бы о мнимом преобразовании типов).