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
'code' 카테고리의 다른 글
Linux에서 조건 연산자의 이상한 사용 (0) | 2023.08.01 |
---|---|
C에서 변수 사용을 등록하는 좋은 예는 무엇입니까? (0) | 2023.08.01 |
2.0 asmx 웹 서비스에서 JSON을 반환하는 방법 (0) | 2023.08.01 |
com.google.gms:play-services-measurement-base가 다른 다양한 라이브러리에서 요청되고 있습니다. (0) | 2023.08.01 |
Oracle SQL Developer에서 Refursor 결과/출력을 확인하는 방법은 무엇입니까? (0) | 2023.08.01 |