Я провожу некоторые эксперименты с функцией защиты стека GCC, чтобы лучше ее понять.В основном я ссылался на этот пост на stackoverflow .
Ниже приведен мой код.
test.c
#include <stdio.h>
void write_at_index(char *arr, unsigned int idx, char val)
{
arr[idx] = val;
printf("\n%s %d arr[%u]=%d\n", __func__, __LINE__,
idx, arr[idx]);
}
void test_stack_overflow()
{
char a[16] = {0}; //Array of 16 bytes.
write_at_index(a, 30/*idx*/, 10/*val*/); //Ask the other function to access 30th index.
printf("\n%s %d Exiting a[0] %d\n", __func__, __LINE__, a[0]);
}
int main()
{
test_stack_overflow();
return 0;
}
Ниже приведен мой make-файл.
Makefile
CC=gcc
BIN=./test.out
SRCS=./test.c
all: $(BIN)
OBJ = ${SRCS:.c=.o}
CFLAGS=-O0 -fstack-protector -fstack-protector-all
$(OBJ): %.o: %.c
$(CC) $(CFLAGS) $(INCLUDES) -c $*.c -o $*.o
$(BIN): $(OBJ)
$(CC) -o $@ $<
rm -rf ./*.o
clean:
rm -rf ./*.out
rm -rf ./*.o
Я использую gcc (Ubuntu 7.3.0-27ubuntu1 ~ 18.04) 7.3.0
Когда я собираю и запускаю test.out, я получаю аварийное завершение "обнаружение разбивания стека".
Однако, если я изменяю уровень оптимизации на O3, (CFLAGS=-O3 -fstack-protector -fstack-protector-all)
и собираю и выполняю test.out, яя не наблюдаю сбой.
Так что мой вопрос: убирает ли компилятор параметр "-fstack-protector", когда оптимизация включена?Или я здесь пропускаю какие-то другие настройки?