Pull to refresh

Comments 14

UFO just landed and posted this here
Прочитав первые два абзаца не на шутку взволновался, подумал что сейчас расскажут, что ошибки компилятора только мешают и вот список тех, что можно смело игнорировать. Оказалось зря.
Коротких путей нет — хотите сделать код стабильнее — вычитайте все предупреждения и исправьте код.
UFO just landed and posted this here
UFO just landed and posted this here
Ошибки могут быть везде, но любую ошибку можно обойти множеством способов
Править свой код, чтоб не было ворнингов — золотое правило, но порой берёшь какую-то библиотеку, а из неё ворнинги лезут из всех дыр. И вроде работает, но за массой чужих ворнингов, перестаёшь свои замечать, а дальше ситуация только усугубляется.

Некоторые компиляторы умеют отключать предупреждения для библиотечных хедеров.

Да не некоторые, а, пожалуй, почти все. Только делается это не стандартно. Ну и чуточку более корректно: они могут отключать предупреждения для участков кода, соответственно заголовочник библиотеки подключается, в наиболее удобном варианте, через враппер. Например, мой libusb_wrapper.h для gcc:


#pragma once

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wpedantic"
#include <libusb.h>
#pragma GCC diagnostic pop

Для GCC и Clang достаточно указать директорию с помощью -isystem <DIR> вместо -I <DIR>

Всё правильно. Предупреждения компилятора следует слушать и писать код так, чтобы их не было. Это первый шаг. Когда с этим разобрались, но хочется совершенства, встаёт вопрос, что ещё можно сделать для повышения качества и надежности кода. Тогда можно сделать второй шаг — начать использовать статические анализаторы кода. По сути эти те-же предупреждения компилятора, но только более продвинутые.

А быть может, достаточно просто использовать возможности компилятора Visual C++ (или FxCop)? Нет, не достаточно: Демонстрация возможностей анализатора PVS-Studio на примере открытых проектов компании Microsoft.

Тема — прописная истина. Что не мешает ей быть чертовски актуальной. С другой стороны, в коде без ворнингов можно использовать следующий трюк: все знают, что временами код обрастает всякими TODO/FIXME и так далее, и живут они потом там вечно. А если вместо TODO вставить:


#warning TODO: remove this ugly comment

то при отсутствии других ворнингов это будет назойливо мозолить глаза и шансов на выпил причин данного TODO будет больше.

Как тимлид решил проблему радикально: -Wall -pedantic -Wextra -Werror
Здесь ключевое слово -Werror. А если…
Для кросс компиляторного использования #pragma, есть такое ключевое слово _Pragma.
Это аналог #pragma, но его можно использовать в макросах.
Т.е. можно объявить свою прагму, которая будет на пример работать только для clang, а gcc её будет игнорировать.
Примерно так:
#ifdef __clang__
#define PRAGMACLANG(str) _Pragma(#str)
#else
#define PRAGMACLANG(str)
#endif

И теперь в коде для заглушения какого-то предупреждения clang, можно написать:
PRAGMACLANG(clang diagnostic push)
PRAGMACLANG(clang diagnostic ignored "-Wsomething"
… здесь какой-то код…
PRAGMACLANG(clang diagnostic pop)

Также можно учитывать версию компиляторов, включенный стандарт C/C++ кода и т.д.
Sign up to leave a comment.