Данное диагностическое правило основано на руководстве MISRA (Motor Industry Software Reliability Association) по разработке программного обеспечения.
Оператор 'sizeof()' не выполняет переданное ему выражение, а только вычисляет тип результирующего выражения и возвращает его размер на этапе компиляции. Следовательно, для любого кода внутри 'sizeof()' компилятор не генерирует ассемблерного кода (невыполняемые контекст), и ожидаемые операции внутри не будут произведены.
Поэтому операнд, передаваемый 'sizeof()', не должен содержать каких-либо сторонних эффектов, чтобы избежать потери операций.
Пример кода, на который анализатор выдаст предупреждение:
int x = ....;
....
size_t s = n * sizeof(x++);
Для получения ожидаемого эффекта нужно переписать код следующим образом:
int x = ....;
....
++x;
size_t s = n * sizeof(x);
Данная диагностика классифицируется как:
|