Я побежал этот код на макинтош, а также на Linux:Почему эта строка не переполняет буфер?
#include <stdio.h>
#include <string.h>
int main (int argc, char *argv[]){
int value = 5;
char buffer_one[8], buffer_two[8];
strcpy(buffer_one, "one");
strcpy(buffer_two, "two");
printf("[BEFORE] buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two);
printf("[BEFORE] buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one);
printf("[BEFORE] value is at %p and is %i (0x%08x)\n", &value, value, value);
printf("\n[STRCPY] copying %i bytes into buffer two\n\n", strlen(argv[1]));
strcpy(buffer_two, argv[1]);
printf("[AFTER] buffer_two is at %p and contains \'%s\'\n", buffer_two, buffer_two);
printf("[AFTER] buffer_one is at %p and contains \'%s\'\n", buffer_one, buffer_one);
printf("[AFTER] value is at %p and is %i (0x%08x)\n", &value, value, value);
}
На макинтош, если я вошел «1234567890» в качестве аргумента командной строки, то 90 разливалась в буфер один, как я бы ожидать, поскольку буфер из 8 байтов было превышено на 2.
Однако, если я запустил его в своей системе Linux, для переполнения буфера требуется больше символов. Почему/почему я могу уйти с подачей буфера в Linux?
Также как сторона примечания, в обеих системах вся строка будет печататься в буфере два и только переполненные элементы в буфере. Почему это произойдет? Почему остальные персонажи не просто перейдут к следующему? Если бы этот вопрос не был сформулирован хорошо, вот пример:
Если я нахожу 1234567890 на своем mac, 1234567890 будет напечатан в буфере два, а 90 будет напечатан в буферном. Как 90 может по-прежнему вмещать внутренний буфер два, даже если он переполнен. (это одна и та же концепция в Linux, но для переполнения требуется более 10 байт)