Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Detect calls of thread-unsafe functions as races #723

Closed
7 tasks done
sim642 opened this issue May 4, 2022 · 2 comments
Closed
7 tasks done

Detect calls of thread-unsafe functions as races #723

sim642 opened this issue May 4, 2022 · 2 comments
Assignees
Milestone

Comments

@sim642
Copy link
Member

sim642 commented May 4, 2022

Under "Thread-safe functions" of pthreads man page, it says the following:

A thread-safe function is one that can be safely (i.e., it will deliver the same results regardless of whether it is) called from multiple threads at the same time.
POSIX.1-2001 and POSIX.1-2008 require that all specified in the standard shall be thread-safe, except for following functions:

Then a list of possibly thread-unsafe functions follows.

We should consider calls to these functions (in place of global variables) and report racing calls (in place of accesses).

I was reminded of this when trying to figure out why chrony uses a global lock to protect what seems to be thread-local data manipulation. It doesn't call any functions from this list, but for completenes it would be nice to detect as well.


The following thread-unsafe functions remain to be added to libraryFunctions.ml:

  • ecvt()
  • ftw()
  • nftw()
  • setkey()
  • wcsrtombs()
  • wcstombs()
  • wctomb()

Originally posted by @karoliineh in #1079 (comment)

@sim642 sim642 added the feature label May 4, 2022
@sim642
Copy link
Member Author

sim642 commented May 4, 2022

Related to a couple of *_unlocked functions from the list, turns out there are flockfile, ftrylockfile and funlockfile, which treat a FILE as a mutex. No idea, if anyone uses them, but I guess it wouldn't hurt to also consider those for mutual exclusion.

@michael-schwarz
Copy link
Member

Related to a couple of *_unlocked functions from the list, turns out there are flockfile, ftrylockfile and funlockfile, which treat a FILE as a mutex. No idea, if anyone uses them, but I guess it wouldn't hurt to also consider those for mutual exclusion.

Should we move this to a new issue?

sim642 added a commit to sim642/opam-repository that referenced this issue Sep 13, 2023
CHANGES:

* Add `setjmp`/`longjmp` analysis (goblint/analyzer#887, goblint/analyzer#970, goblint/analyzer#1015, goblint/analyzer#1019).
* Refactor race analysis to lazy distribution (goblint/analyzer#1084, goblint/analyzer#1089, goblint/analyzer#1136, goblint/analyzer#1016).
* Add thread-unsafe library function call analysis (goblint/analyzer#723, goblint/analyzer#1082).
* Add mutex type analysis and mutex API analysis (goblint/analyzer#800, goblint/analyzer#839, goblint/analyzer#1073).
* Add interval set domain and string literals domain (goblint/analyzer#901, goblint/analyzer#966, goblint/analyzer#994, goblint/analyzer#1048).
* Add affine equalities analysis (goblint/analyzer#592).
* Add use-after-free analysis (goblint/analyzer#1050, goblint/analyzer#1114).
* Add dead code elimination transformation (goblint/analyzer#850, goblint/analyzer#979).
* Add taint analysis for partial contexts (goblint/analyzer#553, goblint/analyzer#952).
* Add YAML witness validation via unassume (goblint/analyzer#796, goblint/analyzer#977, goblint/analyzer#1044, goblint/analyzer#1045, goblint/analyzer#1124).
* Add incremental analysis rename detection (goblint/analyzer#774, goblint/analyzer#777).
* Fix address sets unsoundness (goblint/analyzer#822, goblint/analyzer#967, goblint/analyzer#564, goblint/analyzer#1032, goblint/analyzer#998, goblint/analyzer#1031).
* Fix thread escape analysis unsoundness (goblint/analyzer#939, goblint/analyzer#984, goblint/analyzer#1074, goblint/analyzer#1078).
* Fix many incremental analysis issues (goblint/analyzer#627, goblint/analyzer#836, goblint/analyzer#835, goblint/analyzer#841, goblint/analyzer#932, goblint/analyzer#678, goblint/analyzer#942, goblint/analyzer#949, goblint/analyzer#950, goblint/analyzer#957, goblint/analyzer#955, goblint/analyzer#954, goblint/analyzer#960, goblint/analyzer#959, goblint/analyzer#1004, goblint/analyzer#558, goblint/analyzer#1010, goblint/analyzer#1091).
* Fix server mode for abstract debugging (goblint/analyzer#983, goblint/analyzer#990, goblint/analyzer#997, goblint/analyzer#1000, goblint/analyzer#1001, goblint/analyzer#1013, goblint/analyzer#1018, goblint/analyzer#1017, goblint/analyzer#1026, goblint/analyzer#1027).
* Add documentation for configuration JSON schema and OCaml API (goblint/analyzer#999, goblint/analyzer#1054, goblint/analyzer#1055, goblint/analyzer#1053).
* Add many library function specifications (goblint/analyzer#962, goblint/analyzer#996, goblint/analyzer#1028, goblint/analyzer#1079, goblint/analyzer#1121, goblint/analyzer#1135, goblint/analyzer#1138).
* Add OCaml 5.0 support (goblint/analyzer#1003, goblint/analyzer#945, goblint/analyzer#1162).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants