"Насколько эти предупреждения несут гарантированные проблемы?"
Буквальный ответ: нет гарантированных проблем. Просто с функциями
без объявлений компилятор не отслеживает правильность типов
аргументов и возвращаемых значений. Потенциальные указатели без
нужного выравнивания, даже если среди них окажется реально неровный
указатель, не на всех процах вызывают проблемы. Армянское радио
ответит лучше: Warning[Pa039]: "use of address of unaligned structure member" — это предупреждение указывает на использование адреса члена структуры, который не выровнен по границе (alignment), требуемой для типа данных. В C структуры по умолчанию выравниваются для оптимизации доступа к памяти, но если вы используете #pragma pack(1) или аналогичные директивы для упаковки (packing), члены могут стать не выровненными.
-
Потенциальные проблемы: На некоторых архитектурах (например, ARM, MSP430 или другие embedded-системы) доступ к не выровненным данным может вызвать аппаратные исключения (bus error), крах программы или замедление выполнения из-за дополнительных операций процессора. На x86 (Intel/AMD) это часто работает без ошибок, но может быть менее эффективным (медленнее). Проблемы не гарантированы на всех платформах, но они реальны в embedded или строгих средах, где выравнивание обязательно. Если код портируется на другую архитектуру, это может сломаться. В худшем случае — undefined behavior по стандарту C, хотя компилятор IAR (откуда это предупреждение) пытается предупредить заранее.
-
Гарантированы ли проблемы? Нет, не всегда — зависит от hardware и оптимизаций компилятора. Но в embedded-разработке (где IAR часто используется) это часто приводит к реальным сбоям. Лучше исправить: используйте выровненные структуры, memcpy для копирования или отключите предупреждение только локально (#pragma diag_suppress=Pa039), если уверены в безопасности.
Warning[Pe223]: "function 'xxxx' declared implicitly" — это предупреждение о том, что функция используется без предварительного объявления (прототипа). Компилятор вынужден "догадываться" о её сигнатуре: по умолчанию предполагает, что она возвращает int и принимает переменное число аргументов (old-style K&R). В вашем случае функция имеет тип uint8 xxxx(uint8, uint8), что не совпадает с предположением (не int), так что это усугубляет проблему.
-
Потенциальные проблемы: Без прототипа компилятор не проверяет типы аргументов и возвращаемого значения, что может привести к неправильному вызову: переполнениям стека, повреждению памяти, неверным расчётам или краху. Если реальный тип возврата — uint8, а компилятор ждёт int, это вызовет undefined behavior (UB) — программа может работать случайно, но сломается при смене компилятора, оптимизаций или платформы. В C99 и новее неявные объявления запрещены в строгом режиме, и это может стать ошибкой.
-
Гарантированы ли проблемы? Не на 100%, но очень вероятно, особенно с не-int типами: код может компилироваться, но работать неправильно (например, обрезание значений или неверные аргументы). В embedded (IAR) это часто приводит к скрытым багам. Исправьте: добавьте прототипы в заголовочные файлы или перед использованием, включите -Werror для treatment warnings as errors.
В целом, эти предупреждения — не просто "шум": они сигнализируют о потенциальном UB или неэффективности. В production-коде их игнорирование может привести к сбоям, особенно в cross-platform или embedded. Рекомендую пофиксить, чтобы код был portable и safe.