2014-02-16 3 views
0

Я довольно новичок в программировании и изучаю C. Я пытаюсь создать простую переполнение буфера и уметь прогнозировать результаты как упражнение, но при попытке сделать это не удалось даже создать переполнение , Я использую MinGW, и, похоже, он автоматически настраивает мой массив для соответствия содержимому. Я компилирую с -Wall и -Wextra, но ошибок не выталкивают. Что именно здесь происходит? Почему бы мне не получить segfault? Разве мой nNum не должен быть написан? И не должно ли что-то жаловаться, когда я делаю случайную запись где-то, я не должен касаться? Благодаря!Автоматическая проверка границ?

#include <stdio.h> 
#include <string.h> 

/* Array index - something to be sure that you're outside of szArray */ 
#define SZ_LOCATION 15 

int main(void) 
{ 
    /* Initialize array and number. Store 1000 to number, and "hello\0" to array */ 
    char szArray[6]; 
    unsigned short nNum = 1000; 
    strcpy(szArray, "hello"); 

    printf("SZ_LOCATION = %i\n\n", SZ_LOCATION); 

    /* Print current contents of szArray ("hello"). Print the char at the preset index location, and the current (unchanged) value of nNum */ 
    printf("szArray = %s\n", szArray); 
    printf("szArray[SZ_LOCATION] = %c\n", szArray[SZ_LOCATION]); 
    printf("nNum = %d\n\n", nNum); 

    /* Add 3 chars to szArray, to push it over 6 chars. Re-print all variables */ 
    strcat(szArray, "BIG"); 
    printf("szArray = %s\t(%I64u bytes)\nszArray[7] = %c\nnNum = %d\n\n", szArray, sizeof(szArray), szArray[sizeof(szArray) + 1], nNum); 

    /* Store a random char to the preset location in the array, way out there, and re-print its contents, with the new size of the array */ 
    szArray[SZ_LOCATION] = 'h'; 
    printf("szArray = %s\nszArray[SZ_LOCATION] = %c\nsizeof(szArray) = %I64u\n", szArray, szArray[SZ_LOCATION], sizeof(szArray)); 

    return 0; 
} 
+1

Программа работает нормально (я имею в виду, что она дает мне ошибку сокрушения), чего вы не достигнете? Я скомпилировал с помощью 'gcc -Wall' – Nullpointer

+1

Поскольку неопределенное поведение не означает, что вы всегда будете видеть * его; это означает, что когда-нибудь где-нибудь, когда вы даете демо потенциальному покупателю-партнеру, который пишет восьмизначные чеки, вы, скорее всего, увидите это * тогда * (и так будет, и тогда будет много плачущих, воющих , и скрежет зубов ...). Вы просите «окончательное» действие от того, что «неопределено». – WhozCraig

+0

@WhozCraig Должен быть действительно большой баннер при вводе тега [C]. Этот вопрос повторяется каждый день в бесконечном разнообразии форм :) – user3125367

ответ

0

Изменить этот

/* Add 3 chars to szArray, to push it over 6 chars. Re-print all variables */ 
strcat(szArray, "BIG"); 
printf("szArray = %s\t(%I64u bytes)\nszArray[7] = %c\nnNum = %d\n\n", szArray, sizeof(szArray), szArray[sizeof(szArray) + 1], nNum); 

быть

while (1) 
{ 
    /* Add 3 chars to szArray, to push it over 6 chars. Re-print all variables */ 
    strcat(szArray, "BIG"); 
    printf("szArray = %s\t(%I64u bytes)\nszArray[7] = %c\nnNum = %d\n\n", szArray, sizeof(szArray), szArray[sizeof(szArray) + 1], nNum); 
} 

и вывод на монитор программы.

+0

Я получил свой segfault с этим. Он также работал, когда я начал увеличивать szArray и менял его содержимое. Я думаю, что теперь я вижу больше того, что происходит с этим. Спасибо! – user3316425

0

Он не регулирует ваш массив, чтобы он соответствовал содержимому. По драматическому совпадению обращение за пределы массива не нарушало ничего важного. Более конкретно: массив был выделен в стеке, и вы пишете достаточно далеко, чтобы не испортить временные push/pop s, или компилятор решил, что они вообще не нужны, и вы касаетесь неиспользуемого пространства стека. Пожалуйста, прикоснитесь к чему-то сразу после или перед, чтобы получить эффект.

Смежные вопросы