#опытным
Спасибо, @Ivaneo, за любезно предоставленный примерчик.
Посмотрите на этот код:
#include <iostream>
int read;
int main()
{
std::ios_base::sync_with_stdio(false);
std::cin >> read;
}
Как думаете, что случится при попытке компиляции со статической линковкой системных библиотек и запуска этого кода под linux? Поразмышляйте несколько секунд.
А получите ошибку сегментации: прилетит сигнал SIGSEGV.
Почему так? Мы же ничего незаконного не делали! Просто пытаемся читать в переменную, заблаговременно отвязав С++ потоки от сишных.
На самом деле сделали кое-что незаконное. Назвали переменную в честь системного вызова. Давайте по порядку.
Когда у нас потоки синхронизированы, для операций с потоками используется стандартное сишное апи.
Когда мы отвязываем потоки, то С++ ввод-вывод начинает работать самостоятельно и независимо. Имеются полноценные буферы и сложная система их менеджмента. А для общения с операционной системой можно использовать непосредственно системные вызовы.
Посмотрим на примере gcc.
В исходниках есть такое определение библиотечного вызова чтения:
/* Read NBYTES into BUF from FD. Return the number read or -1. */
ssize_t
__libc_read (int fd, void *buf, size_t nbytes)
{
return SYSCALL_CANCEL (read, fd, buf, nbytes);
}
weak_alias (__libc_read, read)
Таким образом символ read, соответствующий функции чтения данных из файлового дискриптора, является слабым(weak).
А переменная read из нашего кода является сильным символом из сегмента неинициализированных данных(bss).
Естественно, что сильный символ всегда переписывает слабый. Поэтому в итоговом исполняемом файле символ read будет указывать не на функцию, а на переменную read.
То есть при запуске программы и попытке вызвать функцию read, будет "вызываться" переменная. Отсюда и сегфолт.
Все системные функции - это С функции. У них нет никаких неймспейсов, чтобы предотвращать клаш имен. Поэтому всегда избегайте имен, которые могут конфликтовать со стандартными библиотечными функциями(например
read, open, close, write, exit).Avoid name clash. Stay cool.
#cppcore #goodoldc #OS