git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 1/2] introduce "banned function" list

From
Jeff King <peff@peff.net>
Date
Jul 20, 2018, 17:56 UTC
Message-ID
<20180720175602.GC22486@sigill.intra.peff.net>
In-Reply-To
<20180720132241.GN30706@thunk.org>
On Fri, Jul 20, 2018 at 09:22:41AM -0400, Theodore Y. Ts'o wrote:
Show 11 quoted lines
> On Thu, Jul 19, 2018 at 09:08:08PM -0400, Jeff King wrote:
> > Ditto for sprintf, where you should _always_ be using at least xsnprintf
> > (or some better tool, depending on the situation).  And for strncpy,
> > strlcpy (or again, some better tool) is strictly an improvement.
> 
> Nitpick: this may be true for git, but it's not strictly true in all
> cases.  I actually have a (non-git) case where strncpy *is* the right
> tool.  And this is one where I'm copying a NUL-terminated string into
> a fixed-length charater array (in the ext4 superblock) which is *not*
> NUL-terminated.  In that case, strncpy works(); but strlcpy() does not
> do what I want.

Thanks for an interesting (and exotic) counter-point. For strcpy(), you always have to run strlen() anyway to know you're not going to overflow, so you might as well memcpy() at that point. But if you really are OK with truncation, then using strncpy() lets you copy while walking over the string only once, which is more efficient. On the other hand, strncpy() fills out NULs to the end of the destination array, so you are paying an extra cost for small strings.

> So I used strncpy() advisedly, and I ignore people running Coccinelle
> scripts and blindly sending patches to "fix" ext4.

Even after hearing your counter-point, I think I'm still OK with the ban. Because as you've noticed, even if the call is fine, it carries an ongoing maintenance cost. Every time you (or somebody else) audits, you have to skip over that known-good call. And you have to deal with well-meaning patches. So to me there's value in eliminating it even if it's an acceptable tool.

We don't have any remaining calls to strncpy() in Git, so this lets us punt on deciding if the ban is worth changing what's there. We can wait for somebody to decide they _really_ need strncpy, and we can discuss it then with a concrete case.

Show 6 quoted lines
> But perhaps that's also a solution for git?  You don't have to
> necessarily put them on a banned list; you could instead have some
> handy, pre-set scripts that scan the entire code base looking for
> "bad" functions with cleanups automatically suggested.  This could be
> run at patch review time, and/or periodically (especially before a
> release).

We do this already with coccinelle for some transformations. But I think there's real value in linting that's always run, and is cheap. Catching these things early means we don't have to spend time on them in review, or dealing with follow-up patches.

-Peff
Previous: Theodore Y. Ts'oNext: Junio C Hamano
Message 18 of 42 in “fail compilation with strcpy”
  1. 0/2 fail compilation with strcpyJeff King, Jul 19, 2018
  2. 1/2 introduce "banned function" listJeff King, Jul 19, 2018
  3. Eric SunshineJul 19, 2018
  4. Jeff KingJul 19, 2018
  5. Eric SunshineJul 19, 2018
  6. Jeff KingJul 20, 2018
  7. Stefan BellerJul 19, 2018
  8. Jeff KingJul 19, 2018
  9. Stefan BellerJul 19, 2018
  10. Jeff KingJul 20, 2018
  11. Junio C HamanoJul 19, 2018
  12. Randall S. BeckerJul 19, 2018
  13. Jeff KingJul 20, 2018
  14. Jeff KingJul 20, 2018
  15. Junio C HamanoJul 20, 2018
  16. Jeff KingJul 20, 2018
  17. Theodore Y. Ts'oJul 20, 2018
  18. Jeff KingJul 20, 2018
  19. Junio C HamanoJul 20, 2018
  20. Derrick StoleeJul 20, 2018
  21. Duy NguyenJul 20, 2018
  22. Elijah NewrenJul 20, 2018
  23. Jeff KingJul 20, 2018
  24. Jeff KingJul 20, 2018
  25. 2/2 banned.h: mark strncpy as bannedJeff King, Jul 19, 2018
  26. Ævar Arnfjörð BjarmasonJul 19, 2018
  27. Jeff KingJul 19, 2018
  28. Junio C HamanoJul 20, 2018
  29. Jeff KingJul 20, 2018
  30. Junio C HamanoJul 20, 2018
  31. 0/4 fail compilation with strcpyJeff King, Jul 24, 2018
  32. 1/4 automatically ban strcpy()Jeff King, Jul 24, 2018
  33. Eric SunshineJul 24, 2018
  34. Jeff KingJul 26, 2018
  35. 1/4 automatically ban strcpy()Jeff King, Jul 26, 2018
  36. Junio C HamanoJul 26, 2018
  37. Jeff KingJul 27, 2018
  38. Junio C HamanoJul 27, 2018
  39. Jeff KingJul 28, 2018
  40. 2/4 banned.h: mark strcat() as bannedJeff King, Jul 24, 2018
  41. 3/4 banned.h: mark sprintf() as bannedJeff King, Jul 24, 2018
  42. 4/4 banned.h: mark strncpy() as bannedJeff King, Jul 24, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.