вторник, 19 августа 2008 г.

disabled warnings in BaseClasses

Сегодня при компиляции конструкции вида
do {
// some code
} while (false);

обнаружилось, что не выдается предупреждении об использовании константы в выражении. Небольшое расследование показало, что виноваты разработчики Microsoft. В одном из файлов BaseClasses обнаружился такой криминал:
// disable some level-4 warnings, use #pragma warning(enable:###) to re-enable
#pragma warning(disable:4100) // warning C4100: unreferenced formal parameter
#pragma warning(disable:4127) // warning C4127: conditional expression is constant
#pragma warning(disable:4189) // warning C4189: local variable is initialized but not referenced
#pragma warning(disable:4201) // warning C4201: nonstandard extension used : nameless struct/union
#pragma warning(disable:4511) // warning C4511: copy constructor could not be generated
#pragma warning(disable:4512) // warning C4512: assignment operator could not be generated
#pragma warning(disable:4514) // warning C4514: unreferenced inline function has been removed
#pragma warning(disable:4710) // warning C4710: 'function' not inlined

Вывод тут можно сделать только один - нужно проверять файлы даже от доверенных поставщиков кода и, вообще, быть внимательнее.

Чтобы застраховаться в дальнейшем от таких неожиданностей, нужно сохранить состояние по предупреждениям следующим образом:
#pragma warning( push )
// include external stuff
#pragma warning( pop )

3 комментария:

  1. оО

    зачем же так позорится! кто виноват?! смех да и только...

    а как быть с бесконечными циклами вида while (true) { } - это же привычная практика для обычного программиста!

    я поражен такой безграмотностью...

    ОтветитьУдалить
  2. Хорошей практикой является возвращать любое меняемое состояние в исходное.

    А циклы while (true) {} легко можно заменить на for (;;) {} и никаких варнингов не будет.

    ОтветитьУдалить
  3. Кстати, в чем безграмотность? Сергей, может быть разъясните - я заинтригован :)

    ОтветитьУдалить