LLVM ááá±á¬áá»ááºá developer áá»á¬ážááẠmission-critical C++ ááá±á¬áá»ááºáá»á¬ážá áá¯á¶ááŒá¯á¶áá±ážááᯠá¡á¬ážáá±á¬ááºážáá¬á á±áááºááŸáá·áº ááŒá¬ážáᶠoverruns ááŒá±á¬áá·áºááŒá áºáááá·áº á¡ááŸá¬ážáá»á¬ážááᯠáááºááŸá¬ážáá áºááẠáááºážáááºážáá»á¬áž áá¶á·ááá¯ážáá±ážáááºá¡ááœáẠá¡ááŒá±á¬ááºážá¡áá²áá»á¬ážá áœá¬ááᯠá¡ááá¯ááŒá¯áá¬ážáááºá á¡áá¯ááºááẠáááºáááºááŸá áºáá¯ááᯠá¡á¬áá¯á¶á áá¯ááºáááº- buffers áá»á¬ážááŸáá·áº áá±ážáááºážá áœá¬ á¡áá¯ááºáá¯ááºááá¯ááºá á±ááá·áº ááœá¶á·ááŒáá¯ážááá¯ážáááºááŸá¯áá¯á¶á á¶ááᯠáá±ážá¡ááºááŒááºážááŸáá·áº áá¯ááºáá±á¬ááºáá»ááºáá»á¬ážá libc++ á á¶ááŒá á¬ááŒáá·áºááá¯ááºá áá¯á¶ááŒá¯á¶áá±ážááᯠááá¯ááºáá¬á á±ááẠáá¯ááºáá±á¬ááºááŒááºáž ááŒá áºáááºá
C++ á¡ááœáẠá¡ááá¯ááŒá¯áá¬ážáá±á¬ áá±ážáááºážáá±á¬ áááá¯ááááºážáááºážáá¯á¶á á¶ááẠá á¶ááŒá á¬ááŒáá·áºááá¯ááºá០áá¶á·ááá¯ážáá±ážáá¬ážááá·áº á¡áááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯áááºá¡ááœáẠbuffers áá»á¬ážááŸáá·áº á¡áá¯ááºáá¯ááºáá±á¬á¡áá«ááœáẠááá«ááŸááá±á¬ pointers áá»á¬ážááᯠááŒáá¯ážááá¯ááºááŒááºááŸááºááá·áºá¡á á¬áž á¡áá¯á¶ážááŒá¯áááºááŒá áºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá classes std::array, std::vector ááŸáá·áº std::span ááá¯á·ááᯠá¡áá¯á¶ážááŒá¯ááẠá¡ááá¯ááŒá¯áá¬ážááŒá®ážá áááºážááẠááá·áºáááºááœá²áá±áá¬ážáá±á¬ áááºááá¯áá®ááŒááºáááŸá á¡áá»áááºá á áºáá±ážáá»ááºááŒáá·áº áá±á«ááºážááá·áºáááºááŒá áºáááºá
clang ááœáẠá¡áá¹ááá¬ááºááŸááá±á¬ áááá¯ááááºáá±ážáá¬ážááŒááºážá¡áá±á·á¡áá»áá·áºáá»á¬ážááᯠááá¯ááºáá»ááºááẠ"cppcoreguidelines-pro-bounds-pointer-arithmetic" á¡áá¶ááᯠá¡áá¯á¶ážááŒá¯áá±á¬á¡áá«ááœáẠáá±á«áºáá¬ááá·áº áá¶á·ááá¯ážááŸá¯ á¡áá¶ááᯠá¡áá¯á¶ážááŒá¯ááá·áºá¡áá« clang-tidy á linter ááááá±ážáá»ááºáá»á¬ážááŸáá·áº áááºáá°ááá·áº ááœáŸááºááááºážááááºážáááºá¹áá»á¬áá¯ááºáááºážá¡á¬ážáá¯á¶ážá¡ááœáẠcompiler ááááá±ážáá»ááºáá»á¬ážááᯠáá¯ááºááŒááºááẠá¡ááá¯ááŒá¯áá¬ážáááºá LLVM 16 áá¯ááºáá±ááŸá¯á ááá¯ááá¯á·áá±á¬ááááá±ážáá»ááºáá»á¬ážááá¯ááœáá·áºáááºá áá¯á¶ááŸááºá¡á¬ážááŒáá·áº ááááºááŒáœáá±á¬ áá®ážááŒá¬ážá¡áá¶ááᯠclang ááá¯á· áá±á«ááºážááá·áºáááºááŒá áºáááºá
áááºážááẠlibc++ ááœáẠááœá±ážáá»ááºááá¯ááºáá±á¬ áá¬áá»á±á¬áá±á¬ áá¬ááœááºááŸá¯áá¯ááºááᯠá¡áá±á¬ááºá¡áááºáá±á¬áºááẠá á®á ááºáá¬ážááŒá®áž áááºážááᯠááœáá·áºááá¯ááºáá±á¬á¡áá«ááœááºá runtime ááœáẠáááºááŸááºáá¬ážááŒááºážáááŸááá±á¬ á¡ááŒá¯á¡áá°á¡áá»áá¯á·ááᯠááŒá áºáá±á«áºá á±ááá·áº á¡ááŒá±á¡áá±á¡áá»áá¯á·ááᯠáááºážá á¬ážááá¯ááºáááºááŒá áºáááºá á¥ááá¬á¡á¬ážááŒáá·áºá std::span ááŸáá·áº std::vector á¡áááºážáá»á¬ážááœááºá ááŒááºáááá¯á·áááºáá±á¬ááºááœáá·áºááᯠá á±á¬áá·áºááŒáá·áºáááºááŒá áºááŒá®áž áááºážá¡ááŒá±á¡áá±ááœáẠáááá¯ááááºááẠáá»ááºá á®ážááœá¬ážáááºááŒá áºáááºá áááºááŸááºááá¬ážáá±á¬ á¡áá°á¡áá»áá·áºáá»á¬ážááᯠááá¯ááºááœááºáááºážááœá±ážáá»ááºááŸá¯ááẠá á¬ááŒáá·áºááá¯ááºá áá±á¬á·ááºáá²áá±ážáá¬ážáá°áá»á¬ážááŸáá·áº áááºááá¯ááºáá±á¬ááŒá±á¬áá·áºá ááá¯ááá¯á·áá±á¬ááŒá±á¬ááºážáá²ááŸá¯áá»á¬ážááᯠááá·áºááœááºážááŒááºážááẠlibc++ á á¶ááŸá¯ááºážáá»á¬ážááŸáá·áº ááá¯ááºáá»á±á¬áá®ááœá±ááŸáá á±áááºáᯠáá±á¬á·ááºáá²á¡ááºáá»ááºáá®áá¬áá»á¬ážá áá¯á¶ááŒááºááŒáááºá ááœááºáááºá¡á á®á¡á ááºá
libc++ ááœáẠruntime checks áá»á¬ážááᯠáá áºáŠážáá»ááºážáá«áááºááá¯ááºááá·áº á¡áá»áá¯ážá¡á á¬ážáá»á¬áž ááœá²ááŒá¬ážááẠá á®á ááºáá¬ážáááºá ááá¯ááá¯ááŸá¯ááºááœá±ážáá±á¬áá¯ááºáá±á¬ááºááŸá¯áá»á¬áž ááá¯á·ááá¯áẠABI á¡ááŒá±á¬ááºážá¡áá²áá»á¬ážááᯠáááŒá áºáá±á«áºá á±ááá·áº á¡ááŒá¶ááŒá¯áá»ááºá¡áá»áá¯á·ááᯠlibc++ ááá±ážáááºážáá±á¬áá¯ááºááœáẠá¡áá±á¬ááºá¡áááºáá±á¬áºááŒá®ážááŒá áºáááºá
ááá¯á·á¡ááŒááºá ááœááºááááºáá¬áá±á«áºááŸá ááœáŸááºááŒáá»ááºáá»á¬ážááŸáá·áº ááááºážááŸááºáá»á¬ážááᯠá¡á
á¬ážááá¯ážáááºááŸáá·áº ááœááºááááºáá¬ááᯠááá¯ááºááá¯ááºáá¡á
á¬ážááá¯ážááá¯ááºááá·áº á¡ááŒá±á¡áá±áá»á¬ážááœáẠá¡á
á¬ážááá¯ážááá¯ááºááœááºáá°áá»á¬ážááᯠá¡áá¯á¶ážááŒá¯ááœáá·áºáá±ážáᬠáá¯ááºááá¯ááŒááºáááºá¡ááœáẠáááááá¬áááºáá¬ááá¬á¡á
á¯á¶ááᯠááŒááºáááºááẠá
á®á
ááºáá¬ážááẠ(á¥ááá¬á "if (array_pointer)" construct ááᯠâif (span.data ()â) ááá¯á· ááŒá±á¬ááºážááá¯ááºáááºá áá»áááºááŸááá»ááºáá»á¬ážááᯠlocal variable áá»á¬ážááœááºáá¬áá pointers áá»á¬ážááŒáá·áº parameters áá»á¬ážááᯠááá¯ááºááá·áºáááºáááºáž á¡áá¯á¶ážááŒá¯ááá¯ááºáááºááŒá
áºáááºá
source: opennet.ru