source

왜 strdup이 사악하다고 여겨지나요?

lovecheck 2023. 10. 29. 19:49
반응형

왜 strdup이 사악하다고 여겨지나요?

저는 몇 개의 포스터를 봤습니다.strdup사악합니다.에 대해서가 이루어집니까?이에 대한 합의가 이루어졌나요?아무런 죄책감 없이 사용했는데 사용하는 것보다 더 나쁠 이유가 없습니다.malloc/memcpy.

내가 생각할 수 있는 유일한 것은strdup호출자가 이를 오용할 수 있다는 것이 평판입니다(예: 반환된 메모리의 여유를 확보해야 한다는 것을 깨닫지 못합니다. 스트래킷으로 문자열의 끝까지 스트래킷을 시도합니다.그러나 몰로크 끈은 오남용의 가능성으로부터 자유롭지 못합니다.


질문이 도움이 되지 않는다고 생각하는 분들께 답변과 사과를 해주셔서 감사합니다(마감 투표).답변 내용을 종합해보면, 일반적인 느낌은 없는 것 같습니다.strdup그 자체로 사악하지만, C의 다른 많은 부분들처럼 부적절하거나 안전하지 않게 사용될 수 있다는 일반적인 합의입니다.

실제로 '올바른' 대답은 없지만, 그 대답을 받아들이기 위해서, 저는 @neoneo의 대답을 받아들였습니다. 마찬가지로 @R...의 대답이었을 수도 있습니다.

내가 생각할 수 있는 두 가지 이유:

  1. 엄격하게 ANSIC이 아니라 POSIX입니다.는 을 막습니다러예: MSVC)다(MSVC호)을 합니다)._strdup), 및 기술적으로 C 표준은 자체적으로 정의할 수 있습니다.strdup그 이후로 다른 의미론을 가지고str는 예약 접두사입니다.따라서 사용에 따른 휴대성 문제가 발생할 수 있습니다.
  2. 메모리 할당을 숨깁니다.그 외 대부분의 다른str함수들은 메모리를 할당하지 않기 때문에 (말씀하신 대로) 사용자들이 반환된 문자열을 해제할 필요가 없다고 믿게끔 현혹될 수 있습니다.

하지만 이런 점들은 차치하더라도, 제 생각에는strdup코드 중복을 줄일 수 있고 일반적인 관용구(예:strdup("constant string")텍스트 문자열의 가변적이고 반환 가능한 복사본을 가져옵니다.

나의 대답은 오히려 지지합니다.strdup그리고 이것은 C의 다른 어떤 기능보다 나쁘지 않습니다.

  1. POSIX는 표준이고,strdup휴대성이 문제가 될 경우 구현하는 것은 그리 어렵지 않습니다.

  2. 할당된 메모리의 사용 가능 여부strdup만약 누군가가 남자 페이지를 읽고 어떻게 그 방법을 이해하는 데 시간을 들인다면 문제가 되지 않을 것입니다.strdup기능이 작동합니다. 기능이 어떻게 작동하는지 이해하지 못하면 사람이 무언가를 망칠 가능성이 매우 높습니다. 이것은 단순한 기능이 아닌 모든 기능에 적용 가능합니다.strdup.

  3. C에서 메모리와 다른 대부분의 것들은 프로그래머에 의해 관리되므로 strup은 자유롭게 하는 것을 잊는 것만큼 나쁘지 않습니다. malloc'ed memory, null termination 실패, 잘못된 형식 문자열 사용scanf(및 정의되지 않은 동작 호출), 달링 포인터 등에 액세스합니다.

(이 글을 꼭 댓글로 올리고 싶었지만 단 한 개의 댓글도 달 수 없었습니다.따라서 답변으로 올립니다).

저는 잘 못 들었습니다.strdup악이라고 표현되지만, 일부 사람들이 싫어하는 몇 가지 가능한 이유:

  1. 표준 C는 아니지만 POSIX에 있습니다.하지만 이런 이유는 부족한 시스템에 거의 한 줄 기능을 추가하는 것이기 때문에 우습다고 생각합니다.
  2. 가능한 경우 문자열을 제자리에 사용하는 대신 전체에 문자열을 맹목적으로 복제하면 시간과 메모리가 낭비되고 그렇지 않으면 오류가 발생하지 않을 수도 있는 코드에 오류 사례가 도입됩니다.
  3. 문자열의 복사본이 필요한 경우, 문자열을 수정하거나 작성할 공간이 더 필요할 수 있습니다.strdup그렇다고 할 수는 없습니다.

대부분의 strup에 대한 우려는 버퍼 오버런과 부적절하게 포맷된 문자열에 대한 보안 문제에서 비롯된다고 생각합니다.null이 아닌 종료 문자열이 strup으로 전달되면 정의되지 않은 길이 문자열을 할당할 수 있습니다.이것이 특별히 공격에 활용될 수 있는지는 모르겠지만 일반적으로 널 문자에만 의존하지 않고 최대 길이가 걸리는 문자열 함수만 사용하는 것이 안전한 코딩 방식이 좋습니다.

많은 사람들이 분명히 그렇지 않지만, 저는 개인적으로strdup여러가지 이유로 악을 행하고,

  • 가장 중요한 것은 그것이 할당을 숨기고 있다는 것입니다.른.str*함수들과 대부분의 다른 표준 함수들은 no를 요구합니다.free그 후에 그래서strdup충분히 무해해 보이고 그 후에 청소하는 것을 잊어버릴 수 있습니다. dmckee는 그냥 당신의 정신적인 기능 목록에 그것을 추가하자고 제안했지만, 왜죠?중간 길이의 두 줄을 하나의 짧은 줄로 줄이는 것보다 큰 장점은 없다고 봅니다.

  • 항상 힙에 메모리를 할당하고 C99로 메모리를 할당합니다(99입니까?).VLA 여러분, 또 다른 이유가 있습니다.strcpy(당신은 필요도 없습니다.malloc 항상 할할 수 해야 항상 이렇게 할 수는 없지만, 할 수 있을 때는 그렇게 해야 합니다.

  • ISO 표준의 일부는 아니지만(하지만 POSIX 표준의 일부입니다. Wiz 감사합니다.) 이는 R로서 정말 작은 점입니다.쉽게 추가할 수 있다고 말씀하셨습니다.휴대용 프로그램을 쓴다면 이미 정의된 것인지 아닌지 어떻게 알 수 있을지 모르겠습니다만...

물론 이것들은 제 나름의 이유들입니다. 다른 사람들의 이유는 아닙니다.당신의 질문에 답을 드리자면, 제가 알고 있는 합의점이 없습니다.

만약 당신이 자신만을 위한 프로그램을 작성하고 있고 당신이 발견할 수 있습니다.strdup문제 없습니다. 다양한 기술 수준과 연령대의 많은 사람들이 읽을 수 있는 프로그램을 작성하는 경우보다 사용하지 않을 이유가 훨씬 적습니다.

왜 strdup이 사악하다고 여겨지나요?

  1. 미래의 언어 방향과 충돌합니다.

  2. 에 대한 의존도errno주.

  3. 더 쉽게 직접 만들 수 있습니다.strdup()그것은 POISX 1이나 미래의 C2x 1과 완전히 같지는 않습니다.


C2x와 함께, 특정한 포함이 진행 중입니다.strdup(), 를 합니다.strdup()그 전에 이런 문제가 있었습니다.

  • C2x가 제안했습니다. strdup()언급하지 않음errnoPOSIX는 그렇지요.설정에 의존하는 코드errno.ENOMEM아니면EINVAL미래에 문제가 생길 수 있습니다.

  • C2x가 제안했습니다. char *strdup(const char *s1)a를 사용합니다.const char *매개 변수로서사용자 코드 버전strdup()너무 자주 사용하는char *s1, 중요한 선택 코드를 깰 수 있는 차이를 발생시키는 것.char *서명 기능 포인터.기능 포인터.

  • 자신의 롤을 수행한 사용자 코드strdup()C의 미래 언어 지시를 따르지 않았습니다. "str, mem 또는 wcs로 시작하는 함수 이름과 소문자를 <string>의 선언에 추가할 수 있습니다.h> "header"로 인해 라이브러리 충돌이 발생할 수 있습니다.strdup()사용자의strdup().

사용자 코드가 원하는 경우strdup()C2x 이전에 코드를 사용하면 다른 이름을 짓는 것을 고려해 보세요.my_strdup()A를 사용합니다.const char *매개 변수.상태에 대한 의존도를 최소화하거나 방지합니다.errno전화가 온 후에NULL.

나의my_strdup() 노력 - 사마귀 등등

아직 언급되지 않은 strdup을 싫어하는 이유는 자연스러운 쌍이 없는 자원 할당이기 때문입니다.바보 같은 게임을 해볼까요?라고 합니다malloc, 당신은 말합니다.free.라고 합니다open당신은 말합니다.close.라고 합니다create당신은 말합니다.destroy.라고 합니다strdup당신은 ......?

에 답, 은.strdup이다.free물론, 그리고 그 기능은 더 나은 이름이 지어졌을 것입니다.malloc_and_strcpy그 점을 확실히 하기 위해서요.하지만 많은 C 프로그래머들은 그렇게 생각하지 않고 잊어버립니다.strdup반대 또는 "끝"이 필요합니다.free할당을 해제합니다.

내 경험상, 호출하는 코드에서 메모리 누수를 발견하는 것은 매우 흔한 일입니다.strdup. 이상한 기능이 결합되어 있습니다.strlen,malloc그리고.strcpy.

언급URL : https://stackoverflow.com/questions/12984948/why-is-strdup-considered-to-be-evil

반응형