{"id":2654,"date":"2021-01-28T12:12:50","date_gmt":"2021-01-28T03:12:50","guid":{"rendered":"http:\/\/43.203.250.216\/?p=2654"},"modified":"2021-01-28T12:17:22","modified_gmt":"2021-01-28T03:17:22","slug":"linux%ec%97%90%ec%84%9c-%eb%a9%94%eb%aa%a8%eb%a6%ac-%ed%8f%ac%ec%9d%b8%ed%84%b0%ec%9d%98-%ec%9c%a0%ed%9a%a8%ec%84%b1-%ea%b2%80%ec%a6%9d","status":"publish","type":"post","link":"https:\/\/litcoder.com\/?p=2654","title":{"rendered":"Linux\uc5d0\uc11c \uba54\ubaa8\ub9ac \ud3ec\uc778\ud130\uc758 \uc720\ud6a8\uc131 \uac80\uc99d"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Windows\uc5d0\uc11c\uc640 \ub2ec\ub9ac Linux\ud658\uacbd\uc5d0\uc11c\ub294 \ub531\ud788 \ud3ec\uc778\ud130\uc758 \uc720\ud6a8\uc131\uc744 \uac80\uc99d\ud560 \uc218 \uc788\ub294 system call\uc774 \uc5c6\ub2e4. \uc774 \ud3ec\uc2a4\ud305\uc740 Linux\ud658\uacbd\uc5d0\uc11c \uc774\uc640 \uc720\uc0ac\ud55c \uae30\ub2a5\uc744 \uad6c\ud604\ud558\uae30 \uc704\ud574 <em>&#8220;\uc815\ubcf4\uc758 \ubc14\ub2e4&#8221;<\/em>\uc5d0\uc11c \ucc3e\uc740 \ub0b4\uc6a9\ub4e4\uc744 \uc815\ub9ac\ud574 \ub454 \uac83\uc774\ub2e4.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. _etext\ub97c \uc774\uc6a9\ud558\ub294 \ubc29\ubc95<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uccab\ubc88\uc9f8 \ubc29\ubc95\uc740 <a data-type=\"URL\" data-id=\"https:\/\/wiki.sei.cmu.edu\/confluence\/display\/c\/MEM10-C.+Define+and+use+a+pointer+validation+function\" href=\"https:\/\/wiki.sei.cmu.edu\/confluence\/display\/c\/MEM10-C.+Define+and+use+a+pointer+validation+function\">Define and use a pointer validation function<\/a> \uc774\ub77c\ub294 \uc704\ud0a4\ubb38\uc11c\uc5d0\uc11c \uac00\uc838\uc628 \uac83\uc778\ub370 \ucef4\ud30c\uc77c\ub7ec\uac00 \uc0dd\uc131\ud558\ub294 text \uc601\uc5ed\uc758 \uc2dc\uc791\uc810\uc744 \uc774\uc6a9\ud574\uc11c \ud3ec\uc778\ud130 \uac12\uc774 \uc774\ub97c \uce68\ubc94 \ud558\ub294\uc9c0 \uc5ec\ubd80\ub97c \uac80\uc0ac\ud558\uace0 \uc720\ud6a8\uc131\uc744 \ud310\ub2e8\ud55c\ub2e4. \ud558\uc9c0\ub9cc \uc704 \ub9c1\ud06c\uc758 \ucee4\uba58\ud2b8\uc5d0\ub3c4 \ub098\uc640 \uc788\ub4ef\uc774 \uc2dc\uc2a4\ud15c\uc5d0 \ub530\ub77c \ub3d9\uc791\ud558\uc9c0 \uc54a\uc744 \uc218\ub3c4 \uc788\uc73c\ubbc0\ub85c reliable \ud55c \uad6c\ud604\uc774\ub77c \ubcfc \uc218\ub294 \uc5c6\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"eclipse\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">bool isValidPointer_ET(void *ptr) {\n    extern const char _etext;\n    return (ptr != nullptr) &amp;&amp; ((const char*)ptr > &amp;_etext);\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">2. msync()\ub97c \uc774\uc6a9\ud558\ub294 \ubc29\ubc95<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><a href=\"https:\/\/renatocunha.com\/2015\/12\/msync-pointer-validity\/\" data-type=\"URL\" data-id=\"https:\/\/renatocunha.com\/2015\/12\/msync-pointer-validity\/\">Checking whether a pointer is valid in Linux<\/a>\ub77c\ub294 \ube14\ub85c\uadf8 \ud3ec\uc2a4\ud2b8\uc5d0 \uc18c\uac1c\ub41c \ubc29\ubc95\uc73c\ub85c \ub9e4\ud551\ub41c \uba54\ubaa8\ub9ac \uacf5\uac04\uc744 \ub3d9\uae30\ud654 \ud560 \ub54c \uc4f0\ub294 msync() \uc2dc\uc2a4\ud15c \ucf5c\uc744 \ud638\ucd9c \ud558\uba74\uc11c \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 page \uc2dc\uc791 \uc8fc\uc18c\ub97c \ub118\uaca8 \uc8fc\uba74 0\uc774 \uc544\ub2cc \uc74c\uc218 \uac12\uc744 \ubc18\ud658\ud558\ub294 \uac83\uc744 \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\uc774\ub2e4. (\uc774 \uacbd\uc6b0 errno\uc5d0 ENOMEM\uc774 \uc124\uc815\ub41c\ub2e4)<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"eclipse\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;sys\/mman.h>\n#include &lt;unistd.h>\n\nbool isValidPointer_MS(void *ptr) {\n    const size_t pageSize = sysconf(_SC_PAGESIZE);\n    void *basePtr = (void *)((((size_t)ptr) \/ pageSize) * pageSize);\n    return msync(basePtr, pageSize, MS_SYNC) == 0;\n}<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">3. mincore()\ub97c \uc774\uc6a9\ud558\ub294 \ubc29\ubc95<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Stackoverflow\uc5d0 \uc62c\ub824\uc9c4 <a href=\"https:\/\/stackoverflow.com\/questions\/551069\/testing-pointers-for-validity-c-c\" data-type=\"URL\" data-id=\"https:\/\/stackoverflow.com\/questions\/551069\/testing-pointers-for-validity-c-c\">Testing pointers for validity (C\/C++)<\/a>\ub77c\ub294 \uc9c8\ubb38\uc5d0 \ub300\ud55c \ub2f5\ubcc0\uc5d0 \uc788\ub294 \uc544\uc774\ub514\uc5b4 \uc911 \ud558\ub098\uc778\ub370 \uba54\ubaa8\ub9ac \ud398\uc774\uc9c0\uc758 swap \uc0c1\ud0dc\ub97c \ud655\uc778\ud574\uc11c \ubc18\ud658\ud574 \uc8fc\ub294 mincore()\uc744 \uc774\uc6a9\ud558\ub294 \ubc29\ubc95\uc774\ub2e4. \ud574\ub2f9 \ub2f5\ubcc0\uc5d0\ub294 \ub2e4\ub978 \uc544\uc774\ub514\uc5b4 \ub4e4\ub3c4 \uc788\uc73c\ub2c8 \ud544\uc694\uc5d0 \ub530\ub77c \ucc38\uace0.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"eclipse\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">#include &lt;sys\/mman.h>\n#include &lt;unistd.h>\n\nbool isValidPointer_MC(void *ptr) {\n    unsigned char vec = 0;\n    const size_t pageSize = sysconf(_SC_PAGESIZE);\n    void *basePtr = (void *)((((size_t)ptr) \/ pageSize) * pageSize);\n    int ret = mincore(basePtr, pageSize, &amp;vec);\n    return (ret == 0 &amp;&amp; ((vec &amp; 0x1) == 0x1));\n}\n<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\">\uc2dc\ud5d8 \uacb0\uacfc\uc640 \uacb0\ub860<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">\uc704\uc758 \ud568\uc218\ub4e4\uc5d0 \ub300\ud574 Linux\ud658\uacbd\uc5d0\uc11c \uc804\uc5ed \ubcc0\uc218 \ud3ec\uc778\ud130, \uc9c0\uc5ed \ubcc0\uc218 \ud3ec\uc778\ud130, \ub110 \ud3ec\uc778\ud130, \ub110 \ud3ec\uc778\ud130\ub294 \uc544\ub2c8\uc9c0\ub9cc \uba85\ubc31\ud558\uac8c \ubb34\ud6a8\ud55c \ud3ec\uc778\ud130(0x04 \uac19\uc740), \ub3d9\uc801 \ud560\ub2f9\ub41c \uacf5\uac04\uc5d0 \ub300\ud55c \uc720\ud6a8\uc131 \uc5ec\ubd80\ub294 \uc798 \ub3d9\uc791\ud55c\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\ud558\uc9c0\ub9cc, \uc774\ubbf8 \ud574\uc81c\ub41c \ud3ec\uc778\ud130\ub098 \ud560\ub2f9\ub418\uc9c0 \uc54a\uc740 heap \uacf5\uac04 \ub0b4\uc758 \uc784\uc758 \uc8fc\uc18c\uc5d0 \ub300\ud574\uc11c\ub294 \uc81c\ub300\ub85c \uc720\ud6a8\uc131 \uc5ec\ubd80\ub97c \ud310\ub2e8\ud558\uc9c0 \ubabb\ud558\uace0, \uc8fc\uc18c \ubc94\uc704\uac00 \uc720\ud6a8 \ud558\ub2e4\uba74 \ud3ec\uc778\ud130 \uc5ed\uc2dc \uc720\ud6a8 \ud558\ub2e4\uace0 \ud310\ub2e8\ud558\ub294 \uc624\ub958\uac00 \uc138\uac00\uc9c0 \uad6c\ud604 \ubaa8\ub450\uc5d0 \uc788\ub2e4.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"cpp\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">    \/\/ \ud574\uc81c\ub41c heap\uacf5\uac04\uc5d0 \ub300\ud55c \uc720\ud6a8\uc131 \uc5ec\ubd80 \ud655\uc778. \ubaa8\ub450 \uc2e4\ud328\ud568.\n    unsigned int* dynamicVar = new unsigned int[100];\n    delete[] dynamicVar;\n    EXPECT_FALSE(isValidPointer_ET(dynamicVar));\n    EXPECT_FALSE(isValidPointer_MS(dynamicVar));\n    EXPECT_FALSE(isValidPointer_MC(dynamicVar));\n\n\n    \/\/ \ud560\ub2f9 \ub418\uc9c0 \uc54a\uc740 Heap\uacf5\uac04 \ub0b4\uc758 \uc784\uc758 \ud3ec\uc778\ud130\uc5d0 \ub300\ud55c \uc720\ud6a8\uc131 \ud655\uc778. \ubaa8\ub450 \uc2e4\ud328\ud568.\n    unsigned int* dynamicUnallocVar = dynamicVar + 100;\n    EXPECT_FALSE(isValidPointer_ET(dynamicUnallocVar));\n    EXPECT_FALSE(isValidPointer_MS(dynamicUnallocVar));\n    EXPECT_FALSE(isValidPointer_MC(dynamicUnallocVar)); <\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">\uc989, \uc704\uc758 \uad6c\ud604 \ub4e4\uc740 \uc8fc\uc5b4\uc9c4 \ud3ec\uc778\ud130\uac00 \uc720\ud6a8\ud55c \uba54\ubaa8\ub9ac \uacf5\uac04\ub0b4\uc5d0 \uc18d\ud558\ub294\uc9c0\ub294 \ud655\uc778\ud560 \uc218 \uc788\uc5b4\ub3c4, \ub3d9\uc801 \ud560\ub2f9 \uc601\uc5ed\uc758 \uba54\ubaa8\ub9ac \ud3ec\uc778\ud130\uac00 \uc2e4\uc81c read\/write \uac00\ub2a5\ud55c \uc0c1\ud0dc\uc778\uc9c0 \uc5ec\ubd80\ub294 \uc815\ud655\ud788 \ubc18\ud658 \ud560 \uc218 \uc5c6\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\uc2dc\ud5d8\uc5d0 \uc0ac\uc6a9\ud55c code\ub294 \uc5ec\uae30\uc5d0 \ubd99\uc5ec \ub454\ub2e4.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><script src=\"https:\/\/gist.github.com\/52bb2fcc7815d5ac08d3ce279e2a03bb.js\"><\/script><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Windows\uc5d0\uc11c\uc640 \ub2ec\ub9ac Linux\ud658\uacbd\uc5d0\uc11c\ub294 \ub531\ud788 \ud3ec\uc778\ud130\uc758 \uc720\ud6a8\uc131\uc744 \uac80\uc99d\ud560 \uc218 \uc788\ub294 system call\uc774 \uc5c6\ub2e4. \uc774 \ud3ec\uc2a4\ud305\uc740 Linux\ud658\uacbd\uc5d0\uc11c \uc774\uc640 \uc720\uc0ac\ud55c \uae30\ub2a5\uc744 \uad6c\ud604\ud558\uae30 \uc704\ud574 &#8220;\uc815\ubcf4\uc758 \ubc14\ub2e4&#8221;\uc5d0\uc11c \ucc3e\uc740 \ub0b4\uc6a9\ub4e4\uc744 \uc815\ub9ac\ud574 \ub454 \uac83\uc774\ub2e4. 1. _etext\ub97c \uc774\uc6a9\ud558\ub294 \ubc29\ubc95 \uccab\ubc88\uc9f8 \ubc29\ubc95\uc740 Define and use a pointer validation function \uc774\ub77c\ub294 \uc704\ud0a4\ubb38\uc11c\uc5d0\uc11c \uac00\uc838\uc628 \uac83\uc778\ub370 \ucef4\ud30c\uc77c\ub7ec\uac00 \uc0dd\uc131\ud558\ub294 text \uc601\uc5ed\uc758 \uc2dc\uc791\uc810\uc744 \uc774\uc6a9\ud574\uc11c \ud3ec\uc778\ud130 \uac12\uc774 \uc774\ub97c \uce68\ubc94 \ud558\ub294\uc9c0 [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[4,5],"tags":[247,61,72,266,267,269],"class_list":["post-2654","post","type-post","status-publish","format-standard","hentry","category-linux","category-programming","tag-c","tag-gtest","tag-linux","tag-memory","tag-pointer","tag-posix"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts\/2654","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=2654"}],"version-history":[{"count":16,"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts\/2654\/revisions"}],"predecessor-version":[{"id":2962,"href":"https:\/\/litcoder.com\/index.php?rest_route=\/wp\/v2\/posts\/2654\/revisions\/2962"}],"wp:attachment":[{"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=2654"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=2654"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/litcoder.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=2654"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}