Commit 06cd4cf
committed
std: Fix segfaulting
This commit is a fix for rust-lang#48493 where calling `Weak::new` where `T` is an
uninhabited type would segfault. The cause for this issue was pretty subtle and
the fix here is mostly a holdover until rust-lang#47650 is implemented.
The `Weak<!>` struct internally contains a `NonNull<RcBox<!>>`. The `RcBox<!>`
type is uninhabited, however, as it directly embeds the `!` type. Consequently
the size of `RcBox<!>` is zero, which means that `NonNull<RcBox<!>>` always
contains a pointer with a value of 1. Currently all boxes of zero-sized-types
are actually pointers to the address 1 (as they shouldn't be read anyway).
The problem comes about when later on we have a method called `Weak::inner`
which previously returned `&RcBox<T>`. This was actually invalid because the
instance of `&RcBox<T> ` never existed (only the uninitialized part). This
means that when we try to actually modify `&RcBox`'s weak count in the
destructor for `Weak::new` we're modifying the address 1! This ends up causing a
segfault.
This commit takes the strategy of modifying the `Weak::inner` method to return
an `Option<&RcBox<T>>` that is `None` whenever the size of `RcBox<T>` is 0 (so
it couldn't actually exist). This does unfortunately add more dispatch code to
operations like `Weak<Any>::clone`. Eventually the "correct" fix for this is to
have `RcBox<T>` store a union of `T` and a ZST like `()`, and that way the size
of `RcBox<T>` will never be 0 and we won't need this branch. Until rust-lang#47650 is
implemented, though, we can't use `union`s and unsized types together.
Closes rust-lang#48493Weak<!>::new
1 parent ab8b961 commit 06cd4cf
3 files changed
Lines changed: 146 additions & 65 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
991 | 991 | | |
992 | 992 | | |
993 | 993 | | |
994 | | - | |
| 994 | + | |
| 995 | + | |
| 996 | + | |
995 | 997 | | |
996 | 998 | | |
997 | 999 | | |
998 | | - | |
| 1000 | + | |
999 | 1001 | | |
1000 | 1002 | | |
1001 | 1003 | | |
| |||
1032 | 1034 | | |
1033 | 1035 | | |
1034 | 1036 | | |
1035 | | - | |
| 1037 | + | |
1036 | 1038 | | |
1037 | 1039 | | |
1038 | 1040 | | |
| |||
1061 | 1063 | | |
1062 | 1064 | | |
1063 | 1065 | | |
1064 | | - | |
| 1066 | + | |
1065 | 1067 | | |
1066 | | - | |
| 1068 | + | |
| 1069 | + | |
| 1070 | + | |
| 1071 | + | |
| 1072 | + | |
| 1073 | + | |
| 1074 | + | |
| 1075 | + | |
| 1076 | + | |
| 1077 | + | |
| 1078 | + | |
| 1079 | + | |
| 1080 | + | |
| 1081 | + | |
| 1082 | + | |
| 1083 | + | |
| 1084 | + | |
| 1085 | + | |
| 1086 | + | |
| 1087 | + | |
| 1088 | + | |
| 1089 | + | |
| 1090 | + | |
| 1091 | + | |
| 1092 | + | |
| 1093 | + | |
| 1094 | + | |
| 1095 | + | |
1067 | 1096 | | |
1068 | 1097 | | |
1069 | 1098 | | |
| |||
1082 | 1111 | | |
1083 | 1112 | | |
1084 | 1113 | | |
| 1114 | + | |
| 1115 | + | |
| 1116 | + | |
| 1117 | + | |
| 1118 | + | |
| 1119 | + | |
| 1120 | + | |
| 1121 | + | |
1085 | 1122 | | |
1086 | 1123 | | |
1087 | 1124 | | |
1088 | 1125 | | |
1089 | | - | |
| 1126 | + | |
1090 | 1127 | | |
1091 | 1128 | | |
1092 | 1129 | | |
| |||
1148 | 1185 | | |
1149 | 1186 | | |
1150 | 1187 | | |
| 1188 | + | |
| 1189 | + | |
| 1190 | + | |
| 1191 | + | |
1151 | 1192 | | |
1152 | 1193 | | |
1153 | 1194 | | |
| |||
1157 | 1198 | | |
1158 | 1199 | | |
1159 | 1200 | | |
1160 | | - | |
| 1201 | + | |
1161 | 1202 | | |
1162 | 1203 | | |
1163 | 1204 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
352 | 352 | | |
353 | 353 | | |
354 | 354 | | |
355 | | - | |
| 355 | + | |
356 | 356 | | |
357 | 357 | | |
358 | 358 | | |
| |||
448 | 448 | | |
449 | 449 | | |
450 | 450 | | |
451 | | - | |
| 451 | + | |
452 | 452 | | |
453 | 453 | | |
454 | 454 | | |
| |||
469 | 469 | | |
470 | 470 | | |
471 | 471 | | |
472 | | - | |
| 472 | + | |
473 | 473 | | |
474 | 474 | | |
475 | 475 | | |
| |||
487 | 487 | | |
488 | 488 | | |
489 | 489 | | |
490 | | - | |
| 490 | + | |
491 | 491 | | |
492 | 492 | | |
493 | 493 | | |
| |||
557 | 557 | | |
558 | 558 | | |
559 | 559 | | |
| 560 | + | |
| 561 | + | |
| 562 | + | |
| 563 | + | |
| 564 | + | |
| 565 | + | |
560 | 566 | | |
561 | 567 | | |
562 | 568 | | |
| |||
600 | 606 | | |
601 | 607 | | |
602 | 608 | | |
603 | | - | |
| 609 | + | |
604 | 610 | | |
605 | 611 | | |
606 | | - | |
| 612 | + | |
607 | 613 | | |
608 | 614 | | |
609 | 615 | | |
| |||
836 | 842 | | |
837 | 843 | | |
838 | 844 | | |
839 | | - | |
840 | | - | |
| 845 | + | |
| 846 | + | |
841 | 847 | | |
842 | 848 | | |
843 | 849 | | |
844 | 850 | | |
845 | 851 | | |
846 | | - | |
| 852 | + | |
847 | 853 | | |
848 | | - | |
| 854 | + | |
849 | 855 | | |
850 | 856 | | |
851 | 857 | | |
| |||
871 | 877 | | |
872 | 878 | | |
873 | 879 | | |
874 | | - | |
| 880 | + | |
875 | 881 | | |
876 | 882 | | |
877 | 883 | | |
| |||
1190 | 1196 | | |
1191 | 1197 | | |
1192 | 1198 | | |
1193 | | - | |
| 1199 | + | |
| 1200 | + | |
| 1201 | + | |
1194 | 1202 | | |
1195 | 1203 | | |
1196 | 1204 | | |
1197 | | - | |
| 1205 | + | |
1198 | 1206 | | |
1199 | 1207 | | |
1200 | 1208 | | |
| |||
1229 | 1237 | | |
1230 | 1238 | | |
1231 | 1239 | | |
1232 | | - | |
| 1240 | + | |
| 1241 | + | |
1233 | 1242 | | |
1234 | 1243 | | |
1235 | | - | |
| 1244 | + | |
1236 | 1245 | | |
1237 | 1246 | | |
1238 | 1247 | | |
| 1248 | + | |
| 1249 | + | |
| 1250 | + | |
| 1251 | + | |
| 1252 | + | |
| 1253 | + | |
| 1254 | + | |
| 1255 | + | |
| 1256 | + | |
| 1257 | + | |
| 1258 | + | |
| 1259 | + | |
| 1260 | + | |
1239 | 1261 | | |
1240 | 1262 | | |
1241 | 1263 | | |
| |||
1267 | 1289 | | |
1268 | 1290 | | |
1269 | 1291 | | |
| 1292 | + | |
| 1293 | + | |
| 1294 | + | |
| 1295 | + | |
1270 | 1296 | | |
1271 | | - | |
| 1297 | + | |
1272 | 1298 | | |
1273 | 1299 | | |
1274 | | - | |
| 1300 | + | |
1275 | 1301 | | |
1276 | 1302 | | |
1277 | 1303 | | |
| |||
1293 | 1319 | | |
1294 | 1320 | | |
1295 | 1321 | | |
1296 | | - | |
| 1322 | + | |
| 1323 | + | |
| 1324 | + | |
1297 | 1325 | | |
1298 | 1326 | | |
1299 | 1327 | | |
| |||
1335 | 1363 | | |
1336 | 1364 | | |
1337 | 1365 | | |
1338 | | - | |
1339 | | - | |
1340 | | - | |
1341 | | - | |
1342 | | - | |
1343 | | - | |
1344 | | - | |
1345 | | - | |
1346 | | - | |
1347 | | - | |
| 1366 | + | |
1348 | 1367 | | |
1349 | | - | |
| 1368 | + | |
1350 | 1369 | | |
1351 | 1370 | | |
1352 | | - | |
1353 | 1371 | | |
1354 | | - | |
1355 | | - | |
1356 | | - | |
1357 | | - | |
1358 | | - | |
1359 | | - | |
| 1372 | + | |
1360 | 1373 | | |
1361 | 1374 | | |
1362 | | - | |
1363 | 1375 | | |
1364 | | - | |
| 1376 | + | |
1365 | 1377 | | |
1366 | 1378 | | |
1367 | | - | |
1368 | 1379 | | |
1369 | | - | |
1370 | | - | |
1371 | | - | |
1372 | | - | |
1373 | | - | |
1374 | | - | |
1375 | | - | |
1376 | | - | |
1377 | | - | |
1378 | | - | |
1379 | | - | |
1380 | | - | |
1381 | | - | |
1382 | | - | |
1383 | | - | |
1384 | | - | |
1385 | | - | |
1386 | | - | |
1387 | | - | |
| 1380 | + | |
1388 | 1381 | | |
1389 | 1382 | | |
1390 | 1383 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
0 commit comments