Здравствуйте, netch80, Вы писали:
N>Всё сказанное выше — результат исторического развития методом "каждый раз шаг, полностью логичный из предыдущего состояния, но в новом направлении".
Все вышесказанное верно, но тут есть интересный момент, про который часто забывают говоря о C++ – санитарайзеры. Я наугад взял два примера из приведенных тобой и собрал следующим образом:
clang++ -fsanitize=undefined main.cpp
Пример с арифметикойАвтор: Кодт
Дата: 18.06.14
test> ./a.out
0 : 0 : 27
1 : 1000000000 : 82
2 : 2000000000 : 41
main.cpp:8:38: runtime error: signed integer overflow: 3 * 1000000000 cannot be represented in type 'int'
3 : -1294967296 : 124
4 : -294967296 : 62
5 : 705032704 : 31
6 : 1705032704 : 94
7 : -1589934592 : 47
8 : -589934592 : 142
9 : 410065408 : 71
Пример с оптимизацией
test> ./a.out
UndefinedBehaviorSanitizer:DEADLYSIGNAL
==2982==ERROR: UndefinedBehaviorSanitizer: SEGV on unknown address 0x000000000000 (pc 0x0001078c7ef1 bp 0x7ffee83389a0 sp 0x7ffee8338980 T298609)
==2982==The signal is caused by a READ memory access.
==2982==Hint: address points to the zero page.
#0 0x1078c7ef0 in main (a.out:x86_64+0x100000ef0)
==2982==Register values:
rax = 0x0000000000000000 rbx = 0x0000000000000000 rcx = 0x0000000000000000 rdx = 0x00007ffee83389d0
rdi = 0x0000000000000001 rsi = 0x00007ffee83389c0 rbp = 0x00007ffee83389a0 rsp = 0x00007ffee8338980
r8 = 0x0000000000000000 r9 = 0xffffffff00000000 r10 = 0x00007fff9828f0c8 r11 = 0x00007fff9828f0d0
r12 = 0x0000000000000000 r13 = 0x0000000000000000 r14 = 0x0000000000000000 r15 = 0x0000000000000000
UndefinedBehaviorSanitizer can not provide additional info.
==2982==ABORTING
Так что с одной стороны проблемы есть, наследие тяжелое, грабли тщательно прикрыты листьями и т.д. С другой стороны, знать наизусть про то, где и как разложены грабли не надо, надо писать юнит-тесты и гонять их под всеми имеющимися санитайзерами и в общем случае проблемы не будет, ну или она будет сопоставима по сложности с проблемами в управляемых языках.