{"id":471707,"date":"2025-08-23T15:00:33","date_gmt":"2025-08-23T15:00:33","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=471707"},"modified":"-0001-11-30T00:00:00","modified_gmt":"-0001-11-29T21:00:00","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=471707","title":{"rendered":"<span>ARM MTE \u0438 \u0436\u0451\u0441\u0442\u043a\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c: \u043a\u0430\u043a \u0441\u0434\u0435\u043b\u0430\u0442\u044c \u0421-\u043f\u0440\u043e\u0446\u0435\u0441\u0441\u044b \u043c\u0435\u043d\u0435\u0435 \u0443\u044f\u0437\u0432\u0438\u043c\u044b\u043c\u0438<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0434\u0435\u0440\u0436\u0430\u043b\u0438 \u0432\u00a0\u0440\u0443\u043a\u0430\u0445 \u043b\u044e\u0431\u043e\u0439 \u043a\u0440\u0443\u043f\u043d\u044b\u0439 C \u0438\u043b\u0438\u00a0C++ \u043a\u043e\u0434, \u0442\u043e \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e\u00a0\u043f\u0430\u043c\u044f\u0442\u044c \u0447\u0430\u0441\u0442\u0435\u043d\u044c\u043a\u043e \u043e\u0448\u0438\u0431\u0430\u0435\u0442\u0441\u044f. \u041d\u0430\u00a0ARM\u2011\u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0434\u0430\u0432\u043d\u043e \u0435\u0441\u0442\u044c TBI, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u044f\u0442\u0430\u0442\u044c \u0431\u0438\u0442\u044b \u0432\u00a0\u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0431\u0430\u0439\u0442\u0435 \u0430\u0434\u0440\u0435\u0441\u0430. \u041d\u0430\u00a0\u044d\u0442\u043e\u0439 \u0431\u0430\u0437\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f Memory Tagging Extension, \u043a\u043e\u0440\u043e\u0442\u043a\u043e MTE. \u042d\u0442\u043e \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u00a0\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0432\u043e\u0439 \u0434\u043b\u044f\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u0443\u0441\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438. \u0427\u0430\u0441\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u0435\u0441\u0442\u044c \u0432\u00a0\u044f\u0434\u0440\u0435 Linux, \u0447\u0430\u0441\u0442\u044c \u0432\u00a0libc, \u0447\u0430\u0441\u0442\u044c \u0432\u00a0\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430\u0445, \u0438 \u0438\u0437\u00a0\u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0436\u0451\u0441\u0442\u043a\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c, \u0441\u0442\u0440\u043e\u0433\u0443\u044e \u043a\u00a0\u0444\u0430\u043a\u0430\u043f\u0430\u043c \u0438 \u0442\u0435\u0440\u043f\u0438\u043c\u0443\u044e \u043a\u00a0\u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u2011\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435.<\/p>\n<p>MTE \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u00a0\u043a\u0430\u0436\u0434\u043e\u0439 16-\u0431\u0430\u0439\u0442\u043d\u043e\u0439 \u0433\u0440\u0430\u043d\u0443\u043b\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 4-\u0431\u0438\u0442\u043d\u044b\u0439 allocation tag. \u0410\u00a0\u0432\u00a0\u0432\u0435\u0440\u0445\u043d\u0438\u0435 \u0431\u0438\u0442\u044b \u0430\u0434\u0440\u0435\u0441\u0430 (59\u202656) \u0432\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0435 logical tag \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f. \u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043d\u0430\u00a0\u043a\u0430\u0436\u0434\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0433 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0438 \u0442\u0435\u0433 \u043f\u0430\u043c\u044f\u0442\u0438. \u0415\u0441\u043b\u0438 \u043d\u0435\u00a0\u0441\u043e\u0432\u043f\u0430\u043b\u043e, \u043f\u0440\u0438\u043b\u0435\u0442\u0438\u0442 fault \u043f\u043e\u00a0\u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c\u0443 \u0440\u0435\u0436\u0438\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u0413\u0440\u0430\u043d\u0443\u043b\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f\u00a0\u2014 16\u00a0\u0431\u0430\u0439\u0442. \u0422\u0435\u0433\u043e\u0432 16. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e\u00a0\u043f\u0440\u0438\u00a0\u0440\u0430\u043d\u0434\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0435\u0433\u043e\u0432 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0448\u0430\u043d\u0441 \u043f\u0440\u043e\u043d\u0435\u0441\u0442\u0438 \u043b\u0435\u0432\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0431\u0435\u0437\u00a0\u043e\u0448\u0438\u0431\u043a\u0438\u00a0\u2014 1\u00a0\u0438\u0437 16, \u0435\u0441\u043b\u0438 \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0438\u0439 \u043d\u0435\u00a0\u0437\u043d\u0430\u0435\u0442 \u0442\u0435\u0433. \u042d\u0442\u043e\u0442 \u0448\u0430\u043d\u0441 \u043c\u043e\u0436\u043d\u043e \u0434\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u043c\u0438 \u0442\u044d\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430.<\/p>\n<p>\u0420\u0435\u0436\u0438\u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0440\u0438: sync, async \u0438 asymmetric. Sync\u00a0\u2014 \u0442\u043e\u0447\u043d\u044b\u0439 fault \u043d\u0430\u00a0\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430. Async\u00a0\u2014 \u043e\u0442\u0447\u0451\u0442 \u043f\u043e\u0437\u0436\u0435, \u0430\u0434\u0440\u0435\u0441 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d, \u043d\u043e\u00a0\u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043c\u0435\u043d\u044c\u0448\u0435. Asymmetric\u00a0\u2014 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e, \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e. <\/p>\n<h3>\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c MTE \u0432 Linux user-space: \u0434\u0435\u0442\u0435\u043a\u0442, prctl, mmap, \u0441\u0438\u0433\u043d\u0430\u043b\u044b<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u0430\u0432\u043e \u043d\u0430\u00a0\u0442\u0435\u0433\u0438, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043c\u0435\u0442\u044c MTE, \u0430\u00a0\u044f\u0434\u0440\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0438\u0447\u0443 \u0432\u00a0user\u2011space \u0447\u0435\u0440\u0435\u0437 HWCAP2_MTE. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0442\u0430\u043a \u0438 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0440\u0435\u0436\u0438\u043c\u044b:<\/p>\n<pre><code class=\"cs\">\/\/ build: clang -std=c11 -O2 -Wall -Wextra -target aarch64-linux-gnu -march=armv8.5-a+memtag mte_boot.c #define _GNU_SOURCE #include &lt;errno.h&gt; #include &lt;inttypes.h&gt; #include &lt;signal.h&gt; #include &lt;stdbool.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;sys\/auxv.h&gt; #include &lt;sys\/mman.h&gt; #include &lt;sys\/prctl.h&gt; #include &lt;unistd.h&gt;  #ifndef HWCAP2_MTE #define HWCAP2_MTE (1u &lt;&lt; 18) #endif  #ifndef PR_SET_TAGGED_ADDR_CTRL #define PR_SET_TAGGED_ADDR_CTRL 55 #define PR_GET_TAGGED_ADDR_CTRL 56 #define PR_TAGGED_ADDR_ENABLE   (1UL &lt;&lt; 0) #define PR_MTE_TCF_SHIFT        1 #define PR_MTE_TCF_NONE         (0UL &lt;&lt; PR_MTE_TCF_SHIFT) #define PR_MTE_TCF_SYNC         (1UL &lt;&lt; PR_MTE_TCF_SHIFT) #define PR_MTE_TCF_ASYNC        (2UL &lt;&lt; PR_MTE_TCF_SHIFT) #define PR_MTE_TCF_MASK         (3UL &lt;&lt; PR_MTE_TCF_SHIFT) #define PR_MTE_TAG_SHIFT        3 #endif  static void install_sigsegv_handler(void);  static void enable_mte_thread(void) {     unsigned long hwcap2 = getauxval(AT_HWCAP2);     if (!(hwcap2 &amp; HWCAP2_MTE)) {         fprintf(stderr, \"MTE not supported on this CPU\/kernel\\n\");         exit(2);     }     \/\/ \u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u043c tagged pointers \u0432 ABI \u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0441\u0438\u043c sync+async \u044f\u0434\u0440\u043e \u0432\u044b\u0431\u0435\u0440\u0435\u0442 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c CPU.     unsigned long tag_include_mask = 0xfffeUL &lt;&lt; PR_MTE_TAG_SHIFT; \/\/ \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u043c zero-tag \u0438\u0437 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438     unsigned long flags = PR_TAGGED_ADDR_ENABLE | PR_MTE_TCF_SYNC | PR_MTE_TCF_ASYNC | tag_include_mask;     if (prctl(PR_SET_TAGGED_ADDR_CTRL, flags, 0, 0, 0) != 0) {         perror(\"prctl(PR_SET_TAGGED_ADDR_CTRL)\");         exit(1);     }     install_sigsegv_handler(); }  static void segv_handler(int sig, siginfo_t* si, void* ctx) {     (void)ctx;     \/\/ si_code: SEGV_MTESERR \u0434\u043b\u044f sync, SEGV_MTEAERR \u0434\u043b\u044f async     fprintf(stderr, \"SIGSEGV: si_code=%d, addr=%p\\n\", si-&gt;si_code, si-&gt;si_addr);     _Exit(128 + SIGSEGV); }  static void install_sigsegv_handler(void) {     struct sigaction sa = {0};     sa.sa_flags = SA_SIGINFO;     sa.sa_sigaction = segv_handler;     sigemptyset(&amp;sa.sa_mask);     sigaction(SIGSEGV, &amp;sa, NULL); }  int main(void) {     enable_mte_thread();     \/\/ \u043a\u043e\u0434     return 0; }<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b PR_* \u0438 HWCAP2_MTE \u0437\u0430\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432\u00a0\u043a\u0435\u0440\u043d\u0435\u043b\u2011\u0434\u043e\u043a\u0430\u0445. \u0420\u0435\u0436\u0438\u043c\u044b \u0438 \u043a\u043e\u0434\u044b si_code \u0434\u043b\u044f\u00a0SIGSEGV \u0442\u0430\u043a\u0438\u0435\u00a0\u0436\u0435, \u043a\u0430\u043a\u00a0\u0432\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u044f\u0434\u0440\u0430. <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u044c \u0441\u00a0\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c PROT_MTE. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0432\u00a0mmap\u00a0\u043b\u0438\u0431\u043e \u043f\u043e\u0442\u043e\u043c \u0447\u0435\u0440\u0435\u0437 mprotect. PROT_MTE \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f\u00a0\u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0445 \u0438 RAM\u2011\u0431\u044d\u043a\u0435\u043d\u0434\u043e\u0432 \u0432\u0440\u043e\u0434\u0435 tmpfs\/memfd. \u041d\u0430\u00a0\u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430\u0445 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u044f\u0434\u0440\u043e \u0432\u0435\u0440\u043d\u0451\u0442 EINVAL.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u043e\u0434\u00a0\u0442\u0435\u0433\u0438:<\/p>\n<pre><code class=\"cs\">\/\/ build: clang -std=c11 -O2 -target aarch64-linux-gnu -march=armv8.5-a+memtag mte_map.c #include &lt;sys\/mman.h&gt; #include &lt;unistd.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt;  void* mte_map_page(void) {     size_t ps = (size_t)sysconf(_SC_PAGESIZE);     void* p = mmap(NULL, ps, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);     if (p == MAP_FAILED) { perror(\"mmap\"); exit(1); }     if (mprotect(p, ps, PROT_READ|PROT_WRITE|PROT_MTE) != 0) { perror(\"mprotect PROT_MTE\"); exit(1); }     return p; }  int main(void) {     void* p = mte_map_page();     printf(\"page: %p\\n\", p);     return 0; }<\/code><\/pre>\n<p>\u042f\u0434\u0440\u043e \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u043a\u0443 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d\u043d\u044b\u0445 \u0434\u043b\u044f\u00a0\u0440\u0430\u043d\u0434\u043e\u043c\u0430 \u0442\u0435\u0433\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 PR_MTE_TAG_MASK. \u041e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0442 0. <\/p>\n<h3>\u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0442\u0435\u0433\u0438: intrinsics \u0432\u043c\u0435\u0441\u0442\u043e inline asm<\/h3>\n<p>\u0422\u0435\u0433\u0438 \u043d\u0430\u0434\u043e \u043d\u0435\u00a0\u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u043d\u043e\u00a0\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c. \u0415\u0441\u0442\u044c ACLE\u2011intrinsics \u0434\u043b\u044f\u00a0MTE, \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a <code>&lt;arm_acle.h&gt;<\/code>. \u0424\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<ul>\n<li>\n<p><code>__arm_mte_create_random_tag(ptr, mask)<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u00a0\u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u043c logical tag, \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044f \u043c\u0430\u0441\u043a\u043e\u0439 \u0437\u0430\u043f\u0440\u0435\u0442\u043d\u044b\u0435.<\/p>\n<\/li>\n<li>\n<p><code>__arm_mte_set_tag(tagged_addr)<\/code> \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 allocation tag \u043f\u043e\u00a0\u0430\u0434\u0440\u0435\u0441\u0443 \u0433\u0440\u0430\u043d\u0443\u043b\u044b, \u043d\u0430\u00a0\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 tagged_addr.<\/p>\n<\/li>\n<li>\n<p><code>__arm_mops_memset_tag(tagged_addr, val, size)<\/code> \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u0438 MOPS, \u043c\u043e\u0436\u043d\u043e \u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438 \u043f\u0430\u0447\u043a\u043e\u0439, \u043a\u0430\u043a\u00a0memset \u0441\u00a0\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0442\u0435\u0433\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u043e\u0431\u0435\u0440\u0451\u043c \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u0442\u044d\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0438 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0441\u00a0fault:<\/p>\n<pre><code class=\"cs\">\/\/ build: clang -std=c11 -O2 -target aarch64-linux-gnu -march=armv8.5-a+memtag mte_tag_demo.c #include &lt;arm_acle.h&gt; #include &lt;stddef.h&gt; #include &lt;stdint.h&gt; #include &lt;stdio.h&gt; #include &lt;sys\/mman.h&gt; #include &lt;unistd.h&gt;  static inline void* tag_range(void* base, size_t len, uint16_t exclude_mask) {     \/\/ \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0434\u0438\u043d \u0442\u0435\u0433 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u0441\u0442\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u043d\u0430 \u0432\u0441\u0435 \u0433\u0440\u0430\u043d\u0443\u043b\u044b     void* tagged = __arm_mte_create_random_tag(base, exclude_mask); #if defined(__ARM_FEATURE_MOPS) &amp;&amp; defined(__ARM_FEATURE_MEMORY_TAGGING)     size_t g = 16;     size_t n = (len + g - 1) \/ g * g;     __arm_mops_memset_tag(tagged, 0, n); #else     \/\/ Fallback \u2014 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0435\u0433 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0433\u0440\u0430\u043d\u0443\u043b\u0443     uintptr_t p = (uintptr_t)tagged;     uintptr_t start = p &amp; ~((uintptr_t)0xF);     uintptr_t end   = start + ((len + 15) &amp; ~((size_t)0xF));     for (uintptr_t a = start; a &lt; end; a += 16) {         __arm_mte_set_tag((void*)a);     } #endif     return tagged; }  int main(void) {     size_t ps = (size_t)sysconf(_SC_PAGESIZE);     void* raw = mmap(NULL, ps, PROT_READ|PROT_WRITE|PROT_MTE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);     if (raw == MAP_FAILED) return 1;      char* buf = (char*)tag_range(raw, 64, \/*exclude tag 0*\/ 0x1);     buf[0] = 0x42;          \/\/ \u043e\u043a \u2014 \u0430\u0434\u0440\u0435\u0441 \u0441 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0442\u0435\u0433\u043e\u043c \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0430\u043b\u043b\u043e\u043a-\u0442\u0435\u0433\u043e\u043c     printf(\"ok: %p\\n\", buf);     char* bad = (char*)((uintptr_t)buf &amp; ~((uintptr_t)0xFF &lt;&lt; 56)); \/\/ \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0435\u0433     bad[0] = 1;             \/\/ \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0438\u043b\u0435\u0442\u0438\u0442 SIGSEGV \u0432 sync\/addr=bad, \u043b\u0438\u0431\u043e async \u0431\u0435\u0437 addr     return 0; }<\/code><\/pre>\n<p>\u0421\u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u044f\u0434\u0440\u0430 \u0432\u00a0\u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0435\u0436\u0438\u043c\u0430\u0445 \u0432\u0435\u0434\u0451\u0442 \u0441\u0435\u0431\u044f \u043f\u043e\u2011\u0440\u0430\u0437\u043d\u043e\u043c\u0443. \u0412\u00a0sync \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 SIGSEGV \u0441 <code>si_code = SEGV_MTESERR<\/code> \u0438 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c <code>.si_addr<\/code>. \u0412\u00a0async\u00a0\u2014 <code>SEGV_MTEAERR<\/code> \u0438 <code>.si_addr = 0<\/code>. <\/p>\n<h3>\u0413\u043e\u0442\u043e\u0432\u044b\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438: glibc, \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b, Android<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435\u00a0\u043f\u0438\u0448\u0435\u0442\u0435 \u0441\u0432\u043e\u0439 \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440, \u0430\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 glibc, \u0442\u043e \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441\u00a0MTE \u0435\u0441\u0442\u044c \u0438\u0437\u00a0\u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 tunable. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u00a0\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0438 malloc \u043d\u0430\u0447\u043d\u0451\u0442 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u044d\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c, \u0430\u00a0\u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 libc \u0432\u043a\u043b\u044e\u0447\u0438\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u0440\u0435\u0436\u0438\u043c\u044b \u0432\u00a0\u044f\u0434\u0440\u0435.<\/p>\n<p>\u041a\u043b\u044e\u0447: <code>GLIBC_TUNABLES=glibc.mem.tagging=&lt;mask&gt;<\/code>, \u0433\u0434\u0435 \u0431\u0438\u0442 0\u00a0\u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0442\u044d\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439, \u0431\u0438\u0442 1\u00a0\u2014 precise faulting, \u0431\u0438\u0442 2\u00a0\u2014 \u00ab\u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\u00bb \u043c\u0435\u0436\u0434\u0443 sync\/async. \u0414\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0435 \u043f\u0440\u043e\u0434\u2011\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 5, \u0442\u043e \u0435\u0441\u0442\u044c \u0431\u0438\u0442\u044b 0\u00a0\u0438 2. <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0431\u0435\u0437\u00a0\u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"cs\"># \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0442\u044d\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 malloc \u0438 \u0434\u0430\u0451\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 GLIBC_TUNABLES=glibc.mem.tagging=5 .\/your_binary<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u044b\u0435 \u0438 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0435\u043a\u0438 \u0442\u043e\u0436\u0435 \u0434\u0432\u0438\u0433\u0430\u044e\u0442\u0441\u044f \u0432\u00a0\u044d\u0442\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u0443. Chromium \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 MTE \u0447\u0435\u0440\u0435\u0437 PartitionAlloc \u0438 \u043c\u0435\u0442\u0438\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\/\u0447\u0430\u043d\u043a\u0438, Android \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0436\u0438\u043c\u044b \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e MTE \u0432\u00a0\u0441\u0442\u0435\u043ae \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u0414\u043b\u044f\u00a0\u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442 asymmetric \u0438\u043b\u0438\u00a0async \u0441\u00a0\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043d\u043e\u0439. \u041d\u0430\u00a0\u043d\u043e\u0432\u044b\u0445 Pixel \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 MTE \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u00a0dev\u2011\u0440\u0435\u0436\u0438\u043c\u0435 \u0447\u0435\u0440\u0435\u0437 Options, \u043d\u043e\u00a0\u044d\u0442\u043e \u043d\u0435\u00a0\u0440\u0435\u0436\u0438\u043c \u0434\u043b\u044f\u00a0\u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b. \u0421\u0442\u043e\u0440\u043e\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432\u00a0\u2014 \u0434\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>HWAddressSanitizer \u0432\u00a0Clang. \u042d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043d\u0430\u00a0\u0431\u0430\u0437\u0435 top\u2011byte\u2011ignore \u0438 MTE. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f <code>-fsanitize=hwaddress<\/code>, \u043d\u0430\u00a0\u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u0441\u00a0MTE \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00a0\u0436\u0435\u043b\u0435\u0437\u043e. \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f LLVM \u0438 Android \u044d\u0442\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e\u0442. <\/p>\n<\/li>\n<li>\n<p>MemTagSanitizer\/stack tagging. \u0415\u0441\u0442\u044c sanitizer \u00abmemtag\u00bb \u0438 \u043e\u043f\u0446\u0438\u0438 \u0434\u043b\u044f\u00a0\u0442\u044d\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u0430. \u0412\u00a0LLVM \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 MemTagSanitizer, \u0432\u00a0GCC \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0442 <code>-fsanitize=memtag-stack<\/code>. <\/p>\n<\/li>\n<\/ul>\n<h2>\u0421\u0432\u043e\u0439 \u0436\u0451\u0441\u0442\u043a\u0438\u0439 malloc: \u0440\u0435\u0442\u044d\u0433 \u043d\u0430 free, \u043f\u0430\u0434\u0434\u0438\u043d\u0433\u0438 \u043f\u043e 16, \u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u0437\u043e\u043d\u044b<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442\u0435 \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0438\u043b\u0438\u00a0\u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u043b \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0442\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u0442\u0430\u043a\u0430\u044f: \u043e\u0434\u0438\u043d \u0442\u0435\u0433 \u043d\u0430\u00a0\u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0440\u0438\u00a0alloc, \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u044b\u0439 \u0440\u0435\u0442\u044d\u0433 \u043d\u0430\u00a0free, \u043f\u0430\u0434\u0434\u0438\u043d\u0433 \u0434\u043e 16\u00a0\u0431\u0430\u0439\u0442 \u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u043d\u0430\u00a0\u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u0433\u0440\u0430\u043d\u0443\u043b. \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043e\u0431\u0451\u0440\u0442\u0447\u0438\u043a\u0430 \u0441\u00a0\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439 \u0440\u0435\u0442\u044d\u0433\u0433\u0430\u0446\u0438\u0435\u0439 \u0438 \u043a\u0440\u0430\u0441\u043d\u043e\u0439 \u0437\u043e\u043d\u043e\u0439:<\/p>\n<pre><code class=\"cs\">\/\/ build: clang -std=c11 -O2 -fno-omit-frame-pointer -target aarch64-linux-gnu -march=armv8.5-a+memtag tagged_alloc.c #include &lt;arm_acle.h&gt; #include &lt;stdalign.h&gt; #include &lt;stdatomic.h&gt; #include &lt;stdint.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;sys\/mman.h&gt; #include &lt;unistd.h&gt;  typedef struct {     size_t usable;     void*  raw;   \/\/ \u0430\u0434\u0440\u0435\u0441 \u0431\u0435\u0437 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0442\u0435\u0433\u0430, \u0434\u043b\u044f munmap } header_t;  static inline size_t round_up16(size_t n) { return (n + 15) &amp; ~((size_t)15); }  \/\/ \u0412\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u044c \u0447\u0435\u0440\u0435\u0437 mmap \u043f\u043e\u0434 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a+\u0434\u0430\u043d\u043d\u044b\u0435 \u0441 PROT_MTE static void* mte_alloc_raw(size_t bytes_with_hdr) {     size_t ps = (size_t)sysconf(_SC_PAGESIZE);     size_t total = ((bytes_with_hdr + ps - 1)\/ps)*ps;     void* raw = mmap(NULL, total, PROT_READ|PROT_WRITE|PROT_MTE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);     if (raw == MAP_FAILED) return NULL;     return raw; }  void* tagged_alloc(size_t n) {     size_t user = round_up16(n);     size_t pad  = 16; \/\/ \u043a\u0440\u0430\u0441\u043d\u0430\u044f \u0437\u043e\u043d\u0430 \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430     size_t need = sizeof(header_t) + user + pad;     void* raw = mte_alloc_raw(need);     if (!raw) return NULL;      \/\/ \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a \u0434\u0435\u043b\u0430\u0435\u043c \u043d\u0435\u0442\u044d\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u043c \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u0435\u043c.     header_t* h = (header_t*)raw;     h-&gt;usable = user;     h-&gt;raw    = raw;      \/\/ \u0414\u0430\u043d\u043d\u044b\u0435 \u043d\u0430\u0447\u0438\u043d\u0430\u044e\u0442\u0441\u044f \u043f\u043e\u0441\u043b\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430, \u0432\u044b\u0440\u043e\u0432\u043d\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043e 16     uintptr_t base = ((uintptr_t)raw + sizeof(header_t) + 15) &amp; ~((uintptr_t)15);     void* data = (void*)base;      \/\/ \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043d\u0435-\u043d\u0443\u043b\u0435\u0432\u043e\u0439 \u0442\u0435\u0433 \u0434\u043b\u044f \u043e\u0431\u044a\u0435\u043a\u0442\u0430 \u0438 \u0441\u0442\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u043d\u0430 \u0432\u0441\u0435 \u0433\u0440\u0430\u043d\u0443\u043b\u044b user+pad     uint16_t exclude0 = 0x1;     void* tagged = __arm_mte_create_random_tag(data, exclude0);     size_t total = user + pad; #if defined(__ARM_FEATURE_MOPS) &amp;&amp; defined(__ARM_FEATURE_MEMORY_TAGGING)     __arm_mops_memset_tag(tagged, 0, total); #else     uintptr_t start = (uintptr_t)tagged &amp; ~((uintptr_t)0xF);     uintptr_t end   = start + round_up16(total);     for (uintptr_t p = start; p &lt; end; p += 16) __arm_mte_set_tag((void*)p); #endif     return tagged; }  void tagged_free(void* tagged_ptr) {     if (!tagged_ptr) return;      \/\/ \u0420\u0435\u0442\u044d\u0433 \u043f\u0435\u0440\u0435\u0434 \u043e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435\u043c: \u00ab\u043b\u043e\u043c\u0430\u0435\u043c\u00bb \u0441\u0442\u0430\u0440\u044b\u0435 \u0434\u044d\u043d\u0433\u043b\u0438\u043d\u0433\u0438     void* retagged = __arm_mte_create_random_tag(tagged_ptr, 0); #if defined(__ARM_FEATURE_MEMORY_TAGGING)     __arm_mte_set_tag(retagged); \/\/ \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0441\u0431\u0438\u0442\u044c \u043f\u0435\u0440\u0432\u0443\u044e \u0433\u0440\u0430\u043d\u0443\u043b\u0443, \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0441\u0435\u0439\u0447\u0430\u0441 \u0432\u0435\u0440\u043d\u0451\u0442 \u043f\u0430\u043c\u044f\u0442\u044c \u044f\u0434\u0440\u0443 #endif      \/\/ \u041d\u0430\u0445\u043e\u0434\u0438\u043c \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a. \u0423 \u043d\u0435\u0433\u043e top-byte = 0     uintptr_t uptr = (uintptr_t)tagged_ptr &amp; ~(((uintptr_t)0xFF) &lt;&lt; 56);     header_t* h = (header_t*)((uptr - sizeof(header_t)) &amp; ~((uintptr_t)0xF));     \/\/ munmap \u043f\u043e raw     \/\/ \u0417\u0434\u0435\u0441\u044c \u043d\u0443\u0436\u0435\u043d \u0440\u0435\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430, \u0432 \u043f\u0440\u043e\u0434\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0435 \u0435\u0433\u043e \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0435, \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u043c:     size_t ps = (size_t)sysconf(_SC_PAGESIZE);     munmap(h-&gt;raw, ps); \/\/ \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u043e }<\/code><\/pre>\n<p>\u0420\u0435\u0442\u044d\u0433 \u043d\u0430\u00a0free \u0434\u0430\u0451\u0442 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u043a\u00a0use\u2011after\u2011free. \u0421\u0442\u0430\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438 \u00ab\u043d\u0435 \u043f\u043e\u0434\u0445\u043e\u0434\u0438\u0442\u00bb \u043a\u00a0\u043f\u0430\u043c\u044f\u0442\u0438 \u043f\u0440\u0438\u00a0\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435 \u0438 \u043f\u0430\u0434\u0430\u0435\u0442. <\/p>\n<p>\u041a\u0440\u0430\u0441\u043d\u0430\u044f \u0437\u043e\u043d\u0430 \u0438\u0437 16\u00a0\u0431\u0430\u0439\u0442 \u043b\u043e\u0432\u0438\u0442 \u043d\u0435\u0431\u043e\u043b\u044c\u0448\u0438\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u043e\u043b\u0437\u0430\u043d\u0438\u044f \u0437\u0430\u00a0\u0433\u0440\u0430\u043d\u0438\u0446\u0443 \u043e\u0431\u044a\u0435\u043a\u0442\u0430. \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e\u00a0\u0433\u0440\u0430\u043d\u0443\u043b\u0430 16\u00a0\u0431\u0430\u0439\u0442, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u0432\u043d\u0443\u0442\u0440\u0438\u0433\u0440\u0430\u043d\u0443\u043b\u044c\u043d\u044b\u0435 \u043f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u043d\u0443\u0442\u0441\u044f \u043d\u0435\u0432\u0438\u0434\u0438\u043c\u044b\u043c\u0438\u00a0\u2014 \u0438\u0445 \u043e\u0442\u043b\u0430\u0432\u043b\u0438\u0432\u0430\u044e\u0442 \u043f\u0430\u0434\u0434\u0438\u043d\u0433\u0438 \u0438 \u0430\u043a\u043a\u0443\u0440\u0430\u0442\u043d\u0430\u044f \u0440\u0430\u0441\u043a\u043b\u0430\u0434\u043a\u0430 \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440.<\/p>\n<p>PROT_MTE \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u0435\u043d \u0434\u043b\u044f\u00a0\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430, \u0438\u043d\u0430\u0447\u0435 \u0442\u0435\u0433\u2011\u0434\u043e\u0441\u0442\u0443\u043f\u044b \u043d\u0435\u00a0\u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442. <\/p>\n<h3>\u041a\u0430\u043a \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0438 \u0447\u0442\u043e \u0438\u0437\u043c\u0435\u0440\u044f\u0442\u044c<\/h3>\n<p>\u0411\u0430\u0437\u043e\u0432\u044b\u0435 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u044b:<\/p>\n<ul>\n<li>\n<p>\u0420\u0430\u0437\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438 CI\u00a0\u2014 sync. \u0422\u043e\u0447\u043d\u044b\u0435 \u0430\u0434\u0440\u0435\u0441\u0430, \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0435 \u043e\u0442\u0447\u0451\u0442\u044b, \u0434\u043e\u0440\u043e\u0436\u0435 \u043f\u043e\u00a0\u0432\u0440\u0435\u043c\u0435\u043d\u0438. \u042f\u0434\u0440\u043e \u0448\u043b\u0451\u0442 SIGSEGV \u0441\u00a0SEGV_MTESERR \u0438 \u0430\u0434\u0440\u0435\u0441\u043e\u043c. <\/p>\n<\/li>\n<li>\n<p>\u041f\u0440\u043e\u0434\u00a0\u2014 asymmetric \u0438\u043b\u0438\u00a0async. \u041d\u0430\u00a0\u0442\u0438\u043f\u0438\u0447\u043d\u044b\u0445 \u0440\u0430\u0431\u043e\u0447\u0438\u0445 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0430\u0445 \u044d\u0442\u043e \u043e\u043a\u043e\u043b\u043e 1\u20132% \u043a\u00a0\u0446\u0435\u043d\u0435, \u043f\u0440\u0438\u00a0\u044d\u0442\u043e\u043c \u0432\u044b \u0432\u0441\u0451 \u0435\u0449\u0451 \u0443\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043a\u043b\u0430\u0441\u0441 \u0431\u0430\u0433\u043e\u0432 \u0438\u0437\u00a0\u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u0438. <\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u044b\u0440\u043e\u0439 sync \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043c\u0435\u0434\u043b\u044f\u0442\u044c \u0442\u044f\u0436\u0451\u043b\u044b\u0435 memset \u043d\u0430\u00a0\u0434\u0435\u0441\u044f\u0442\u043a\u0438 \u043f\u0440\u043e\u0446\u0435\u043d\u0442\u043e\u0432. \u042d\u0442\u043e \u043e\u0436\u0438\u0434\u0430\u0435\u043c\u043e. \u0412\u00a0\u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f\u0445 \u0432\u043a\u043b\u0430\u0434 \u043c\u0435\u043d\u044c\u0448\u0435 \u0437\u0430\u00a0\u0441\u0447\u0451\u0442 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u00a0\u043d\u0435\u00a0\u0432\u0435\u0441\u044c \u043a\u043e\u0434\u00a0\u2014 \u0441\u043f\u043b\u043e\u0448\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438. <\/p>\n<h3>\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0412\u0430\u0436\u043d\u043e \u0434\u0435\u0440\u0436\u0430\u0442\u044c \u0432\u00a0\u0433\u043e\u043b\u043e\u0432\u0435 \u0442\u0440\u0438 \u0432\u0435\u0449\u0438.<\/p>\n<p>\u041f\u0435\u0440\u0432\u043e\u0435. \u0413\u0440\u0430\u043d\u0443\u043b\u0430 16\u00a0\u0431\u0430\u0439\u0442. \u041f\u0435\u0440\u0435\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f \u0432\u043d\u0443\u0442\u0440\u0438 \u0433\u0440\u0430\u043d\u0443\u043b\u044b \u043d\u0435\u00a0\u0434\u0435\u0442\u0435\u043a\u0442\u044f\u0442\u0441\u044f. \u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c\u0438\u0447\u0435\u0441\u043a\u0438 \u044d\u0442\u043e \u043b\u0435\u0447\u0438\u0442\u0441\u044f \u0432\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u043f\u043e\u043b\u0435\u0439 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u0438 \u043f\u0430\u0434\u0434\u0438\u043d\u0433\u0430\u043c\u0438. \u0412\u0442\u043e\u0440\u043e\u0435. \u0422\u0435\u0433\u043e\u0432 \u0432\u0441\u0435\u0433\u043e 16. \u0415\u0441\u043b\u0438 \u0437\u043b\u043e\u0443\u043c\u044b\u0448\u043b\u0435\u043d\u043d\u0438\u043a \u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0442\u044c \u0442\u0435\u0433\u0438 \u0441\u0430\u0439\u0434\u2011\u0447\u0430\u043d\u043d\u0435\u043b\u043e\u043c, \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u043f\u043e\u0434\u0431\u0438\u0440\u0430\u0442\u044c \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u0435 \u043a\u043e\u043c\u0431\u0438\u043d\u0430\u0446\u0438\u0438. \u0421\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0435 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u044e\u0442, \u0447\u0442\u043e\u00a0\u0447\u0435\u0440\u0435\u0437 \u0441\u043f\u0435\u043a\u0443\u043b\u044f\u0442\u0438\u0432\u043d\u044b\u0435 \u0433\u0430\u0434\u0436\u0435\u0442\u044b \u043c\u043e\u0436\u043d\u043e \u0443\u0442\u0435\u043a\u0430\u0442\u044c \u0442\u0435\u0433\u0438 \u0438 \u043f\u043e\u0434\u0440\u044b\u0432\u0430\u0442\u044c \u0432\u0435\u0440\u043e\u044f\u0442\u043d\u043e\u0441\u0442\u044c \u0437\u0430\u0449\u0438\u0442\u044b. \u042d\u0442\u043e \u043d\u0435\u00a0\u043e\u0442\u043c\u0435\u043d\u044f\u0435\u0442 \u043f\u043e\u043b\u044c\u0437\u044b MTE, \u043d\u043e\u00a0\u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u043e\u0432\u043c\u0435\u0449\u0435\u043d\u0438\u044f \u0441\u00a0\u0434\u0440\u0443\u0433\u0438\u043c\u0438 \u043f\u0440\u0438\u0451\u043c\u0430\u043c\u0438 \u0438 \u0440\u0430\u043d\u0434\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0435\u0439. <\/p>\n<p>\u0422\u0440\u0435\u0442\u044c\u0435. Async\u2011\u0440\u0435\u0436\u0438\u043c \u0443\u043f\u0440\u043e\u0449\u0430\u0435\u0442 \u0441\u0442\u0430\u0431\u0438\u043b\u044c\u043d\u043e\u0441\u0442\u044c \u0432\u00a0\u043f\u0440\u043e\u0434\u0435, \u043d\u043e\u00a0\u0441\u0438\u0433\u043d\u0430\u043b \u043f\u0440\u0438\u0445\u043e\u0434\u0438\u0442 \u0431\u0435\u0437\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430, \u0437\u043d\u0430\u0447\u0438\u0442 \u0434\u043b\u044f\u00a0\u0430\u043d\u0430\u043b\u0438\u0437\u0430 \u0432\u0430\u043c \u043d\u0443\u0436\u0435\u043d \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u043b\u043e\u0433 \u0438, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u0432\u044b\u0431\u043e\u0440\u043e\u0447\u043d\u044b\u0439 sync \u043d\u0430\u00a0\u043f\u043e\u0434\u043e\u0437\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0443\u0447\u0430\u0441\u0442\u043a\u0430\u0445. <\/p>\n<h3>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0438 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u044f<\/h3>\n<p>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 1. \u0412\u044b \u043d\u0438\u0447\u0435\u0433\u043e \u043d\u0435\u00a0\u0442\u0440\u043e\u0433\u0430\u0435\u0442\u0435 \u0432\u00a0\u043a\u043e\u0434\u0435, \u043d\u043e\u00a0\u0445\u043e\u0442\u0438\u0442\u0435\u00a0\u0431\u044b\u0441\u0442\u0440\u044b\u0439 \u0432\u044b\u0438\u0433\u0440\u044b\u0448 \u043d\u0430\u00a0\u0441\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u044b\u0445 ARM\u2011\u0441\u0435\u0440\u0432\u0435\u0440\u0430\u0445 \u0438\u043b\u0438\u00a0\u043d\u043e\u0443\u0442\u0431\u0443\u043a\u0430\u0445. \u0421\u043e\u0431\u0438\u0440\u0430\u0435\u0442\u0435 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0440\u0435\u043b\u0438\u0437, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0435 \u0441\u0435\u0440\u0432\u0438\u0441 \u0441 <code>GLIBC_TUNABLES=glibc.mem.tagging=5<\/code>. \u0412\u00a0\u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0435 \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0435 preferred \u0440\u0435\u0436\u0438\u043c\u044b \u043d\u0430\u00a0CPU, \u0447\u0442\u043e\u0431\u044b \u044f\u0434\u0440\u043e \u043c\u043e\u0433\u043b\u043e \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0440\u043e\u0433\u0438\u0439 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u043f\u0440\u0438\u00a0\u0442\u043e\u043c\u00a0\u0436\u0435 \u0431\u044e\u0434\u0436\u0435\u0442\u0435. \u0415\u0441\u043b\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442, kernel\u2011docs \u043e\u043f\u0438\u0441\u044b\u0432\u0430\u044e\u0442 \u00abpreferred mode\u00bb \u043d\u0430\u00a0CPU. <\/p>\n<p>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 2. \u041a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442 \u0441\u00a0\u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0439 \u0430\u0440\u0435\u043d\u043e\u0439\/\u043f\u0443\u043b\u043e\u043c. \u041e\u0431\u043e\u0440\u0430\u0447\u0438\u0432\u0430\u0435\u0442\u0435 mmap\u2011\u043f\u0443\u043b\u044b \u0432\u00a0PROT_MTE, \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0435 <code>tag_range()<\/code> \u043d\u0430\u00a0alloc \u0438 \u0440\u0435\u0442\u044d\u0433 \u043d\u0430\u00a0free. \u0412\u044b\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442\u0435 \u0431\u0443\u0444\u0435\u0440\u044b \u043f\u043e 16. \u041f\u043e\u00a0\u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0435 \u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u0437\u043e\u043d\u044b \u043f\u043e 16\u00a0\u0431\u0430\u0439\u0442 \u0441\u00a0\u043a\u0430\u0436\u0434\u043e\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u044b.<\/p>\n<p>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 3. Android\/\u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0439 \u043f\u0440\u043e\u0434. \u0421\u043b\u0435\u0434\u0443\u0435\u043c \u0433\u0430\u0439\u0434\u043b\u0430\u0439\u043d\u0430\u043c \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u044b: \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c asymmetric \u0442\u0430\u043c, \u0433\u0434\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e,\u00a0\u043b\u0438\u0431\u043e async. \u0422\u0435\u0441\u0442\u0438\u0440\u0443\u0435\u043c \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c. \u0423\u0447\u0438\u0442\u044b\u0432\u0430\u0435\u043c, \u0447\u0442\u043e\u00a0\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f \u0443\u0436\u0435 \u043c\u043e\u0433\u0443\u0442 \u0436\u0438\u0442\u044c \u0441\u00a0MTE, \u043d\u043e\u00a0\u044d\u0442\u043e \u043d\u0435\u00a0\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e\u00a0\u043a\u0430\u0436\u0434\u044b\u0439 \u0441\u0442\u043e\u0440\u043e\u043d\u043d\u0438\u0439 \u0430\u043f\u043f\u043e\u0432\u044b\u0439 \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e \u0442\u044d\u0433\u0438\u0440\u0443\u0435\u0442 \u043f\u0430\u043c\u044f\u0442\u044c. <\/p>\n<p>\u0421\u0446\u0435\u043d\u0430\u0440\u0438\u0439 4. \u0418\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c HWASan \u0438\u043b\u0438\u00a0memtag\u2011stack \u0432\u00a0CI, \u0430\u00a0\u0432\u00a0\u0440\u0435\u043b\u0438\u0437\u0430\u0445\u00a0\u2014 \u0442\u043e\u043b\u044c\u043a\u043e heap\u2011\u0442\u044d\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 glibc tunable. \u042d\u0442\u043e \u0434\u0430\u0451\u0442 \u0445\u043e\u0440\u043e\u0448\u0438\u0439 \u0431\u0430\u043b\u0430\u043d\u0441.<\/p>\n<h2>\u0412\u044b\u0432\u043e\u0434<\/h2>\n<p>MTE \u044d\u0442\u043e \u043d\u0435\u043f\u0430\u043d\u0446\u0435\u044f, \u043d\u043e\u00a0\u044d\u0442\u043e \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u0430\u043a\u0442\u0438\u0447\u043d\u0430\u044f \u0436\u0451\u0441\u0442\u043a\u0430\u044f \u043f\u0430\u043c\u044f\u0442\u044c \u0434\u043b\u044f\u00a0C \u043d\u0430\u00a0ARM. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f \u0441\u00a0\u0443\u043c\u0435\u0440\u0435\u043d\u043d\u043e\u0439 \u0446\u0435\u043d\u043e\u0439 \u0438 \u0445\u043e\u0440\u043e\u0448\u043e \u043b\u043e\u0432\u0438\u0442 \u0442\u043e, \u0447\u0442\u043e\u00a0\u0440\u0430\u043d\u044c\u0448\u0435 \u0443\u0435\u0437\u0436\u0430\u043b\u043e \u0432\u00a0\u044d\u043a\u0441\u043f\u043b\u0443\u0430\u0442\u0430\u0446\u0438\u044e: UAF, \u043c\u0435\u0436\u043e\u0431\u044a\u0435\u043a\u0442\u043d\u044b\u0435 \u0432\u044b\u0445\u043e\u0434\u044b \u0437\u0430\u00a0\u0433\u0440\u0430\u043d\u0438\u0446\u044b. \u041d\u0430\u00a0Linux \u043f\u0443\u0442\u044c \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439: prctl, PROT_MTE, ACLE\u2011intrinsics, glibc\u2011tunable. \u041d\u0430\u00a0Android\u00a0\u2014 \u0432\u044b\u0431\u043e\u0440 \u0440\u0435\u0436\u0438\u043c\u0430 \u043f\u043e\u0434\u00a0\u043f\u0440\u043e\u0444\u0438\u043b\u044c \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438.<\/p>\n<hr\/>\n<p>ARM MTE \u043d\u0435\u00a0\u0440\u0435\u0448\u0430\u0435\u0442 \u0432\u0441\u0435\u0445 \u043f\u0440\u043e\u0431\u043b\u0435\u043c, \u043d\u043e\u00a0\u043f\u043e\u043c\u043e\u0433\u0430\u0435\u0442 \u0437\u043d\u0430\u0447\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0432\u044b\u0441\u0438\u0442\u044c \u043d\u0430\u0434\u0451\u0436\u043d\u043e\u0441\u0442\u044c \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c \u043d\u0430\u00a0C \u0437\u0430\u00a0\u0441\u0447\u0451\u0442 \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u043e\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043a\u043e\u0440\u0440\u0435\u043a\u0442\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438. \u041e\u0434\u043d\u0430\u043a\u043e \u0441\u0430\u043c\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0435 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a\u00a0\u0443\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u044c \u0438 \u043a\u0430\u043a\u0438\u0435 \u043f\u0440\u0438\u0451\u043c\u044b \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044e\u0442 \u043f\u0438\u0441\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u044b\u0439 \u043a\u043e\u0434, \u0442\u0440\u0435\u0431\u0443\u0435\u0442 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u044f \u044f\u0437\u044b\u043a\u0430.<\/p>\n<p>\u0414\u043b\u044f\u00a0\u044d\u0442\u043e\u0433\u043e \u043c\u044b \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0435\u043c \u0432\u0430\u0441 \u043d\u0430\u00a0\u043a\u0443\u0440\u0441 <a href=\"https:\/\/otus.pw\/N3fd\/\" rel=\"noopener noreferrer nofollow\">\u00ab\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0421\u00bb<\/a>. \u0412\u00a0\u0440\u0430\u043c\u043a\u0430\u0445 \u043a\u0443\u0440\u0441\u0430 \u043f\u0440\u0435\u0434\u0443\u0441\u043c\u043e\u0442\u0440\u0435\u043d\u044b <strong>\u0431\u0435\u0441\u043f\u043b\u0430\u0442\u043d\u044b\u0435 <\/strong>\u043e\u0442\u043a\u0440\u044b\u0442\u044b\u0435 \u0443\u0440\u043e\u043a\u0438, \u0433\u0434\u0435 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441\u00a0\u043a\u043b\u044e\u0447\u0435\u0432\u044b\u043c\u0438 \u0442\u0435\u043c\u0430\u043c\u0438:<\/p>\n<ul>\n<li>\n<p><em>25\u00a0\u0430\u0432\u0433\u0443\u0441\u0442\u0430 \u0432 20:00<\/em>\u00a0\u2014 <a href=\"https:\/\/otus.pw\/EyVB\/\" rel=\"noopener noreferrer nofollow\">\u00ab\u041e\u0431\u0437\u043e\u0440 \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0430 \u042123\u00bb<\/a><\/p>\n<\/li>\n<li>\n<p><em>4\u00a0\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f \u0432 20:00<\/em>\u00a0\u2014 <a href=\"https:\/\/otus.pw\/bZrF\/\" rel=\"noopener noreferrer nofollow\">\u00ab\u0420\u0430\u0431\u043e\u0442\u0430 \u0441\u00a0I\/O \u0432\u00a0\u0421\u0438. \u0418\u0437\u0443\u0447\u0430\u0435\u043c \u043f\u043e\u0434\u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0432\u0432\u043e\u0434\u2011\u0432\u044b\u0432\u043e\u0434\u0430\u00bb<\/a><\/p>\n<\/li>\n<li>\n<p><em>15\u00a0\u0441\u0435\u043d\u0442\u044f\u0431\u0440\u044f \u0432 20:00<\/em>\u00a0\u2014 <a href=\"https:\/\/otus.pw\/UurF\/\" rel=\"noopener noreferrer nofollow\">\u00ab\u041e\u0441\u043d\u043e\u0432\u044b \u0440\u0430\u0431\u043e\u0442\u044b \u0441\u00a0\u043f\u0430\u043c\u044f\u0442\u044c\u044e \u0432\u00a0\u044f\u0437\u044b\u043a\u0435 \u0421\u0438\u00bb<\/a><\/p>\n<\/li>\n<\/ul>\n<p>\u041a\u0440\u043e\u043c\u0435 \u0442\u043e\u0433\u043e, \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0430\u0435\u043c \u0432\u0430\u0441 \u043e\u0437\u043d\u0430\u043a\u043e\u043c\u0438\u0442\u044c\u0441\u044f \u0441\u00a0<a href=\"https:\/\/otus.ru\/reviews\/course\/16%3A202\" rel=\"noopener noreferrer nofollow\"><strong>\u043e\u0442\u0437\u044b\u0432\u0430\u043c\u0438 \u043f\u043e\u00a0\u043a\u0443\u0440\u0441\u0443 \u00ab\u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0441\u0442 \u0421\u00bb<\/strong><\/a>. \u042d\u0442\u043e \u043f\u043e\u0437\u0432\u043e\u043b\u0438\u0442 \u043f\u043e\u043d\u044f\u0442\u044c, \u043a\u0430\u043a\u00a0\u043e\u0431\u0443\u0447\u0435\u043d\u0438\u0435 \u043f\u0440\u043e\u0445\u043e\u0434\u0438\u0442 \u043d\u0430\u00a0\u043f\u0440\u0430\u043a\u0442\u0438\u043a\u0435 \u0438 \u043a\u0430\u043a\u0438\u0435 \u0432\u043f\u0435\u0447\u0430\u0442\u043b\u0435\u043d\u0438\u044f \u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0443\u00a0\u0443\u0447\u0430\u0441\u0442\u043d\u0438\u043a\u043e\u0432. <\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/939340\/\"> https:\/\/habr.com\/ru\/articles\/939340\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u041f\u0440\u0438\u0432\u0435\u0442, \u0425\u0430\u0431\u0440!<\/p>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u0434\u0435\u0440\u0436\u0430\u043b\u0438 \u0432\u00a0\u0440\u0443\u043a\u0430\u0445 \u043b\u044e\u0431\u043e\u0439 \u043a\u0440\u0443\u043f\u043d\u044b\u0439 C \u0438\u043b\u0438\u00a0C++ \u043a\u043e\u0434, \u0442\u043e \u0437\u043d\u0430\u0435\u0442\u0435, \u0447\u0442\u043e\u00a0\u043f\u0430\u043c\u044f\u0442\u044c \u0447\u0430\u0441\u0442\u0435\u043d\u044c\u043a\u043e \u043e\u0448\u0438\u0431\u0430\u0435\u0442\u0441\u044f. \u041d\u0430\u00a0ARM\u2011\u0441\u0438\u0441\u0442\u0435\u043c\u0430\u0445 \u0434\u0430\u0432\u043d\u043e \u0435\u0441\u0442\u044c TBI, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043f\u0440\u044f\u0442\u0430\u0442\u044c \u0431\u0438\u0442\u044b \u0432\u00a0\u0432\u0435\u0440\u0445\u043d\u0435\u043c \u0431\u0430\u0439\u0442\u0435 \u0430\u0434\u0440\u0435\u0441\u0430. \u041d\u0430\u00a0\u044d\u0442\u043e\u0439 \u0431\u0430\u0437\u0435 \u043f\u043e\u044f\u0432\u0438\u043b\u0441\u044f Memory Tagging Extension, \u043a\u043e\u0440\u043e\u0442\u043a\u043e MTE. \u042d\u0442\u043e \u0430\u043f\u043f\u0430\u0440\u0430\u0442\u043d\u0430\u044f \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u00a0\u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0441\u0432\u043e\u0439 \u0434\u043b\u044f\u00a0\u043a\u043e\u043d\u043a\u0440\u0435\u0442\u043d\u043e\u0433\u043e \u043a\u0443\u0441\u043a\u0430 \u043f\u0430\u043c\u044f\u0442\u0438. \u0427\u0430\u0441\u0442\u044c \u043c\u0435\u0445\u0430\u043d\u0438\u0437\u043c\u043e\u0432 \u0435\u0441\u0442\u044c \u0432\u00a0\u044f\u0434\u0440\u0435 Linux, \u0447\u0430\u0441\u0442\u044c \u0432\u00a0libc, \u0447\u0430\u0441\u0442\u044c \u0432\u00a0\u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430\u0445, \u0438 \u0438\u0437\u00a0\u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0436\u0451\u0441\u0442\u043a\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c, \u0441\u0442\u0440\u043e\u0433\u0443\u044e \u043a\u00a0\u0444\u0430\u043a\u0430\u043f\u0430\u043c \u0438 \u0442\u0435\u0440\u043f\u0438\u043c\u0443\u044e \u043a\u00a0\u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u2011\u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0435.<\/p>\n<p>MTE \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442 \u043a\u00a0\u043a\u0430\u0436\u0434\u043e\u0439 16-\u0431\u0430\u0439\u0442\u043d\u043e\u0439 \u0433\u0440\u0430\u043d\u0443\u043b\u0435 \u043f\u0430\u043c\u044f\u0442\u0438 4-\u0431\u0438\u0442\u043d\u044b\u0439 allocation tag. \u0410\u00a0\u0432\u00a0\u0432\u0435\u0440\u0445\u043d\u0438\u0435 \u0431\u0438\u0442\u044b \u0430\u0434\u0440\u0435\u0441\u0430 (59\u202656) \u0432\u044b \u0434\u043e\u0431\u0430\u0432\u043b\u044f\u0435\u0442\u0435 logical tag \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f. \u041f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u043d\u0430\u00a0\u043a\u0430\u0436\u0434\u043e\u043c \u0434\u043e\u0441\u0442\u0443\u043f\u0435 \u0441\u0440\u0430\u0432\u043d\u0438\u0432\u0430\u0435\u0442 \u0442\u0435\u0433 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044f \u0438 \u0442\u0435\u0433 \u043f\u0430\u043c\u044f\u0442\u0438. \u0415\u0441\u043b\u0438 \u043d\u0435\u00a0\u0441\u043e\u0432\u043f\u0430\u043b\u043e, \u043f\u0440\u0438\u043b\u0435\u0442\u0438\u0442 fault \u043f\u043e\u00a0\u0432\u044b\u0431\u0440\u0430\u043d\u043d\u043e\u043c\u0443 \u0440\u0435\u0436\u0438\u043c\u0443 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438. \u0413\u0440\u0430\u043d\u0443\u043b\u0430 \u0444\u0438\u043a\u0441\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f\u00a0\u2014 16\u00a0\u0431\u0430\u0439\u0442. \u0422\u0435\u0433\u043e\u0432 16. \u042d\u0442\u043e \u0437\u043d\u0430\u0447\u0438\u0442, \u0447\u0442\u043e\u00a0\u043f\u0440\u0438\u00a0\u0440\u0430\u043d\u0434\u043e\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0442\u0435\u0433\u043e\u0432 \u0442\u0435\u043e\u0440\u0435\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0448\u0430\u043d\u0441 \u043f\u0440\u043e\u043d\u0435\u0441\u0442\u0438 \u043b\u0435\u0432\u044b\u0439 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0431\u0435\u0437\u00a0\u043e\u0448\u0438\u0431\u043a\u0438\u00a0\u2014 1\u00a0\u0438\u0437 16, \u0435\u0441\u043b\u0438 \u0430\u0442\u0430\u043a\u0443\u044e\u0449\u0438\u0439 \u043d\u0435\u00a0\u0437\u043d\u0430\u0435\u0442 \u0442\u0435\u0433. \u042d\u0442\u043e\u0442 \u0448\u0430\u043d\u0441 \u043c\u043e\u0436\u043d\u043e \u0434\u0430\u0432\u0438\u0442\u044c \u043f\u0430\u0442\u0442\u0435\u0440\u043d\u0430\u043c\u0438 \u0442\u044d\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u043e\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u0430.<\/p>\n<p>\u0420\u0435\u0436\u0438\u043c\u044b \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u0442\u0440\u0438: sync, async \u0438 asymmetric. Sync\u00a0\u2014 \u0442\u043e\u0447\u043d\u044b\u0439 fault \u043d\u0430\u00a0\u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0438 \u0434\u043e\u0441\u0442\u0443\u043f\u0430. Async\u00a0\u2014 \u043e\u0442\u0447\u0451\u0442 \u043f\u043e\u0437\u0436\u0435, \u0430\u0434\u0440\u0435\u0441 \u043d\u0435\u0438\u0437\u0432\u0435\u0441\u0442\u0435\u043d, \u043d\u043e\u00a0\u043d\u0430\u043a\u043b\u0430\u0434\u043d\u044b\u0435 \u0440\u0430\u0441\u0445\u043e\u0434\u044b \u043c\u0435\u043d\u044c\u0448\u0435. Asymmetric\u00a0\u2014 \u0447\u0442\u0435\u043d\u0438\u044f \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e, \u0437\u0430\u043f\u0438\u0441\u0438 \u0430\u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u043e. <\/p>\n<h3>\u0412\u043a\u043b\u044e\u0447\u0430\u0435\u043c MTE \u0432 Linux user-space: \u0434\u0435\u0442\u0435\u043a\u0442, prctl, mmap, \u0441\u0438\u0433\u043d\u0430\u043b\u044b<\/h3>\n<p>\u0427\u0442\u043e\u0431\u044b \u0432\u043e\u043e\u0431\u0449\u0435 \u0438\u043c\u0435\u0442\u044c \u043f\u0440\u0430\u0432\u043e \u043d\u0430\u00a0\u0442\u0435\u0433\u0438, \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0443\u043c\u0435\u0442\u044c MTE, \u0430\u00a0\u044f\u0434\u0440\u043e \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0444\u0438\u0447\u0443 \u0432\u00a0user\u2011space \u0447\u0435\u0440\u0435\u0437 HWCAP2_MTE. \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0442\u0430\u043a \u0438 \u0441\u0440\u0430\u0437\u0443 \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0435\u043c \u0440\u0435\u0436\u0438\u043c\u044b:<\/p>\n<pre><code class=\"cs\">\/\/ build: clang -std=c11 -O2 -Wall -Wextra -target aarch64-linux-gnu -march=armv8.5-a+memtag mte_boot.c #define _GNU_SOURCE #include &lt;errno.h&gt; #include &lt;inttypes.h&gt; #include &lt;signal.h&gt; #include &lt;stdbool.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;sys\/auxv.h&gt; #include &lt;sys\/mman.h&gt; #include &lt;sys\/prctl.h&gt; #include &lt;unistd.h&gt;  #ifndef HWCAP2_MTE #define HWCAP2_MTE (1u &lt;&lt; 18) #endif  #ifndef PR_SET_TAGGED_ADDR_CTRL #define PR_SET_TAGGED_ADDR_CTRL 55 #define PR_GET_TAGGED_ADDR_CTRL 56 #define PR_TAGGED_ADDR_ENABLE   (1UL &lt;&lt; 0) #define PR_MTE_TCF_SHIFT        1 #define PR_MTE_TCF_NONE         (0UL &lt;&lt; PR_MTE_TCF_SHIFT) #define PR_MTE_TCF_SYNC         (1UL &lt;&lt; PR_MTE_TCF_SHIFT) #define PR_MTE_TCF_ASYNC        (2UL &lt;&lt; PR_MTE_TCF_SHIFT) #define PR_MTE_TCF_MASK         (3UL &lt;&lt; PR_MTE_TCF_SHIFT) #define PR_MTE_TAG_SHIFT        3 #endif  static void install_sigsegv_handler(void);  static void enable_mte_thread(void) {     unsigned long hwcap2 = getauxval(AT_HWCAP2);     if (!(hwcap2 &amp; HWCAP2_MTE)) {         fprintf(stderr, \"MTE not supported on this CPU\/kernel\\n\");         exit(2);     }     \/\/ \u0420\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u043c tagged pointers \u0432 ABI \u0438 \u0441\u0440\u0430\u0437\u0443 \u043f\u0440\u043e\u0441\u0438\u043c sync+async \u044f\u0434\u0440\u043e \u0432\u044b\u0431\u0435\u0440\u0435\u0442 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c CPU.     unsigned long tag_include_mask = 0xfffeUL &lt;&lt; PR_MTE_TAG_SHIFT; \/\/ \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u0435\u043c zero-tag \u0438\u0437 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u043e\u0439 \u0433\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u0438     unsigned long flags = PR_TAGGED_ADDR_ENABLE | PR_MTE_TCF_SYNC | PR_MTE_TCF_ASYNC | tag_include_mask;     if (prctl(PR_SET_TAGGED_ADDR_CTRL, flags, 0, 0, 0) != 0) {         perror(\"prctl(PR_SET_TAGGED_ADDR_CTRL)\");         exit(1);     }     install_sigsegv_handler(); }  static void segv_handler(int sig, siginfo_t* si, void* ctx) {     (void)ctx;     \/\/ si_code: SEGV_MTESERR \u0434\u043b\u044f sync, SEGV_MTEAERR \u0434\u043b\u044f async     fprintf(stderr, \"SIGSEGV: si_code=%d, addr=%p\\n\", si-&gt;si_code, si-&gt;si_addr);     _Exit(128 + SIGSEGV); }  static void install_sigsegv_handler(void) {     struct sigaction sa = {0};     sa.sa_flags = SA_SIGINFO;     sa.sa_sigaction = segv_handler;     sigemptyset(&amp;sa.sa_mask);     sigaction(SIGSEGV, &amp;sa, NULL); }  int main(void) {     enable_mte_thread();     \/\/ \u043a\u043e\u0434     return 0; }<\/code><\/pre>\n<p>\u041a\u043e\u043d\u0441\u0442\u0430\u043d\u0442\u044b PR_* \u0438 HWCAP2_MTE \u0437\u0430\u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u043e\u0432\u0430\u043d\u044b \u0432\u00a0\u043a\u0435\u0440\u043d\u0435\u043b\u2011\u0434\u043e\u043a\u0430\u0445. \u0420\u0435\u0436\u0438\u043c\u044b \u0438 \u043a\u043e\u0434\u044b si_code \u0434\u043b\u044f\u00a0SIGSEGV \u0442\u0430\u043a\u0438\u0435\u00a0\u0436\u0435, \u043a\u0430\u043a\u00a0\u0432\u00a0\u043f\u0440\u0438\u043c\u0435\u0440\u0435 \u044f\u0434\u0440\u0430. <\/p>\n<p>\u0422\u0435\u043f\u0435\u0440\u044c \u043d\u0443\u0436\u043d\u0430 \u043f\u0430\u043c\u044f\u0442\u044c \u0441\u00a0\u0430\u0442\u0440\u0438\u0431\u0443\u0442\u043e\u043c PROT_MTE. \u0415\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u0437\u0430\u0434\u0430\u0442\u044c \u0441\u0440\u0430\u0437\u0443 \u0432\u00a0mmap\u00a0\u043b\u0438\u0431\u043e \u043f\u043e\u0442\u043e\u043c \u0447\u0435\u0440\u0435\u0437 mprotect. PROT_MTE \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u0434\u043b\u044f\u00a0\u0430\u043d\u043e\u043d\u0438\u043c\u043d\u044b\u0445 \u0438 RAM\u2011\u0431\u044d\u043a\u0435\u043d\u0434\u043e\u0432 \u0432\u0440\u043e\u0434\u0435 tmpfs\/memfd. \u041d\u0430\u00a0\u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0445 \u043c\u0430\u043f\u043f\u0438\u043d\u0433\u0430\u0445 \u043e\u0431\u044b\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u043e\u0432 \u044f\u0434\u0440\u043e \u0432\u0435\u0440\u043d\u0451\u0442 EINVAL.<\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u044f \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b \u043f\u043e\u0434\u00a0\u0442\u0435\u0433\u0438:<\/p>\n<pre><code class=\"cs\">\/\/ build: clang -std=c11 -O2 -target aarch64-linux-gnu -march=armv8.5-a+memtag mte_map.c #include &lt;sys\/mman.h&gt; #include &lt;unistd.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt;  void* mte_map_page(void) {     size_t ps = (size_t)sysconf(_SC_PAGESIZE);     void* p = mmap(NULL, ps, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);     if (p == MAP_FAILED) { perror(\"mmap\"); exit(1); }     if (mprotect(p, ps, PROT_READ|PROT_WRITE|PROT_MTE) != 0) { perror(\"mprotect PROT_MTE\"); exit(1); }     return p; }  int main(void) {     void* p = mte_map_page();     printf(\"page: %p\\n\", p);     return 0; }<\/code><\/pre>\n<p>\u042f\u0434\u0440\u043e \u0442\u0430\u043a\u0436\u0435 \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0437\u0430\u0434\u0430\u0432\u0430\u0442\u044c \u043c\u0430\u0441\u043a\u0443 \u0440\u0430\u0437\u0440\u0435\u0448\u0451\u043d\u043d\u044b\u0445 \u0434\u043b\u044f\u00a0\u0440\u0430\u043d\u0434\u043e\u043c\u0430 \u0442\u0435\u0433\u043e\u0432 \u0447\u0435\u0440\u0435\u0437 PR_MTE_TAG_MASK. \u041e\u0431\u044b\u0447\u043d\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044e\u0442 0. <\/p>\n<h3>\u041f\u0440\u0438\u0441\u0432\u0430\u0438\u0432\u0430\u0435\u043c \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u0442\u0435\u0433\u0438: intrinsics \u0432\u043c\u0435\u0441\u0442\u043e inline asm<\/h3>\n<p>\u0422\u0435\u0433\u0438 \u043d\u0430\u0434\u043e \u043d\u0435\u00a0\u0442\u043e\u043b\u044c\u043a\u043e \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c, \u043d\u043e\u00a0\u0438 \u043f\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c. \u0415\u0441\u0442\u044c ACLE\u2011intrinsics \u0434\u043b\u044f\u00a0MTE, \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a <code>&lt;arm_acle.h&gt;<\/code>. \u0424\u0443\u043d\u043a\u0446\u0438\u0438:<\/p>\n<ul>\n<li>\n<p><code>__arm_mte_create_random_tag(ptr, mask)<\/code> \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442 \u0443\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c \u0441\u00a0\u0440\u0430\u043d\u0434\u043e\u043c\u043d\u044b\u043c logical tag, \u0438\u0441\u043a\u043b\u044e\u0447\u0430\u044f \u043c\u0430\u0441\u043a\u043e\u0439 \u0437\u0430\u043f\u0440\u0435\u0442\u043d\u044b\u0435.<\/p>\n<\/li>\n<li>\n<p><code>__arm_mte_set_tag(tagged_addr)<\/code> \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0435\u0442 allocation tag \u043f\u043e\u00a0\u0430\u0434\u0440\u0435\u0441\u0443 \u0433\u0440\u0430\u043d\u0443\u043b\u044b, \u043d\u0430\u00a0\u043a\u043e\u0442\u043e\u0440\u0443\u044e \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 tagged_addr.<\/p>\n<\/li>\n<li>\n<p><code>__arm_mops_memset_tag(tagged_addr, val, size)<\/code> \u0435\u0441\u043b\u0438 \u0435\u0441\u0442\u044c \u0435\u0449\u0451 \u0438 MOPS, \u043c\u043e\u0436\u043d\u043e \u0442\u0435\u0433\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0431\u043b\u043e\u043a\u0438 \u043f\u0430\u0447\u043a\u043e\u0439, \u043a\u0430\u043a\u00a0memset \u0441\u00a0\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u043e\u0439 \u0442\u0435\u0433\u043e\u0432.<\/p>\n<\/li>\n<\/ul>\n<p>\u0421\u043e\u0431\u0435\u0440\u0451\u043c \u0443\u0442\u0438\u043b\u0438\u0442\u0443 \u0442\u044d\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0438 \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u044e \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u0441\u00a0fault:<\/p>\n<pre><code class=\"cs\">\/\/ build: clang -std=c11 -O2 -target aarch64-linux-gnu -march=armv8.5-a+memtag mte_tag_demo.c #include &lt;arm_acle.h&gt; #include &lt;stddef.h&gt; #include &lt;stdint.h&gt; #include &lt;stdio.h&gt; #include &lt;sys\/mman.h&gt; #include &lt;unistd.h&gt;  static inline void* tag_range(void* base, size_t len, uint16_t exclude_mask) {     \/\/ \u0412\u044b\u0431\u0438\u0440\u0430\u0435\u043c \u043e\u0434\u0438\u043d \u0442\u0435\u0433 \u043d\u0430 \u043e\u0431\u044a\u0435\u043a\u0442 \u0438 \u0441\u0442\u0430\u0432\u0438\u043c \u0435\u0433\u043e \u043d\u0430 \u0432\u0441\u0435 \u0433\u0440\u0430\u043d\u0443\u043b\u044b     void* tagged = __arm_mte_create_random_tag(base, exclude_mask); #if defined(__ARM_FEATURE_MOPS) &amp;&amp; defined(__ARM_FEATURE_MEMORY_TAGGING)     size_t g = 16;     size_t n = (len + g - 1) \/ g * g;     __arm_mops_memset_tag(tagged, 0, n); #else     \/\/ Fallback \u2014 \u043f\u0440\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u043c \u0442\u0435\u0433 \u043d\u0430 \u043a\u0430\u0436\u0434\u0443\u044e \u0433\u0440\u0430\u043d\u0443\u043b\u0443     uintptr_t p = (uintptr_t)tagged;     uintptr_t start = p &amp; ~((uintptr_t)0xF);     uintptr_t end   = start + ((len + 15) &amp; ~((size_t)0xF));     for (uintptr_t a = start; a &lt; end; a += 16) {         __arm_mte_set_tag((void*)a);     } #endif     return tagged; }  int main(void) {     size_t ps = (size_t)sysconf(_SC_PAGESIZE);     void* raw = mmap(NULL, ps, PROT_READ|PROT_WRITE|PROT_MTE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);     if (raw == MAP_FAILED) return 1;      char* buf = (char*)tag_range(raw, 64, \/*exclude tag 0*\/ 0x1);     buf[0] = 0x42;          \/\/ \u043e\u043a \u2014 \u0430\u0434\u0440\u0435\u0441 \u0441 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u043c \u0442\u0435\u0433\u043e\u043c \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u0435\u0442 \u0441 \u0430\u043b\u043b\u043e\u043a-\u0442\u0435\u0433\u043e\u043c     printf(\"ok: %p\\n\", buf);     char* bad = (char*)((uintptr_t)buf &amp; ~((uintptr_t)0xFF &lt;&lt; 56)); \/\/ \u0443\u0431\u0438\u0440\u0430\u0435\u043c \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0439 \u0442\u0435\u0433     bad[0] = 1;             \/\/ \u0437\u0434\u0435\u0441\u044c \u043f\u0440\u0438\u043b\u0435\u0442\u0438\u0442 SIGSEGV \u0432 sync\/addr=bad, \u043b\u0438\u0431\u043e async \u0431\u0435\u0437 addr     return 0; }<\/code><\/pre>\n<p>\u0421\u0441\u0438\u0433\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u0442\u044c \u044f\u0434\u0440\u0430 \u0432\u00a0\u0440\u0430\u0437\u043d\u044b\u0445 \u0440\u0435\u0436\u0438\u043c\u0430\u0445 \u0432\u0435\u0434\u0451\u0442 \u0441\u0435\u0431\u044f \u043f\u043e\u2011\u0440\u0430\u0437\u043d\u043e\u043c\u0443. \u0412\u00a0sync \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u0435 SIGSEGV \u0441 <code>si_code = SEGV_MTESERR<\/code> \u0438 \u0432\u0430\u043b\u0438\u0434\u043d\u044b\u043c <code>.si_addr<\/code>. \u0412\u00a0async\u00a0\u2014 <code>SEGV_MTEAERR<\/code> \u0438 <code>.si_addr = 0<\/code>. <\/p>\n<h3>\u0413\u043e\u0442\u043e\u0432\u044b\u0435 \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u0438: glibc, \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440\u044b, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b, Android<\/h3>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043d\u0435\u00a0\u043f\u0438\u0448\u0435\u0442\u0435 \u0441\u0432\u043e\u0439 \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440, \u0430\u00a0\u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0435 glibc, \u0442\u043e \u0431\u0430\u0437\u043e\u0432\u0430\u044f \u0438\u043d\u0442\u0435\u0433\u0440\u0430\u0446\u0438\u044f \u0441\u00a0MTE \u0435\u0441\u0442\u044c \u0438\u0437\u00a0\u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0447\u0435\u0440\u0435\u0437 tunable. \u0414\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u0441\u00a0\u043f\u0435\u0440\u0435\u043c\u0435\u043d\u043d\u043e\u0439 \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f, \u0438 malloc \u043d\u0430\u0447\u043d\u0451\u0442 \u0432\u044b\u0434\u0430\u0432\u0430\u0442\u044c \u0442\u044d\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u043f\u0430\u043c\u044f\u0442\u044c, \u0430\u00a0\u0441\u0442\u0430\u0440\u0442\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 libc \u0432\u043a\u043b\u044e\u0447\u0438\u0442 \u043d\u0443\u0436\u043d\u044b\u0435 \u0440\u0435\u0436\u0438\u043c\u044b \u0432\u00a0\u044f\u0434\u0440\u0435.<\/p>\n<p>\u041a\u043b\u044e\u0447: <code>GLIBC_TUNABLES=glibc.mem.tagging=&lt;mask&gt;<\/code>, \u0433\u0434\u0435 \u0431\u0438\u0442 0\u00a0\u0432\u043a\u043b\u044e\u0447\u0430\u0435\u0442 \u0442\u044d\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0430\u043b\u043b\u043e\u043a\u0430\u0446\u0438\u0439, \u0431\u0438\u0442 1\u00a0\u2014 precise faulting, \u0431\u0438\u0442 2\u00a0\u2014 \u00ab\u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b\u00bb \u043c\u0435\u0436\u0434\u0443 sync\/async. \u0414\u0435\u0444\u043e\u043b\u0442\u043d\u043e\u0435 \u043f\u0440\u043e\u0434\u2011\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 5, \u0442\u043e \u0435\u0441\u0442\u044c \u0431\u0438\u0442\u044b 0\u00a0\u0438 2. <\/p>\n<p>\u041f\u0440\u0438\u043c\u0435\u0440 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0431\u0435\u0437\u00a0\u043f\u0435\u0440\u0435\u043f\u0438\u0441\u044b\u0432\u0430\u043d\u0438\u044f \u043a\u043e\u0434\u0430:<\/p>\n<pre><code class=\"cs\"># \u0432\u043a\u043b\u044e\u0447\u0430\u0435\u043c \u0442\u044d\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0432 malloc \u0438 \u0434\u0430\u0451\u043c \u0441\u0438\u0441\u0442\u0435\u043c\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u0441 \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u043e\u043c \u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0441\u0442\u0438 GLIBC_TUNABLES=glibc.mem.tagging=5 .\/your_binary<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0441\u0442\u0432\u0435\u043d\u043d\u044b\u0435 \u0431\u0440\u0430\u0443\u0437\u0435\u0440\u043d\u044b\u0435 \u0438 \u043c\u043e\u0431\u0438\u043b\u044c\u043d\u044b\u0435 \u0441\u0442\u0435\u043a\u0438 \u0442\u043e\u0436\u0435 \u0434\u0432\u0438\u0433\u0430\u044e\u0442\u0441\u044f \u0432\u00a0\u044d\u0442\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u0443. Chromium \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 MTE \u0447\u0435\u0440\u0435\u0437 PartitionAlloc \u0438 \u043c\u0435\u0442\u0438\u0442 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u044b\/\u0447\u0430\u043d\u043a\u0438, Android \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0438\u0440\u0443\u0435\u0442 \u0440\u0435\u0436\u0438\u043c\u044b \u0438 \u043f\u043e\u0437\u0438\u0446\u0438\u044e MTE \u0432\u00a0\u0441\u0442\u0435\u043ae \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438. \u0414\u043b\u044f\u00a0\u043f\u0440\u043e\u0434\u0430\u043a\u0448\u0435\u043d\u0430 \u0440\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u044e\u0442 asymmetric \u0438\u043b\u0438\u00a0async \u0441\u00a0\u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u043e\u0439 \u0446\u0435\u043d\u043e\u0439. \u041d\u0430\u00a0\u043d\u043e\u0432\u044b\u0445 Pixel \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 MTE \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e \u0432\u00a0dev\u2011\u0440\u0435\u0436\u0438\u043c\u0435 \u0447\u0435\u0440\u0435\u0437 Options, \u043d\u043e\u00a0\u044d\u0442\u043e \u043d\u0435\u00a0\u0440\u0435\u0436\u0438\u043c \u0434\u043b\u044f\u00a0\u043e\u0431\u044b\u0447\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.<\/p>\n<p>\u041a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u044b. \u0421\u0442\u043e\u0440\u043e\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432\u00a0\u2014 \u0434\u0432\u0430 \u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f:<\/p>\n<ul>\n<li>\n<p>HWAddressSanitizer \u0432\u00a0Clang. \u042d\u0442\u043e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442 \u043d\u0430\u00a0\u0431\u0430\u0437\u0435 top\u2011byte\u2011ignore \u0438 MTE. \u0412\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0441\u044f <code>-fsanitize=hwaddress<\/code>, \u043d\u0430\u00a0\u043c\u0430\u0448\u0438\u043d\u0430\u0445 \u0441\u00a0MTE \u043e\u043d \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u00a0\u0436\u0435\u043b\u0435\u0437\u043e. \u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044f LLVM \u0438 Android \u044d\u0442\u043e \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0430\u044e\u0442. <\/p>\n<\/li>\n<li>\n<p>MemTagSanitizer\/stack tagging. \u0415\u0441\u0442\u044c sanitizer \u00abmemtag\u00bb \u0438 \u043e\u043f\u0446\u0438\u0438 \u0434\u043b\u044f\u00a0\u0442\u044d\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0441\u0442\u0435\u043a\u0430. \u0412\u00a0LLVM \u0435\u0441\u0442\u044c \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0430 MemTagSanitizer, \u0432\u00a0GCC \u0440\u0430\u0437\u0432\u0438\u0432\u0430\u044e\u0442 <code>-fsanitize=memtag-stack<\/code>. <\/p>\n<\/li>\n<\/ul>\n<h2>\u0421\u0432\u043e\u0439 \u0436\u0451\u0441\u0442\u043a\u0438\u0439 malloc: \u0440\u0435\u0442\u044d\u0433 \u043d\u0430 free, \u043f\u0430\u0434\u0434\u0438\u043d\u0433\u0438 \u043f\u043e 16, \u043a\u0440\u0430\u0441\u043d\u044b\u0435 \u0437\u043e\u043d\u044b<\/h2>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u0438\u0440\u0443\u0435\u0442\u0435 \u0430\u043b\u043b\u043e\u043a\u0430\u0442\u043e\u0440 \u0438\u043b\u0438\u00a0\u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u0449\u0438\u0442\u0438\u0442\u044c \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043f\u0443\u043b \u0432\u0440\u0443\u0447\u043d\u0443\u044e, \u0442\u043e \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u0430\u044f \u0434\u0438\u0441\u0446\u0438\u043f\u043b\u0438\u043d\u0430 \u0442\u0430\u043a\u0430\u044f: \u043e\u0434\u0438\u043d \u0442\u0435\u0433 \u043d\u0430\u00a0\u043e\u0431\u044a\u0435\u043a\u0442 \u043f\u0440\u0438\u00a0alloc, \u0430\u0433\u0440\u0435\u0441\u0441\u0438\u0432\u043d\u044b\u0439 \u0440\u0435\u0442\u044d\u0433 \u043d\u0430\u00a0free, \u043f\u0430\u0434\u0434\u0438\u043d\u0433 \u0434\u043e 16\u00a0\u0431\u0430\u0439\u0442 \u0438 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043f\u043e\u0434\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u043d\u0430\u00a0\u0433\u0440\u0430\u043d\u0438\u0446\u0430\u0445 \u0433\u0440\u0430\u043d\u0443\u043b. \u041f\u0440\u0438\u043c\u0435\u0440 \u043f\u0440\u043e\u0441\u0442\u043e\u0433\u043e \u043e\u0431\u0451\u0440\u0442\u0447\u0438\u043a\u0430 \u0441\u00a0\u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0439 \u0440\u0435\u0442\u044d\u0433\u0433\u0430\u0446\u0438\u0435\u0439 \u0438 \u043a\u0440\u0430\u0441\u043d\u043e\u0439 \u0437\u043e\u043d\u043e\u0439:<\/p>\n<pre><code class=\"cs\">\/\/ build: clang -std=c11 -O2 -fno-omit-frame-pointer -target aarch64-linux-gnu -march=armv8.5-a+memtag tagged_alloc.c #include &lt;arm_acle.h&gt; #include &lt;stdalign.h&gt; #include &lt;stdatomic.h&gt; #include &lt;stdint.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;sys\/mman.h&gt; #include &lt;unistd.h&gt;  typedef struct {     size_t usable;     void*  raw;   \/\/ \u0430\u0434\u0440\u0435\u0441 \u0431\u0435\u0437 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e \u0442\u0435\u0433\u0430, \u0434\u043b\u044f munmap } header_t;  static inline size_t round_up16(size_t n) { return (n + 15) &amp; ~((size_t)15); }  \/\/ \u0412\u044b\u0434\u0435\u043b\u044f\u0435\u043c \u043f\u0430\u043c\u044f\u0442\u044c \u0447\u0435\u0440\u0435\u0437 mmap \u043f\u043e\u0434 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a+\u0434\u0430\u043d\u043d\u044b\u0435 \u0441 PROT_MTE static void* mte_alloc_raw(size_t bytes_with_hdr) {     size_t ps = (size_t)sysconf(_SC_PAGESIZE);     size_t total = ((bytes_with_hdr + ps - 1)\/ps)*ps;     void* raw = mmap(NULL, total, PROT_READ|PROT_WRITE|PROT_MTE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);     if (raw == MAP_FAILED) return NULL;     return raw; }  void* tagged_alloc(size_t n) {     size_t user = round_up16(n);     size_t pad  = 16; \/\/ \u043a\u0440\u0430\u0441\u043d\u0430\u044f \u0437\u043e\u043d\u0430 \u043f\u043e\u0441\u043b\u0435 \u043e\u0431\u044a\u0435\u043a\u0442\u0430     size_t need = sizeof(header_t) + user + pad;     void* raw = mte_alloc_raw(need);     if (!raw) return NULL;      \/\/ \u0417\u0430\u0433\u043e\u043b\u043e\u0432\u043e\u043a <\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-471707","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/471707","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=471707"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/471707\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=471707"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=471707"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=471707"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}