메인 함수의 아규먼트에 문자열을 덮어써도 되나요?

익명 사용자의 이미지

메인 함수의 아규먼트에 문자열을 덮어써도 되나요?

예를 들어서,

int main(int argc,char *argv[])
{
	// argv[2]에 "1234"라는 문자열이 넘어옵니다.
 
	strcpy(argv[2], "1234567890"); // argv[2]에 "1234"보다 긴 문자열인 "1234567890"을 복사합니다
 
	func(argc, argv, option);

위와 같이 넘어온 메인함수의 아규먼트 중 argv[2]에 이전에 넘어온 문자열보다 긴 다른 문자열을 복사한 후에 다른 함수에 다시 넘기는 방식입니다

이전에 넘어온 문자열보다 짧은 문자열을 덮어쓰면 문제가 될 것 같지 않은데
이전에 넘어온 문자열보다 긴 문자열을 덮어쓰면 혹시 문제가 생기지 않을지 궁금합니다

일단 테스트 결과는 잘 동작하는데,

메인 함수로 넘어오는 매개변수를 어느 영역에 저장하는지 모르겠고
그 영역에서 "1234" 이후의 메모리 영역을 침범해서 덮어쓰지 않을까 걱정됩니다

아니면 이 경우에 새로운 args[]를 선언해서
strcpy(ARGS[1], argv[1]);
strcpy(ARGS[2], "1234567890");
strcpy(ARGS[3], argv[3]);

argv를 전부 복사한 후에
func(argc, ARGS, option);

이렇게 넘기는 편이 나을까요?

답변주시면 정말 감사하겠습니다

wariua의 이미지

main 함수 인자들은 환경 변수와 함께 스택 아래(스택이 거꾸로 자라니까 주소 기준으로 하면 스택 위)에 저장됩니다.

예로 드신 코드는 경우에 따라 별 문제 없이 동작할 수도 있지만 기본적으로 위험한 코드입니다. 말씀 대로 긴 문자열을 저장하기 위한 메모리를 동적으로 할당해서 문자열을 복사하는 게 맞습니다. func 함수 말고는 argv를 사용하지 않는다고 하면 이런 식도 가능합니다.

argv2_orig = argv[2];
argv[2] = malloc(sizeof(new_argv2) + 1);
strcpy(argv[2], new_argv2);
 
func(argc, argv, option);
 
free(argv[2]);
argv[2] = argv2_orig;

$PWD `date`

익명 사용자의 이미지

답변 정말 감사합니다

올려주신 코드는 전혀 문제의 여지가 없는 것인가요?

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.