Your last assumption is wrong, you cannot accidentally share data between libraries.
How this is achieved is specific to each library format and operating system, but the main idea is simple:
- code is read-only: it can be shared safely (think
int rand() { return 4; }
) - constants are read-only: they can be shared safely (think
"Hello, World!"
) - variables are not read-only: they are not shared (an immutable "template" is shared, and used to initialize the process own copy which is private)
Even when using fork
on Linux, the newly created process will not share the variables from its parent process; it will share their initial value in a copy, but both will then evolve differently.
That being said, just avoid global variables; and if possible also avoid thread-local variables.