{"id":502410,"date":"2026-11-10T09:17:38","date_gmt":"2026-11-10T06:17:38","guid":{"rendered":"https:\/\/savepearlharbor.com\/?p=502410"},"modified":"2026-11-10T09:17:38","modified_gmt":"2026-11-10T06:17:38","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=502410","title":{"rendered":"\u0427\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 C++-\u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043f\u0440\u0438 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u043c return \u043f\u043e\u0441\u043b\u0435 \u0441\u0431\u043e\u0440\u043a\u0438 \u0441 -O2"},"content":{"rendered":"<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0420\u044d\u0439\u043c\u043e\u043d\u0434 \u0427\u0435\u043d \u0432 \u043e\u043a\u0442\u044f\u0431\u0440\u044c\u0441\u043a\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u043b, \u0437\u0430\u0447\u0435\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0442\u0430\u0432\u0438\u0442 \u0432 \u043a\u043e\u0434 <code>ud2<\/code>: \u0442\u0430\u043a \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u043e, \u043a\u0443\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0434\u043e\u0439\u0442\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0435\u0446 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u043e \u0433\u0434\u0435 \u0437\u0430\u0431\u044b\u043b\u0438 <code>return<\/code>. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0443\u043f\u0430\u043b\u0430 \u043d\u0430 <code>ud2<\/code> \u2014 \u0438\u0449\u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443. \u0427\u0435\u043d \u043f\u0438\u0448\u0435\u0442 \u043f\u0440\u043e MSVC. \u041c\u043d\u0435 \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435: \u0435\u0441\u043b\u0438 \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u043d\u0430 <code>ud2<\/code> \u043d\u0435\u0442, \u0437\u043d\u0430\u0447\u0438\u0442 \u043b\u0438 \u044d\u0442\u043e, \u0447\u0442\u043e \u0437\u0430\u0431\u044b\u0442\u043e\u0433\u043e <code>return<\/code> \u0442\u043e\u0436\u0435 \u043d\u0435\u0442? \u042f \u043f\u0440\u043e\u0433\u043d\u0430\u043b \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 C+\u00b1\u043a\u043e\u0434 \u0447\u0435\u0440\u0435\u0437 114 \u0432\u0435\u0440\u0441\u0438\u0439 GCC \u0438 Clang \u0434\u043b\u044f x86-64 \u043d\u0430 Compiler Explorer \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u0411\u0435\u0437 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 <code>ud2<\/code> \u0435\u0441\u0442\u044c \u0443 Clang \u0438 \u0443 \u0441\u0432\u0435\u0436\u0438\u0445 GCC. \u041d\u0430 <code>-O2<\/code> \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u043c <code>return<\/code> \u0443 \u0432\u0441\u0435\u0445 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u0432 \u0434\u0435\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u043b\u0430 \u0432\u0435\u0442\u043a\u0443, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u0441 \u043a\u043e\u0434\u043e\u043c 0, \u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0433\u043e <code>return<\/code> Clang 23.1 \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043f\u0443\u0441\u0442\u043e\u0439, \u0438 \u0432 \u0434\u0435\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0430\u0441\u044c \u0441\u043e\u0441\u0435\u0434\u043d\u044f\u044f <code>wipe_disk()<\/code>. \u0423\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443 \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0435\u0442.<\/p>\n<h3>\u0427\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b<\/h3>\n<p>\u0414\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 C++, \u043e\u0431\u0435 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439:<\/p>\n<pre><code class=\"cpp\">extern \"C\" int f_noret(int x) { if (x &gt; 0) return side(x); }   \/\/ \u043d\u0435\u0442 return \u0434\u043b\u044f x &lt;= 0extern \"C\" int f_empty(int x) { (void)x; }                      \/\/ \u043d\u0435\u0442 return \u0432\u043e\u043e\u0431\u0449\u0435<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper\"><\/span><\/a><\/div><\/pre>\n<p>\u041f\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443 C++ ([stmt.return]) \u0432\u044b\u0445\u043e\u0434 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u0442\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2014 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u0434\u0430, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0447\u0438\u0442\u0430\u0435\u0442. \u0412 C \u0438\u043d\u0430\u0447\u0435: \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 Clang \u0441\u0442\u0430\u0432\u0438\u0442 \u043b\u043e\u0432\u0443\u0448\u043a\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 C++, \u044d\u0442\u043e \u0432\u0438\u0434\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0432 \u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0435, \u0432 <code>CodeGenFunction.cpp<\/code>. \u0412 C \u0432 \u043f\u0440\u043e\u0431\u0435 \u043d\u0430 16 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u043e\u0431\u043e\u0438\u0445 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u044f \u043b\u043e\u0432\u0443\u0448\u0435\u043a \u043d\u0435 \u043d\u0430\u0448\u0451\u043b \u043d\u0438 \u043d\u0430 <code>-O0<\/code>, \u043d\u0438 \u043d\u0430 <code>-O2<\/code>, \u0442\u0430\u043a \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0440\u0435\u0447\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e C++.<\/p>\n<p>\u0412 2020 \u0433\u043e\u0434\u0443 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0443\u0436\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b\u0438 \u0437\u0430\u0431\u044b\u0442\u044b\u0439 <code>return<\/code> \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u00ab\u0418\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f\u00bb: \u0442\u0430\u043c Clang 10 \u043d\u0430 <code>-O0<\/code> \u043f\u0430\u0434\u0430\u043b \u043d\u0430 <code>ud2<\/code>, \u0430 \u043d\u0430 <code>-O1<\/code> \u0438 \u0432\u044b\u0448\u0435 \u0438 \u043e\u043d, \u0438 GCC 9.3 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b\u0438 \u0432\u044b\u0437\u043e\u0432 \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u0422\u0430\u043c \u0431\u044b\u043b\u0430 \u043e\u0434\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438 \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b\u0438\u0441\u044c \u0444\u043b\u0430\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043f\u0430\u0434\u0435\u043d\u0438\u0435. \u041c\u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u043f\u043e \u0432\u0441\u0435\u043c \u0432\u0435\u0440\u0441\u0438\u044f\u043c.<\/p>\n<p>\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0443\u0448\u043b\u0438 \u0432 API Compiler Explorer \u043d\u0430 \u0432\u0441\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 x86-64: GCC 4.5.3\u201316.2 (69 \u0448\u0442\u0443\u043a) \u0438 Clang 3.0\u201323.1 (45). \u0415\u0449\u0451 \u0447\u0435\u0442\u044b\u0440\u0435 GCC, \u043e\u0442 3.4.6 \u0434\u043e 4.4.7, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u043d\u0435 \u0441\u043e\u0431\u0440\u0430\u043b\u0438: \u0432 \u043d\u0451\u043c \u0435\u0441\u0442\u044c <code>__builtin_unreachable<\/code>, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043d\u0438 \u043d\u0435 \u0437\u043d\u0430\u044e\u0442. \u0412 \u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u043e\u043d\u0438 \u043d\u0435 \u0432\u043e\u0448\u043b\u0438. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u044f \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440: \u0435\u0441\u0442\u044c \u043b\u0438 <code>ud2<\/code>, \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 <code>x &gt; 0<\/code>, \u0435\u0441\u0442\u044c \u043b\u0438 \u0432 \u0442\u0435\u043b\u0435 \u0445\u043e\u0442\u044c \u043e\u0434\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f.<\/p>\n<h3>\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e \u0432\u0435\u0440\u0441\u0438\u044f\u043c<\/h3>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0427\u0442\u043e \u0432 \u043a\u043e\u0434\u0435<\/p>\n<\/th>\n<th>\n<p align=\"left\"><code>-O0<\/code><\/p>\n<\/th>\n<th>\n<p align=\"left\"><code>-O2<\/code><\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>f_noret<\/code>, GCC 4.5\u20137.5<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>ret<\/code>, \u0432 eax \u043c\u0443\u0441\u043e\u0440<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>ret<\/code>, \u0432 eax \u043c\u0443\u0441\u043e\u0440<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>f_noret<\/code>, GCC 8.1\u201312.5<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>ret<\/code>, \u0432 eax \u043c\u0443\u0441\u043e\u0440<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435\u0442, \u043e\u0434\u0438\u043d <code>jmp side<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>f_noret<\/code>, GCC 13.1\u201316.2<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>ud2<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435\u0442, \u043e\u0434\u0438\u043d <code>jmp side<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>f_noret<\/code>, Clang 3.2\u201323.1<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>ud2<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435\u0442, \u043e\u0434\u0438\u043d <code>jmp side<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>f_empty<\/code>, GCC 4.5\u20137.5<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2014<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>ret<\/code>, \u0432 eax \u043c\u0443\u0441\u043e\u0440<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>f_empty<\/code>, GCC 8.1\u201315.3<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2014<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0443\u0441\u0442\u043e\u0435 \u0442\u0435\u043b\u043e, \u043d\u043e\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>f_empty<\/code>, GCC 16.1\u201316.2<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2014<\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>ud2<\/code><\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\"><code>f_empty<\/code>, Clang 3.2\u201323.1<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u2014<\/p>\n<\/td>\n<td>\n<p align=\"left\">\u043f\u0443\u0441\u0442\u043e\u0435 \u0442\u0435\u043b\u043e, \u043d\u043e\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Clang 3.0 \u0438 3.1 \u0432\u0435\u0434\u0443\u0442 \u0441\u0435\u0431\u044f \u043a\u0430\u043a \u0441\u0442\u0430\u0440\u044b\u0439 GCC: <code>ret<\/code> \u0438 \u043c\u0443\u0441\u043e\u0440 \u043d\u0430 \u043e\u0431\u043e\u0438\u0445 \u0443\u0440\u043e\u0432\u043d\u044f\u0445.<\/p>\n<p><code>jmp side<\/code> \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0438 <code>x &lt;= 0<\/code> \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 <code>side(x)<\/code>, \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0435\u0442\u043a\u0443, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u0434\u043b\u044f \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u044d\u0442\u043e \u0437\u0430\u043a\u043e\u043d\u043d\u043e: \u043f\u0443\u0442\u044c \u0431\u0435\u0437 <code>return<\/code> \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f, \u0437\u043d\u0430\u0447\u0438\u0442, \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0441\u0442\u0438\u043d\u043d\u043e \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0435\u0433\u043e \u043d\u0435\u0437\u0430\u0447\u0435\u043c.<\/p>\n<p>\u041f\u0443\u0441\u0442\u043e\u0435 \u0442\u0435\u043b\u043e \u043e\u043f\u0430\u0441\u043d\u0435\u0435. \u041c\u0435\u0442\u043a\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0435\u0441\u0442\u044c, \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0437\u0430 \u043d\u0435\u0439 \u043d\u0435\u0442, \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440, \u043f\u043e\u043f\u0430\u0432 \u043d\u0430 \u043d\u0435\u0451, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442 \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043b\u0438\u043d\u043a\u0435\u0440 \u043f\u043e\u043b\u043e\u0436\u0438\u043b \u0441\u043b\u0435\u0434\u043e\u043c.<\/p>\n<h3>\u0427\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435<\/h3>\n<p>\u0410\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440 \u2014 \u044d\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0441\u043e\u0431\u0440\u0430\u043b \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0435 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 <code>f_empty<\/code> \u043b\u0435\u0436\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441 \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u043c \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u043c:<\/p>\n<pre><code class=\"cpp\">extern \"C\" __attribute__((noinline)) int side(int x) { std::printf(\"side(%d) \", x); return x; }extern \"C\" __attribute__((noinline)) int f_noret(int x) { if (x &gt; 0) return side(x); }extern \"C\" __attribute__((noinline)) int f_empty(int x) { (void)x; }extern \"C\" __attribute__((noinline, used)) int wipe_disk(int x) { std::printf(\"WIPE_DISK(%d)! \", x); return 7; }int main(int argc, char** argv) {    int (*volatile fp)(int) = argv[1][0] == 'n' ? f_noret : f_empty;    int r = fp(std::atoi(argv[2]));    std::printf(\"returned %d\\n\", r);    return 0;}<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c <code>volatile<\/code>, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u043c\u043e\u0433 \u043d\u0438\u0447\u0435\u0433\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0438\u0437 \u043c\u0435\u0441\u0442\u0430 \u0432\u044b\u0437\u043e\u0432\u0430. GCC 15.3 \u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0432 \u043e\u0431\u0440\u0430\u0437\u0435 <code>gcc:15<\/code>, GCC 16.2, Clang 23.1 \u0438 Clang 19.1 \u0447\u0435\u0440\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 Compiler Explorer.<\/p>\n<pre><code>                    .\/demo n -1                 .\/demo e -1GCC 15.3  -O0       SIGILL                      SIGILLGCC 16.2  -O0       SIGILL                      SIGILLClang 23.1 -O0      SIGILL                      SIGILLGCC 15.3  -O2       side(-1) returned -1, rc=0  SIGSEGVGCC 16.2  -O2       side(-1) returned -1, rc=0  SIGILLClang 23.1 -O2      side(-1) returned -1, rc=0  WIPE_DISK(-1)! returned 7, rc=0Clang 19.1 -O2      side(-1) returned -1, rc=0  WIPE_DISK(-1)! returned 7, rc=0<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0411\u0435\u0437 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0441\u0435 \u0442\u0440\u043e\u0435 \u043f\u0430\u0434\u0430\u044e\u0442 \u0441\u0440\u0430\u0437\u0443, \u043a\u0430\u043a \u0432 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0438 \u0427\u0435\u043d\u0430. \u0421 <code>-O2<\/code> \u0441\u043b\u0443\u0447\u0430\u0439 <code>n -1<\/code> \u0443 \u0432\u0441\u0435\u0445 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0448\u0442\u0430\u0442\u043d\u043e: \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0430 \u0432\u0435\u0442\u043a\u0443 \u0434\u043b\u044f \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 <code>x<\/code> \u0438 \u0432\u0435\u0440\u043d\u0443\u043b\u0430 \u043a\u043e\u0434 0. \u0422\u0435\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0434 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f, \u044d\u0442\u0443 \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442.<\/p>\n<p>Clang \u043d\u0430 <code>e -1<\/code> \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u043b <code>wipe_disk()<\/code>, \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u043b, \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0442\u043e\u0436\u0435 \u0448\u0442\u0430\u0442\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c. \u0412 \u044d\u0442\u043e\u043c \u0434\u0435\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0430\u0441\u044c \u0441\u043e\u0441\u0435\u0434\u043d\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f; \u0447\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043b\u0438\u043d\u043a\u0435\u0440 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043b \u043a\u043e\u0434.<\/p>\n<h3>\u041e\u0442\u043a\u0443\u0434\u0430 \u0432\u0437\u044f\u043b\u0441\u044f SIGSEGV<\/h3>\n<p>\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u043a\u0430\u043a \u0437\u0430\u0449\u0438\u0442\u0430. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043d\u0435\u0442. GCC 15.3 \u043d\u0430 <code>-O2<\/code> \u043a\u043b\u0430\u0434\u0451\u0442 \u043f\u0443\u0441\u0442\u0443\u044e <code>f_empty<\/code> \u0432 \u0441\u0435\u043a\u0446\u0438\u044e <code>.text.unlikely<\/code> \u0441 \u043d\u0443\u043b\u0435\u0432\u044b\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c, \u0430 <code>main<\/code> \u0432 <code>.text.startup<\/code>. \u041b\u0438\u043d\u043a\u0435\u0440 \u0441\u0442\u0430\u0432\u0438\u0442 \u044d\u0442\u0438 \u0441\u0435\u043a\u0446\u0438\u0438 \u043f\u043e\u0434\u0440\u044f\u0434, \u0438 \u0432 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0435 \u0443 <code>f_empty<\/code> \u0438 <code>main<\/code> \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0430\u0434\u0440\u0435\u0441:<\/p>\n<pre><code>0000000000401050 T f_empty0000000000401050 T main<\/code><div class=\"code-explainer\"><a href=\"https:\/\/sourcecraft.dev\/\" class=\"tm-button code-explainer__link\" style=\"visibility: hidden;\"><span class=\"sc-logo-wrapper icon-only\"><\/span><\/a><\/div><\/pre>\n<p>\u0412\u044b\u0437\u043e\u0432 <code>f_empty(-1)<\/code> \u043d\u0430 \u0434\u0435\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 <code>main<\/code> \u0437\u0430\u043d\u043e\u0432\u043e, \u0441 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c <code>-1<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>argc<\/code> \u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 <code>rsi<\/code> \u0432\u043c\u0435\u0441\u0442\u043e <code>argv<\/code>. \u041f\u043e \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0443 \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 <code>main<\/code>, \u2014 \u0447\u0438\u0442\u0430\u0435\u0442 <code>argv[1]<\/code> \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 \u0438\u0437 <code>rsi<\/code>. \u0422\u043e\u0447\u043d\u0443\u044e \u0441\u0431\u043e\u0439\u043d\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u044f \u043d\u0435 \u0441\u043d\u0438\u043c\u0430\u043b, \u043d\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u043d\u0435\u0442. \u0427\u0443\u0436\u043e\u0439 \u043a\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f \u0438 \u0437\u0434\u0435\u0441\u044c, \u0430 \u0443\u043f\u0430\u043b\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0441\u043e\u0441\u0435\u0434\u043e\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c <code>main<\/code>, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0440\u0430\u0437\u0443 \u043b\u0435\u0437\u0435\u0442 \u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b. \u041e\u043a\u0430\u0436\u0438\u0441\u044c \u0441\u043e\u0441\u0435\u0434\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043d\u0435 \u043d\u0443\u0436\u043d\u044b, \u043e\u043d\u0430 \u0431\u044b, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430, \u043a\u0430\u043a <code>wipe_disk()<\/code> \u0443 Clang, \u043d\u043e \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u044f \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b.<\/p>\n<h3>\u0424\u043b\u0430\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u043e\u0432\u044f\u0442 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 return \u043d\u0430 -O2<\/h3>\n<p>\u041b\u043e\u0432\u0443\u0448\u043a\u0443 \u043d\u0430 <code>-O2<\/code> \u043c\u043e\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c, \u043d\u043e \u043d\u0435 \u043b\u044e\u0431\u044b\u043c \u0444\u043b\u0430\u0433\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 \u044d\u0442\u043e \u043f\u043e\u0445\u043e\u0436.<\/p>\n<div>\n<div class=\"table\">\n<table>\n<tbody>\n<tr>\n<th>\n<p align=\"left\">\u0424\u043b\u0430\u0433<\/p>\n<\/th>\n<th>\n<p align=\"left\"><code>n -1<\/code><\/p>\n<\/th>\n<th>\n<p align=\"left\"><code>e -1<\/code><\/p>\n<\/th>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GCC 13+: <code>-funreachable-traps<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">SIGILL<\/p>\n<\/td>\n<td>\n<p align=\"left\">SIGILL<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">GCC: <code>-fsanitize=return -fsanitize-undefined-trap-on-error<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">SIGILL<\/p>\n<\/td>\n<td>\n<p align=\"left\">SIGILL<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Clang: <code>-fsanitize=return -fsanitize-trap=return<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\">SIGILL<\/p>\n<\/td>\n<td>\n<p align=\"left\">SIGILL<\/p>\n<\/td>\n<\/tr>\n<tr>\n<td>\n<p align=\"left\">Clang: <code>-mllvm -trap-unreachable<\/code><\/p>\n<\/td>\n<td>\n<p align=\"left\"><code>side(-1)<\/code>, rc=0<\/p>\n<\/td>\n<td>\n<p align=\"left\">SIGILL<\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u0421 <code>-mllvm -trap-unreachable<\/code> Clang \u0441\u0442\u0430\u0432\u0438\u0442 <code>ud2<\/code> \u0432 \u043f\u0443\u0441\u0442\u043e\u0435 \u0442\u0435\u043b\u043e, \u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 <code>x &gt; 0<\/code> \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u043d\u044c\u0448\u0435, \u0438 \u043b\u043e\u0432\u0438\u0442\u044c \u0443\u0436\u0435 \u043d\u0435\u0447\u0435\u0433\u043e.<\/p>\n<p>\u041b\u043e\u0432\u0443\u0448\u043a\u0430 GCC \u043d\u0430 <code>-O0<\/code> \u2014 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c <code>-funreachable-traps<\/code>, \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e: \u0441 <code>-fno-unreachable-traps<\/code> GCC 13\u201316 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a <code>ret<\/code> \u0441 \u043c\u0443\u0441\u043e\u0440\u043e\u043c. \u0412 GCC 12.5 \u0442\u0430\u043a\u043e\u0439 \u043e\u043f\u0446\u0438\u0438 \u043d\u0435\u0442, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0435\u0451 \u043d\u0435 \u0443\u0437\u043d\u0430\u0451\u0442. \u041e\u0442\u0441\u044e\u0434\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 12 \u0438 13 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435. \u0423 Clang \u043b\u043e\u0432\u0443\u0448\u043a\u0443 \u043d\u0430 <code>-O0<\/code> \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 <code>-fno-strict-return<\/code>, \u0442\u043e\u0433\u0434\u0430 \u0438 \u0442\u0430\u043c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f <code>ret<\/code> \u0441 \u043c\u0443\u0441\u043e\u0440\u043e\u043c.<\/p>\n<h3>\u0427\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442<\/h3>\n<p>\u0421\u043e\u0432\u0435\u0442 \u0427\u0435\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u0443: \u0443\u043f\u0430\u043b\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430 <code>ud2<\/code> \u2014 \u043e\u0448\u0438\u0431\u043a\u0430 \u0435\u0441\u0442\u044c. \u041e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u043d\u0435\u0432\u0435\u0440\u043d\u043e. \u041d\u0430 <code>-O2<\/code> \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441 \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c \u043b\u043e\u0432\u0443\u0448\u043a\u0438 \u043d\u0435\u0442 \u043d\u0438 \u0443 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 114 \u0432\u0435\u0440\u0441\u0438\u0439: \u0441\u0442\u0430\u0440\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043c\u0443\u0441\u043e\u0440, \u0430 GCC \u0441 8.1 \u0438 Clang \u0441 3.2 \u0443\u0434\u0430\u043b\u044f\u044e\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u0438 \u0432 \u0434\u0435\u043c\u043e \u0432\u0441\u0435 \u0447\u0435\u0442\u044b\u0440\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u043b\u0438 \u043d\u0435 \u0442\u0443 \u0432\u0435\u0442\u043a\u0443 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438\u0441\u044c \u0441 \u043a\u043e\u0434\u043e\u043c 0. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0433\u043e <code>return<\/code> \u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0432\u0435\u0440\u0441\u0438\u0439 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0431\u0435\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0439 \u043a\u043e\u0434. \u041b\u043e\u0432\u0443\u0448\u043a\u0443 \u043d\u0430 <code>-O2<\/code> \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e GCC 16, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0433\u043e <code>return<\/code>.<\/p>\n<p>\u0414\u0435\u0448\u0435\u0432\u043b\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0435 \u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f: <code>-Werror=return-type<\/code>. \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0438\u043b\u0438 \u043a\u043e\u0434 \u0447\u0443\u0436\u043e\u0439, \u0432 \u0441\u0431\u043e\u0440\u043a\u0443 \u0441 <code>-O2<\/code> \u0441\u0442\u043e\u0438\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c <code>-funreachable-traps<\/code> \u0434\u043b\u044f GCC 13+ \u0438\u043b\u0438 <code>-fsanitize=return -fsanitize-trap=return<\/code> \u0434\u043b\u044f Clang. \u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u0434\u043e\u0439\u0434\u044f \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0442\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u0441 SIGILL.<\/p>\n<p>\u041e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435: GCC 4.5.3\u201316.2 \u0438 Clang 3.0\u201323.1 \u043d\u0430 Compiler Explorer (API \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043d\u043e\u044f\u0431\u0440\u044c 2026), \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e <code>gcc:15<\/code> (GCC 15.3.0), x86-64, Linux. MSVC \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b: \u043a \u043d\u0435\u043c\u0443 \u0442\u0435\u0437\u0438\u0441 \u0427\u0435\u043d\u0430, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0446\u0435\u043b\u0438\u043a\u043e\u043c.<\/p>\n<\/div>\n<p>\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\/1105760\/\">https:\/\/habr.com\/ru\/articles\/1105760\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u0420\u044d\u0439\u043c\u043e\u043d\u0434 \u0427\u0435\u043d \u0432 \u043e\u043a\u0442\u044f\u0431\u0440\u044c\u0441\u043a\u043e\u043c \u043f\u043e\u0441\u0442\u0435 \u043e\u0431\u044a\u044f\u0441\u043d\u0438\u043b, \u0437\u0430\u0447\u0435\u043c \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0441\u0442\u0430\u0432\u0438\u0442 \u0432 \u043a\u043e\u0434 ud2: \u0442\u0430\u043a \u043f\u043e\u043c\u0435\u0447\u0430\u0435\u0442\u0441\u044f \u043c\u0435\u0441\u0442\u043e, \u043a\u0443\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0435 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u0434\u043e\u0439\u0442\u0438, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440 \u043a\u043e\u043d\u0435\u0446 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0434\u043e\u043b\u0436\u043d\u0430 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435, \u043d\u043e \u0433\u0434\u0435 \u0437\u0430\u0431\u044b\u043b\u0438 return. \u041f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0443\u043f\u0430\u043b\u0430 \u043d\u0430 ud2 \u2014 \u0438\u0449\u0438 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443. \u0427\u0435\u043d \u043f\u0438\u0448\u0435\u0442 \u043f\u0440\u043e MSVC. \u041c\u043d\u0435 \u0441\u0442\u0430\u043b\u043e \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0435: \u0435\u0441\u043b\u0438 \u043f\u0430\u0434\u0435\u043d\u0438\u044f \u043d\u0430 ud2 \u043d\u0435\u0442, \u0437\u043d\u0430\u0447\u0438\u0442 \u043b\u0438 \u044d\u0442\u043e, \u0447\u0442\u043e \u0437\u0430\u0431\u044b\u0442\u043e\u0433\u043e return \u0442\u043e\u0436\u0435 \u043d\u0435\u0442? \u042f \u043f\u0440\u043e\u0433\u043d\u0430\u043b \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 C+\u00b1\u043a\u043e\u0434 \u0447\u0435\u0440\u0435\u0437 114 \u0432\u0435\u0440\u0441\u0438\u0439 GCC \u0438 Clang \u0434\u043b\u044f x86-64 \u043d\u0430 Compiler Explorer \u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043b \u0434\u0435\u043c\u043e\u043d\u0441\u0442\u0440\u0430\u0446\u0438\u043e\u043d\u043d\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u0411\u0435\u0437 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 ud2 \u0435\u0441\u0442\u044c \u0443 Clang \u0438 \u0443 \u0441\u0432\u0435\u0436\u0438\u0445 GCC. \u041d\u0430 -O2 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0441 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u043c return \u0443 \u0432\u0441\u0435\u0445 \u0447\u0435\u0442\u044b\u0440\u0451\u0445 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u0432 \u0434\u0435\u043c\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u043b\u0430 \u0432\u0435\u0442\u043a\u0443, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0432\u0445\u043e\u0434\u043d\u044b\u0445 \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c \u0441 \u043a\u043e\u0434\u043e\u043c 0, \u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0433\u043e return Clang 23.1 \u043e\u0441\u0442\u0430\u0432\u0438\u043b \u043f\u0443\u0441\u0442\u043e\u0439, \u0438 \u0432 \u0434\u0435\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0430\u0441\u044c \u0441\u043e\u0441\u0435\u0434\u043d\u044f\u044f wipe_disk(). \u0423\u0441\u043f\u0435\u0448\u043d\u043e\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u0435 \u0442\u0430\u043a\u0443\u044e \u043e\u0448\u0438\u0431\u043a\u0443 \u043d\u0435 \u043e\u0431\u043d\u0430\u0440\u0443\u0436\u0438\u0432\u0430\u0435\u0442.\u0427\u0442\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b\u0414\u0432\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043d\u0430 C++, \u043e\u0431\u0435 \u0441 \u043e\u0448\u0438\u0431\u043a\u043e\u0439:extern &#171;C&#187; int f_noret(int x) { if (x &gt; 0) return side(x); }   \/\/ \u043d\u0435\u0442 return \u0434\u043b\u044f x &lt;= 0extern &#171;C&#187; int f_empty(int x) { (void)x; }                      \/\/ \u043d\u0435\u0442 return \u0432\u043e\u043e\u0431\u0449\u0435\u041f\u043e \u0441\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u0443 C++ ([stmt.return]) \u0432\u044b\u0445\u043e\u0434 \u0437\u0430 \u043a\u043e\u043d\u0435\u0446 \u0442\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u2014 \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432\u0441\u0435\u0433\u0434\u0430, \u0434\u0430\u0436\u0435 \u0435\u0441\u043b\u0438 \u0440\u0435\u0437\u0443\u043b\u044c\u0442\u0430\u0442 \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0447\u0438\u0442\u0430\u0435\u0442. \u0412 C \u0438\u043d\u0430\u0447\u0435: \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u043d\u0435 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e, \u0442\u043e\u043b\u044c\u043a\u043e \u0435\u0441\u043b\u0438 \u0432\u044b\u0437\u044b\u0432\u0430\u044e\u0449\u0438\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 Clang \u0441\u0442\u0430\u0432\u0438\u0442 \u043b\u043e\u0432\u0443\u0448\u043a\u0443 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 C++, \u044d\u0442\u043e \u0432\u0438\u0434\u043d\u043e \u043f\u0440\u044f\u043c\u043e \u0432 \u0435\u0433\u043e \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0435, \u0432 CodeGenFunction.cpp. \u0412 C \u0432 \u043f\u0440\u043e\u0431\u0435 \u043d\u0430 16 \u0432\u0435\u0440\u0441\u0438\u044f\u0445 \u043e\u0431\u043e\u0438\u0445 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u043e\u0432 \u044f \u043b\u043e\u0432\u0443\u0448\u0435\u043a \u043d\u0435 \u043d\u0430\u0448\u0451\u043b \u043d\u0438 \u043d\u0430 -O0, \u043d\u0438 \u043d\u0430 -O2, \u0442\u0430\u043a \u0447\u0442\u043e \u0434\u0430\u043b\u044c\u0448\u0435 \u0440\u0435\u0447\u044c \u0442\u043e\u043b\u044c\u043a\u043e \u043e C++.\u0412 2020 \u0433\u043e\u0434\u0443 \u043d\u0430 \u0425\u0430\u0431\u0440\u0435 \u0443\u0436\u0435 \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b\u0438 \u0437\u0430\u0431\u044b\u0442\u044b\u0439 return \u0432 \u0441\u0442\u0430\u0442\u044c\u0435 \u00ab\u0418\u0441\u0441\u043b\u0435\u0434\u043e\u0432\u0430\u043d\u0438\u0435 \u043e\u0434\u043d\u043e\u0433\u043e \u043d\u0435\u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0451\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u044f\u00bb: \u0442\u0430\u043c Clang 10 \u043d\u0430 -O0 \u043f\u0430\u0434\u0430\u043b \u043d\u0430 ud2, \u0430 \u043d\u0430 -O1 \u0438 \u0432\u044b\u0448\u0435 \u0438 \u043e\u043d, \u0438 GCC 9.3 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u043b\u0438 \u0432\u044b\u0437\u043e\u0432 \u0446\u0435\u043b\u0438\u043a\u043e\u043c. \u0422\u0430\u043c \u0431\u044b\u043b\u0430 \u043e\u0434\u043d\u0430 \u0432\u0435\u0440\u0441\u0438\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438 \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b\u0438\u0441\u044c \u0444\u043b\u0430\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043f\u0430\u0434\u0435\u043d\u0438\u0435. \u041c\u043d\u0435 \u043d\u0443\u0436\u043d\u0430 \u0431\u044b\u043b\u0430 \u043a\u0430\u0440\u0442\u0438\u043d\u0430 \u043f\u043e \u0432\u0441\u0435\u043c \u0432\u0435\u0440\u0441\u0438\u044f\u043c.\u0418\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0438 \u0443\u0448\u043b\u0438 \u0432 API Compiler Explorer \u043d\u0430 \u0432\u0441\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 x86-64: GCC 4.5.3\u201316.2 (69 \u0448\u0442\u0443\u043a) \u0438 Clang 3.0\u201323.1 (45). \u0415\u0449\u0451 \u0447\u0435\u0442\u044b\u0440\u0435 GCC, \u043e\u0442 3.4.6 \u0434\u043e 4.4.7, \u0442\u0435\u0441\u0442\u043e\u0432\u044b\u0439 \u0444\u0430\u0439\u043b \u043d\u0435 \u0441\u043e\u0431\u0440\u0430\u043b\u0438: \u0432 \u043d\u0451\u043c \u0435\u0441\u0442\u044c __builtin_unreachable, \u043a\u043e\u0442\u043e\u0440\u043e\u0433\u043e \u043e\u043d\u0438 \u043d\u0435 \u0437\u043d\u0430\u044e\u0442. \u0412 \u043f\u043e\u0434\u0441\u0447\u0451\u0442 \u043e\u043d\u0438 \u043d\u0435 \u0432\u043e\u0448\u043b\u0438. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0432\u0435\u0440\u0441\u0438\u0438 \u044f \u0440\u0430\u0437\u0431\u0438\u0440\u0430\u043b \u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440: \u0435\u0441\u0442\u044c \u043b\u0438 ud2, \u043e\u0441\u0442\u0430\u043b\u0430\u0441\u044c \u043b\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0430 x &gt; 0, \u0435\u0441\u0442\u044c \u043b\u0438 \u0432 \u0442\u0435\u043b\u0435 \u0445\u043e\u0442\u044c \u043e\u0434\u043d\u0430 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044f.\u0422\u0430\u0431\u043b\u0438\u0446\u0430 \u043f\u043e \u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0427\u0442\u043e \u0432 \u043a\u043e\u0434\u0435-O0-O2f_noret, GCC 4.5\u20137.5ret, \u0432 eax \u043c\u0443\u0441\u043e\u0440ret, \u0432 eax \u043c\u0443\u0441\u043e\u0440f_noret, GCC 8.1\u201312.5ret, \u0432 eax \u043c\u0443\u0441\u043e\u0440\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435\u0442, \u043e\u0434\u0438\u043d jmp sidef_noret, GCC 13.1\u201316.2ud2\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435\u0442, \u043e\u0434\u0438\u043d jmp sidef_noret, Clang 3.2\u201323.1ud2\u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0438 \u043d\u0435\u0442, \u043e\u0434\u0438\u043d jmp sidef_empty, GCC 4.5\u20137.5\u2014ret, \u0432 eax \u043c\u0443\u0441\u043e\u0440f_empty, GCC 8.1\u201315.3\u2014\u043f\u0443\u0441\u0442\u043e\u0435 \u0442\u0435\u043b\u043e, \u043d\u043e\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439f_empty, GCC 16.1\u201316.2\u2014ud2f_empty, Clang 3.2\u201323.1\u2014\u043f\u0443\u0441\u0442\u043e\u0435 \u0442\u0435\u043b\u043e, \u043d\u043e\u043b\u044c \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439Clang 3.0 \u0438 3.1 \u0432\u0435\u0434\u0443\u0442 \u0441\u0435\u0431\u044f \u043a\u0430\u043a \u0441\u0442\u0430\u0440\u044b\u0439 GCC: ret \u0438 \u043c\u0443\u0441\u043e\u0440 \u043d\u0430 \u043e\u0431\u043e\u0438\u0445 \u0443\u0440\u043e\u0432\u043d\u044f\u0445.jmp side \u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442, \u0447\u0442\u043e \u043f\u0440\u0438 x &lt;= 0 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0432\u0441\u0451 \u0440\u0430\u0432\u043d\u043e \u0432\u044b\u0437\u044b\u0432\u0430\u0435\u0442 side(x), \u0442\u043e \u0435\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442 \u0432\u0435\u0442\u043a\u0443, \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u0443\u044e \u0434\u043b\u044f \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0447\u0438\u0441\u0435\u043b. \u0421 \u0442\u043e\u0447\u043a\u0438 \u0437\u0440\u0435\u043d\u0438\u044f \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u044d\u0442\u043e \u0437\u0430\u043a\u043e\u043d\u043d\u043e: \u043f\u0443\u0442\u044c \u0431\u0435\u0437 return \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0441\u043b\u0443\u0447\u0438\u0442\u044c\u0441\u044f, \u0437\u043d\u0430\u0447\u0438\u0442, \u0443\u0441\u043b\u043e\u0432\u0438\u0435 \u0432\u0441\u0435\u0433\u0434\u0430 \u0438\u0441\u0442\u0438\u043d\u043d\u043e \u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0442\u044c \u0435\u0433\u043e \u043d\u0435\u0437\u0430\u0447\u0435\u043c.\u041f\u0443\u0441\u0442\u043e\u0435 \u0442\u0435\u043b\u043e \u043e\u043f\u0430\u0441\u043d\u0435\u0435. \u041c\u0435\u0442\u043a\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0435\u0441\u0442\u044c, \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439 \u0437\u0430 \u043d\u0435\u0439 \u043d\u0435\u0442, \u0438 \u043f\u0440\u043e\u0446\u0435\u0441\u0441\u043e\u0440, \u043f\u043e\u043f\u0430\u0432 \u043d\u0430 \u043d\u0435\u0451, \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442 \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u043b\u0438\u043d\u043a\u0435\u0440 \u043f\u043e\u043b\u043e\u0436\u0438\u043b \u0441\u043b\u0435\u0434\u043e\u043c.\u0427\u0442\u043e \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u043d\u0430 \u0441\u0430\u043c\u043e\u043c \u0434\u0435\u043b\u0435\u0410\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440 \u2014 \u044d\u0442\u043e \u0435\u0449\u0451 \u043d\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435, \u043f\u043e\u044d\u0442\u043e\u043c\u0443 \u044f \u0441\u043e\u0431\u0440\u0430\u043b \u043c\u0430\u043b\u0435\u043d\u044c\u043a\u0443\u044e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0443. \u0412 \u0438\u0441\u0445\u043e\u0434\u043d\u0438\u043a\u0435 \u0441\u0440\u0430\u0437\u0443 \u0437\u0430 f_empty \u043b\u0435\u0436\u0438\u0442 \u0444\u0443\u043d\u043a\u0446\u0438\u044f \u0441 \u0437\u0430\u043c\u0435\u0442\u043d\u044b\u043c \u043f\u043e\u0431\u043e\u0447\u043d\u044b\u043c \u044d\u0444\u0444\u0435\u043a\u0442\u043e\u043c:extern &#171;C&#187; __attribute__((noinline)) int side(int x) { std::printf(&#171;side(%d) &#171;, x); return x; }extern &#171;C&#187; __attribute__((noinline)) int f_noret(int x) { if (x &gt; 0) return side(x); }extern &#171;C&#187; __attribute__((noinline)) int f_empty(int x) { (void)x; }extern &#171;C&#187; __attribute__((noinline, used)) int wipe_disk(int x) { std::printf(&#171;WIPE_DISK(%d)! &#171;, x); return 7; }int main(int argc, char** argv) {    int (*volatile fp)(int) = argv[1][0] == &#8216;n&#8217; ? f_noret : f_empty;    int r = fp(std::atoi(argv[2]));    std::printf(&#171;returned %d\\n&#187;, r);    return 0;}\u0423\u043a\u0430\u0437\u0430\u0442\u0435\u043b\u044c volatile, \u0447\u0442\u043e\u0431\u044b \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u043d\u0435 \u043c\u043e\u0433 \u043d\u0438\u0447\u0435\u0433\u043e \u0432\u044b\u0432\u0435\u0441\u0442\u0438 \u0438\u0437 \u043c\u0435\u0441\u0442\u0430 \u0432\u044b\u0437\u043e\u0432\u0430. GCC 15.3 \u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u043b \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e \u0432 \u043e\u0431\u0440\u0430\u0437\u0435 gcc:15, GCC 16.2, Clang 23.1 \u0438 Clang 19.1 \u0447\u0435\u0440\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u043d\u0430 Compiler Explorer.                    .\/demo n -1                 .\/demo e -1GCC 15.3  -O0       SIGILL                      SIGILLGCC 16.2  -O0       SIGILL                      SIGILLClang 23.1 -O0      SIGILL                      SIGILLGCC 15.3  -O2       side(-1) returned -1, rc=0  SIGSEGVGCC 16.2  -O2       side(-1) returned -1, rc=0  SIGILLClang 23.1 -O2      side(-1) returned -1, rc=0  WIPE_DISK(-1)! returned 7, rc=0Clang 19.1 -O2      side(-1) returned -1, rc=0  WIPE_DISK(-1)! returned 7, rc=0\u0411\u0435\u0437 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0446\u0438\u0438 \u0432\u0441\u0435 \u0442\u0440\u043e\u0435 \u043f\u0430\u0434\u0430\u044e\u0442 \u0441\u0440\u0430\u0437\u0443, \u043a\u0430\u043a \u0432 \u043e\u0431\u044a\u044f\u0441\u043d\u0435\u043d\u0438\u0438 \u0427\u0435\u043d\u0430. \u0421 -O2 \u0441\u043b\u0443\u0447\u0430\u0439 n -1 \u0443 \u0432\u0441\u0435\u0445 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0448\u0442\u0430\u0442\u043d\u043e: \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0430 \u0432\u0435\u0442\u043a\u0443 \u0434\u043b\u044f \u043f\u043e\u043b\u043e\u0436\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 x \u0438 \u0432\u0435\u0440\u043d\u0443\u043b\u0430 \u043a\u043e\u0434 0. \u0422\u0435\u0441\u0442, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u0442 \u0442\u043e\u043b\u044c\u043a\u043e \u043a\u043e\u0434 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f, \u044d\u0442\u0443 \u043e\u0448\u0438\u0431\u043a\u0443 \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442.Clang \u043d\u0430 e -1 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u043b wipe_disk(), \u043a\u043e\u0442\u043e\u0440\u0443\u044e \u043d\u0438\u043a\u0442\u043e \u043d\u0435 \u0432\u044b\u0437\u044b\u0432\u0430\u043b, \u0438 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u0442\u043e\u0436\u0435 \u0448\u0442\u0430\u0442\u043d\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0430\u0441\u044c. \u0412 \u044d\u0442\u043e\u043c \u0434\u0435\u043c\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u043b\u0430\u0441\u044c \u0441\u043e\u0441\u0435\u0434\u043d\u044f\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u044f; \u0447\u0442\u043e \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u0441\u044f \u0432 \u0434\u0440\u0443\u0433\u043e\u0439 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0435, \u0437\u0430\u0432\u0438\u0441\u0438\u0442 \u043e\u0442 \u0442\u043e\u0433\u043e, \u043a\u0430\u043a \u043b\u0438\u043d\u043a\u0435\u0440 \u0440\u0430\u0437\u043c\u0435\u0441\u0442\u0438\u043b \u043a\u043e\u0434.\u041e\u0442\u043a\u0443\u0434\u0430 \u0432\u0437\u044f\u043b\u0441\u044f SIGSEGV\u0421\u043d\u0430\u0447\u0430\u043b\u0430 \u044d\u0442\u043e \u0432\u044b\u0433\u043b\u044f\u0434\u0435\u043b\u043e \u043a\u0430\u043a \u0437\u0430\u0449\u0438\u0442\u0430. \u041e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u043d\u0435\u0442. GCC 15.3 \u043d\u0430 -O2 \u043a\u043b\u0430\u0434\u0451\u0442 \u043f\u0443\u0441\u0442\u0443\u044e f_empty \u0432 \u0441\u0435\u043a\u0446\u0438\u044e .text.unlikely \u0441 \u043d\u0443\u043b\u0435\u0432\u044b\u043c \u0440\u0430\u0437\u043c\u0435\u0440\u043e\u043c, \u0430 main \u0432 .text.startup. \u041b\u0438\u043d\u043a\u0435\u0440 \u0441\u0442\u0430\u0432\u0438\u0442 \u044d\u0442\u0438 \u0441\u0435\u043a\u0446\u0438\u0438 \u043f\u043e\u0434\u0440\u044f\u0434, \u0438 \u0432 \u0441\u043e\u0431\u0440\u0430\u043d\u043d\u043e\u043c \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u0435 \u0443 f_empty \u0438 main \u043e\u0434\u0438\u043d \u0438 \u0442\u043e\u0442 \u0436\u0435 \u0430\u0434\u0440\u0435\u0441:0000000000401050 T f_empty0000000000401050 T main\u0412\u044b\u0437\u043e\u0432 f_empty(-1) \u043d\u0430 \u0434\u0435\u043b\u0435 \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442 main \u0437\u0430\u043d\u043e\u0432\u043e, \u0441 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u043e\u043c -1 \u0432\u043c\u0435\u0441\u0442\u043e argc \u0438 \u0441\u043b\u0443\u0447\u0430\u0439\u043d\u044b\u043c \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u043c\u044b\u043c \u0440\u0435\u0433\u0438\u0441\u0442\u0440\u0430 rsi \u0432\u043c\u0435\u0441\u0442\u043e argv. \u041f\u043e \u0434\u0438\u0437\u0430\u0441\u0441\u0435\u043c\u0431\u043b\u0435\u0440\u0443 \u043f\u0435\u0440\u0432\u043e\u0435, \u0447\u0442\u043e \u0434\u0435\u043b\u0430\u0435\u0442 main, \u2014 \u0447\u0438\u0442\u0430\u0435\u0442 argv[1] \u043f\u043e \u0430\u0434\u0440\u0435\u0441\u0443 \u0438\u0437 rsi. \u0422\u043e\u0447\u043d\u0443\u044e \u0441\u0431\u043e\u0439\u043d\u0443\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u044e \u044f \u043d\u0435 \u0441\u043d\u0438\u043c\u0430\u043b, \u043d\u043e \u0434\u0440\u0443\u0433\u0438\u0445 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u0439 \u043a \u043f\u0430\u043c\u044f\u0442\u0438 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u043c\u0435\u0441\u0442\u0430 \u043d\u0435\u0442. \u0427\u0443\u0436\u043e\u0439 \u043a\u043e\u0434 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u043b\u0441\u044f \u0438 \u0437\u0434\u0435\u0441\u044c, \u0430 \u0443\u043f\u0430\u043b\u043e \u043f\u043e\u0442\u043e\u043c\u0443, \u0447\u0442\u043e \u0441\u043e\u0441\u0435\u0434\u043e\u043c \u043e\u043a\u0430\u0437\u0430\u043b\u0430\u0441\u044c main, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u0440\u0430\u0437\u0443 \u043b\u0435\u0437\u0435\u0442 \u0432 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b. \u041e\u043a\u0430\u0436\u0438\u0441\u044c \u0441\u043e\u0441\u0435\u0434\u043e\u043c \u0444\u0443\u043d\u043a\u0446\u0438\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0430\u0440\u0433\u0443\u043c\u0435\u043d\u0442\u044b \u043d\u0435 \u043d\u0443\u0436\u043d\u044b, \u043e\u043d\u0430 \u0431\u044b, \u0441\u043a\u043e\u0440\u0435\u0435 \u0432\u0441\u0435\u0433\u043e, \u043e\u0442\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430, \u043a\u0430\u043a wipe_disk() \u0443 Clang, \u043d\u043e \u044d\u0442\u043e\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442 \u044f \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b.\u0424\u043b\u0430\u0433\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043b\u043e\u0432\u044f\u0442 \u043f\u0440\u043e\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0439 return \u043d\u0430 -O2\u041b\u043e\u0432\u0443\u0448\u043a\u0443 \u043d\u0430 -O2 \u043c\u043e\u0436\u043d\u043e \u0432\u0435\u0440\u043d\u0443\u0442\u044c, \u043d\u043e \u043d\u0435 \u043b\u044e\u0431\u044b\u043c \u0444\u043b\u0430\u0433\u043e\u043c, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043d\u0430 \u044d\u0442\u043e \u043f\u043e\u0445\u043e\u0436.\u0424\u043b\u0430\u0433n -1e -1GCC 13+: -funreachable-trapsSIGILLSIGILLGCC: -fsanitize=return -fsanitize-undefined-trap-on-errorSIGILLSIGILLClang: -fsanitize=return -fsanitize-trap=returnSIGILLSIGILLClang: -mllvm -trap-unreachableside(-1), rc=0SIGILL\u0421 -mllvm -trap-unreachable Clang \u0441\u0442\u0430\u0432\u0438\u0442 ud2 \u0432 \u043f\u0443\u0441\u0442\u043e\u0435 \u0442\u0435\u043b\u043e, \u043d\u043e \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443 x &gt; 0 \u043e\u043f\u0442\u0438\u043c\u0438\u0437\u0430\u0442\u043e\u0440 \u0432\u044b\u0431\u0440\u0430\u0441\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u043d\u044c\u0448\u0435, \u0438 \u043b\u043e\u0432\u0438\u0442\u044c \u0443\u0436\u0435 \u043d\u0435\u0447\u0435\u0433\u043e.\u041b\u043e\u0432\u0443\u0448\u043a\u0430 GCC \u043d\u0430 -O0 \u2014 \u044d\u0442\u043e \u0438 \u0435\u0441\u0442\u044c -funreachable-traps, \u0432\u043a\u043b\u044e\u0447\u0451\u043d\u043d\u044b\u0439 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e: \u0441 -fno-unreachable-traps GCC 13\u201316 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u0435\u0442\u0441\u044f \u043a ret \u0441 \u043c\u0443\u0441\u043e\u0440\u043e\u043c. \u0412 GCC 12.5 \u0442\u0430\u043a\u043e\u0439 \u043e\u043f\u0446\u0438\u0438 \u043d\u0435\u0442, \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440 \u0435\u0451 \u043d\u0435 \u0443\u0437\u043d\u0430\u0451\u0442. \u041e\u0442\u0441\u044e\u0434\u0430 \u0433\u0440\u0430\u043d\u0438\u0446\u0430 \u043c\u0435\u0436\u0434\u0443 12 \u0438 13 \u0432 \u0442\u0430\u0431\u043b\u0438\u0446\u0435. \u0423 Clang \u043b\u043e\u0432\u0443\u0448\u043a\u0443 \u043d\u0430 -O0 \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0435\u0442 -fno-strict-return, \u0442\u043e\u0433\u0434\u0430 \u0438 \u0442\u0430\u043c \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f ret \u0441 \u043c\u0443\u0441\u043e\u0440\u043e\u043c.\u0427\u0442\u043e \u0438\u0437 \u044d\u0442\u043e\u0433\u043e \u0441\u043b\u0435\u0434\u0443\u0435\u0442\u0421\u043e\u0432\u0435\u0442 \u0427\u0435\u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u0432 \u043e\u0434\u043d\u0443 \u0441\u0442\u043e\u0440\u043e\u043d\u0443: \u0443\u043f\u0430\u043b\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430 \u043d\u0430 ud2 \u2014 \u043e\u0448\u0438\u0431\u043a\u0430 \u0435\u0441\u0442\u044c. \u041e\u0431\u0440\u0430\u0442\u043d\u043e\u0435 \u043d\u0435\u0432\u0435\u0440\u043d\u043e. \u041d\u0430 -O2 \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441 \u0443\u0441\u043b\u043e\u0432\u0438\u0435\u043c \u043b\u043e\u0432\u0443\u0448\u043a\u0438 \u043d\u0435\u0442 \u043d\u0438 \u0443 \u043e\u0434\u043d\u043e\u0439 \u0438\u0437 114 \u0432\u0435\u0440\u0441\u0438\u0439: \u0441\u0442\u0430\u0440\u044b\u0435 \u0432\u0435\u0440\u0441\u0438\u0438 \u0432\u043e\u0437\u0432\u0440\u0430\u0449\u0430\u044e\u0442 \u043c\u0443\u0441\u043e\u0440, \u0430 GCC \u0441 8.1 \u0438 Clang \u0441 3.2 \u0443\u0434\u0430\u043b\u044f\u044e\u0442 \u043f\u0440\u043e\u0432\u0435\u0440\u043a\u0443, \u0438 \u0432 \u0434\u0435\u043c\u043e \u0432\u0441\u0435 \u0447\u0435\u0442\u044b\u0440\u0435 \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0442\u043e\u0440\u0430 \u0438\u0441\u043f\u043e\u043b\u043d\u0438\u043b\u0438 \u043d\u0435 \u0442\u0443 \u0432\u0435\u0442\u043a\u0443 \u0438 \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u043b\u0438\u0441\u044c \u0441 \u043a\u043e\u0434\u043e\u043c 0. \u0424\u0443\u043d\u043a\u0446\u0438\u044f \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0433\u043e return \u0443 \u0431\u043e\u043b\u044c\u0448\u0438\u043d\u0441\u0442\u0432\u0430 \u0432\u0435\u0440\u0441\u0438\u0439 \u043e\u0441\u0442\u0430\u0451\u0442\u0441\u044f \u0431\u0435\u0437 \u0438\u043d\u0441\u0442\u0440\u0443\u043a\u0446\u0438\u0439, \u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u044f\u0435\u0442\u0441\u044f \u0441\u043e\u0441\u0435\u0434\u043d\u0438\u0439 \u043a\u043e\u0434. \u041b\u043e\u0432\u0443\u0448\u043a\u0443 \u043d\u0430 -O2 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0441\u0442\u0430\u0432\u0438\u0442 \u0442\u043e\u043b\u044c\u043a\u043e GCC 16, \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u0432 \u0444\u0443\u043d\u043a\u0446\u0438\u044e \u0431\u0435\u0437 \u0435\u0434\u0438\u043d\u043e\u0433\u043e return.\u0414\u0435\u0448\u0435\u0432\u043b\u0435 \u0432\u0441\u0435\u0433\u043e \u043d\u0435 \u0434\u0430\u0442\u044c \u0442\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0441\u043a\u043e\u043c\u043f\u0438\u043b\u0438\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f: -Werror=return-type. \u0415\u0441\u043b\u0438 \u043f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u043e \u0438\u043b\u0438 \u043a\u043e\u0434 \u0447\u0443\u0436\u043e\u0439, \u0432 \u0441\u0431\u043e\u0440\u043a\u0443 \u0441 -O2 \u0441\u0442\u043e\u0438\u0442 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c -funreachable-traps \u0434\u043b\u044f GCC 13+ \u0438\u043b\u0438 -fsanitize=return -fsanitize-trap=return \u0434\u043b\u044f Clang. \u0422\u043e\u0433\u0434\u0430 \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0430, \u0434\u043e\u0439\u0434\u044f \u0434\u043e \u043a\u043e\u043d\u0446\u0430 \u0442\u0430\u043a\u043e\u0439 \u0444\u0443\u043d\u043a\u0446\u0438\u0438, \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u0441\u044f \u0441 SIGILL.\u041e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u0435: GCC 4.5.3\u201316.2 \u0438 Clang 3.0\u201323.1 \u043d\u0430 Compiler Explorer (API \u043a\u043e\u043c\u043f\u0438\u043b\u044f\u0446\u0438\u0438 \u0438 \u0438\u0441\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u044f, \u043d\u043e\u044f\u0431\u0440\u044c 2026), \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e gcc:15 (GCC 15.3.0), x86-64, Linux. MSVC \u043d\u0435 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u043b: \u043a \u043d\u0435\u043c\u0443 \u0442\u0435\u0437\u0438\u0441 \u0427\u0435\u043d\u0430, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e, \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c \u0446\u0435\u043b\u0438\u043a\u043e\u043c.\u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 https:\/\/habr.com\/ru\/articles\/1105760\/<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-502410","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/502410","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=502410"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/502410\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=502410"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=502410"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=502410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}