code

strln이 NULL을 확인하지 않음

starcafe 2023. 8. 1. 20:40
반응형

strln이 NULL을 확인하지 않음

이유는strlen()NULL을 확인하지 않습니까?

만약에strlen(NULL)프로그램 분할 결함

그 배경에 있는 이론적 근거를 이해하려고 노력합니다(있는 경우).

그 이면에 있는 합리적인 방법은 간단합니다. 존재하지 않는 것의 길이를 어떻게 확인할 수 있을까요?

또한 "관리 언어"와 달리 런타임 시스템이 잘못된 데이터 또는 데이터 구조를 올바르게 처리할 것이라는 기대는 없습니다. (이러한 유형의 문제는 더 많은 "현대" 언어가 비계산 또는 덜 성능적인 애플리케이션에 더 인기 있는 이유입니다.)

c의 표준 템플릿은 다음과 같습니다.

 int someStrLen;

 if (someStr != NULL)  // or if (someStr)
    someStrLen = strlen(someStr);
 else
 {
    // handle error.
 }

문자열 처리 라이브러리를 정의하는 언어 표준의 부분은 특정 함수에 대해 달리 지정되지 않는 한 포인터 인수는 유효한 값을 가져야 한다고 명시합니다.

C 표준 라이브러리의 설계 이면의 철학은 프로그래머가 런타임 검사가 정말로 수행되어야 하는지 여부를 알 수 있는 궁극적으로 가장 좋은 위치에 있다는 것입니다.총 시스템 메모리가 킬로바이트로 측정되던 시절에는 불필요한 런타임 검사를 수행하는 데 드는 오버헤드가 상당히 고통스러울 수 있습니다.따라서 C 표준 라이브러리는 이러한 검사를 수행하는 데 수고를 들이지 않고 프로그래머가 실제로 필요하다면 이미 수행했다고 가정합니다.잘못된 포인터 값을 전달하지 않을 것임을 알고 있는 경우strlen(예: 문자열 리터럴 또는 로컬로 할당된 배열을 전달하는 경우), NULL에 대한 불필요한 검사로 결과 이진을 혼란스럽게 만들 필요가 없습니다.

이 표준은 이를 요구하지 않으므로, 구현은 테스트와 잠재적으로 비용이 많이 드는 점프를 피할 수 있습니다.

당신의 슬픔을 돕는 작은 매크로:

#define strlens(s) (s==NULL?0:strlen(s))

세 가지 중요한 이유:

  • 표준 라이브러리와 C 언어는 프로그래머가 자신이 무엇을 하고 있는지 알고 있다고 가정하여 설계되었으므로 null 포인터는 에지 케이스로 취급되지 않고 정의되지 않은 동작을 초래하는 프로그래머의 실수로 취급됩니다.

  • 런타임 오버헤드 발생 - 호출strlen수천 번 그리고 항상 하고 있는str != NULL프로그래머가 시시하게 취급되지 않는 한 합리적이지 않습니다.

  • 이것은 코드 크기까지 합산됩니다. 몇 가지 명령어가 될 수 있지만, 이 원칙을 채택하고 모든 곳에서 실행하면 코드가 상당히 부풀려질 수 있습니다.

size_t strlen ( const char * str );

http://www.cplusplus.com/reference/clibrary/cstring/strlen/

Strlen은 문자 배열에 대한 포인터를 매개 변수로 사용하며, null은 이 함수에 대한 유효한 인수가 아닙니다.

언급URL : https://stackoverflow.com/questions/5796103/strlen-not-checking-for-null

반응형