Можно ли включить флаг GCC "-Waggressive-loop-optimizations" с уровнем оптимизации "-O0" или без него?

Как и заголовок, мне интересно, есть ли способ включить флаг GCC?

-Waggressive-loop-optimizations

когда уровень оптимизации -O0 или без использования -OX совсем.

Давайте посмотрим на следующий пример:

#include <stdio.h>

int main ( void ){
    int arr[4] = { 0 };

    for ( int i = 0 ; i < 5 ; i++ ){
        arr[i] = i+1;
    }

    for ( int j = 0; j < 4 ; j++ ){
        printf("Arr[%d] = %d\n", j, arr[j] );
    }
}

как вы можете видеть, когда i == 4 Вот:

for ( int i = 0 ; i < 5 ; i++ )

программа читает массив за его пределами.

Со следующими флагами GCC -O1 в -O3 Компилятор сообщает мне об этом:

ВХОД:

gcc-7 -Wpedantic -std=c11 -Wall -Wextra -Werror -O1

Выход:

program.c: In function ‘main’:
program.c:6:16: error: iteration 4 invokes undefined behavior [-Werror=aggressive-loop-optimizations]
         arr[i] = i+1;
         ~~~~~~~^~~~~
program.c:5:5: note: within this loop
     for ( int i = 0 ; i < 5 ; i++ ){
     ^~~
cc1: all warnings being treated as errors

Но, конечно, это не с -O0,

Я пытался следующее:

gcc-7 -Wpedantic -std=c11 -Wall -Wextra -Werror -Waggressive-loop-optimizations -O0 program.c -o program

и даже следующее (без -O0:

gcc-7 -Wpedantic -std=c11 -Wall -Wextra -Werror -Waggressive-loop-optimizations program.c -o program

И компилятор просто игнорирует этот флаг:

-Waggressive-loop-optimizations

Кто-нибудь знает, почему так происходит и есть ли возможность включить этот флаг?-Waggressive-loop-optimizations

РЕДАКТИРОВАТЬ:

Мне это нужно, потому что, например, когда я компилирую вышеупомянутую программу с:

gcc-7 -Wpedantic -std=c11 -Wall -Wextra -Werror -Wstrict-prototypes -Wmissing-prototypes -Wmisleading-indentation -Wduplicated-cond -Wold-style-definition -Wconversion -Wshadow -Winit-self -Wfloat-equal -Wwrite-strings -Wpointer-compare -Waggressive-loop-optimizations -g program.c -o program

И тогда я делаю:

valgrind --leak-check=full --track-origins=yes ./program

valgrind не сообщает что-то, потому что я думаю, что компилятор оптимизирует это (я думаю):

michi@michael ~/Compile $ valgrind --leak-check=full --track-origins=yes ./program
==5818== Memcheck, a memory error detector
==5818== Copyright (C) 2002-2015, and GNU GPL'd, by Julian Seward et al.
==5818== Using Valgrind-3.11.0 and LibVEX; rerun with -h for copyright info
==5818== Command: ./program
==5818== 
Arr[0] = 1
Arr[1] = 2
Arr[2] = 3
Arr[3] = 4
==5818== 
==5818== HEAP SUMMARY:
==5818==     in use at exit: 0 bytes in 0 blocks
==5818==   total heap usage: 1 allocs, 1 frees, 1,024 bytes allocated
==5818== 
==5818== All heap blocks were freed -- no leaks are possible
==5818== 
==5818== For counts of detected and suppressed errors, rerun with: -v
==5818== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0) 

В любом случае в комментариях есть некоторое недопонимание относительно части редактирования и самого Вопроса.

Нет мне не нужен valgrind Исправьте здесь, редактирование просто для объяснения одной из ситуаций, когда нет доступа к массиву за его пределами, потому что флаг -Waggressive-loop-optimizations Не работает, как при использовании уровня оптимизации -O1, -O2 или же -O3,

0 ответов

Другие вопросы по тегам