2014-02-25 2 views
1

나는 보통 당신이 배열의 크기를 늘릴 수 없다고 생각했다. 내가 무엇을하면 :C에서 배열의 크기를 늘리는 이상한 방법은 무엇입니까?

char arr [4];

strncpy (arr, "12347777", 8);

strlen (arr)을 호출하면 다리 길이가 증가하는 것으로 나타납니다. 누군가 그 곳에서 일어난 일을 설명 할 수 있습니까?

+2

할당 된 버퍼의 끝을 쓰는 이런 종류의 정의되지 않은 동작은 일반적으로 버퍼 오버런 *이라고하며 일반적으로 보안 취약점의 원인이됩니다. – hyde

답변

3

배열을 더 크게 만들지 않았습니다. 어레이가 끝난 후 임의의 메모리 조각을 밟았습니다.

strlen은 정상적인 조건에서도 배열의 길이를 반환하지 않습니다. 문자열이 얼마나 오랫동안 지속되는지 알려줍니다. 8 개의 문자 (null 종결자를 더함)를 거기에 넣었으므로 8을 반환합니다. 그러나 이것은 정의되지 않은 동작입니다! 메모리가 손상 되었기 때문에 충돌이 발생할 수 있거나 임의의 수를 반환 할 수 있습니다 (표준에 따르면 모든 것이 가능함). 코드의 단순화 된 부분에서 사실상 이것은 충돌로 이어질 것입니다.

0

방금 ​​방대한 버그를 만들었습니다. 프로그램이 메모리 손상 및 오작동을 일으킬 수 있습니다. 실제 배열 크기는 변경하지 않지만 배열이 거짓이거나 다음에 오는 메모리를 덮어 씁니다. 그래서 당신은 배열에있는 4 개의 문자 {'1', '2', '3', '4'}을 썼지 만 다음 메모리에 {'7', '7', '7', '7'}을 썼습니다. 당신은 운 좋게도 다음 바이트가 제로가되어서 strlen(arr) 크기 8을 보여줍니다. 그것은 단순한 버그이며 그것을해서는 안됩니다. 참고 "12347777"{'1', '2', '3', '4', '7', '7', '7', '7', '\0'}을 포함하는 메모리에 대한 포인터이며 8 바이트의 문자 만 복사하므로 0 바이트가 종료됩니다.

관련 문제