-Wstrict-aliasing = 3 выдает предупреждение, где -Wstrict-aliasing = 1 не - PullRequest
0 голосов
/ 13 июня 2018

Использование GCC 5.4.0.

Пример тривиален.Кодекс нарушает строгое правило псевдонимов в двух случаях.

"разыменование указателя типа-типа будет нарушать правила строгого наложения имен"

#include <stdint.h>
#include <inttypes.h>

int main() {
    uint8_t buffer[100]; // line 1
    uint32_t test = *((uint32_t*)(&buffer[10]));  // line 2
    uint32_t* pTest2 = (uint32_t*)(&buffer[10]);  // line 3
    test = *pTest2;  // line 4
}
  • -Wstrict-aliasing = 3 предупреждает только о строке 2
  • -Wstrict-aliasing = 2 предупреждает о строке 2 и 3
  • -Wstrict-aliasing = 1 вообще не выдает предупреждение

Из Документация GCC :

Уровень 1: Самый агрессивный, быстрый, наименее точный.Возможно, полезно, когда более высокие уровни не предупреждают, но -fstrict-aliasing по-прежнему нарушает код, так как содержит очень мало ложных отрицаний.Тем не менее, он имеет много ложных срабатываний. Предупреждает обо всех преобразованиях указателей между возможно несовместимыми типами, даже если никогда не разыменовывается. Работает только во внешнем интерфейсе.

Теперь я не уверен в том, насколько надежен -Wstrict-aliasing = 1на самом делеЭто проблема с GCC 5.4.0?

...