37
2017-06-07 12:32:24
0
C4996은 scanf() 가 안전하지 못하기 때문입니다. 예를들어 위 프로그램에선 필드 char bun[10] 의 경우 크기가 10글자로 한정되어 있는데, 만약에 10글자 이상의 input이 올 경우에는 할당된 메모리 밖에까지 쓰려고 시도하기 때문에 프로그램이 crash할 수도 있고, 또는 다른 해킹 등이 가능한 취약점이 될 수 있습니다. scanf_s()는 할당된 메모리 크기 이상으로는 쓰지 않는 implementation일 겁니다.
C4477은 scanf로 %d를 읽어올 경우에는 그 다음 argument가 int타입 포인터여야 하는데, 위의 프로그램에선 그냥 int를 넣으셔서 그렇습니다.
일반적으로 숫자를 받을 경우에는
int a;
scanf("%d", &a);
와 같은 식으로 a의 주소를 패스해 주어야 값을 읽어옵니다.
scanf("%s", people[i].bun); 의 경우에는 bun이 메모리 주소를 가르키고는 있지만, 아마도 &(people[i].bun[0]) 이 올바른 사용법인 걸로 기억하는데.. 이건 가물가물하네요.
scanf() 의 사용법을 다시한번 잘 보시는걸 권장합니다.